• 締切済み

アルゴリズム開発における留意点

新製品のアルゴリズム開発をされている方などにお聞きしたいのですが、アルゴリズムを開発する際の留意点というか、どのようなことに気を使って開発をされているのか、教えていただけませんでしょうか(特定言語を想定しないとか、ユーザ数の依存性も考慮するとかといった類のものです)。 また、そのような「アルゴリズム開発のいろは」のような指南書がありましたら、ご紹介ください(既存アルゴリズムそのものの解説書ではありません)。 あまりうまくお伝えできずにすみませんが、よろしくお願いします。

  • aneja
  • お礼率93% (379/405)

みんなの回答

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

アルゴリズムを新しく開発することはめったにありません。 たいていは問題を定式化して分解し、既存のアルゴリズムの組み合わせで解けるようにするのが、開発の実態です。 まずは解くべき問題を明確にする。制約条件を含めて。

aneja
質問者

お礼

すばやいご回答をありがとうございました。素人考えですが、問題を定式化するところに開発者のオリジナルのアイデアが反映されるのだと思っていました。確かに、なにもかも自分で作り出すようなことはないのでしょうね。制約条件とおっしゃっているのは、解こうとしている問題の制約+利用する既存アルゴリズムの使用条件(?)というようなものということでよろしいのでしょうか。ちょっと漠然としていて、未経験の自分にはよくわからないところがあります。

関連するQ&A

  • データ構造とアルゴリズム

    C言語の勉強をしているんですが最近はアルゴリズムについての勉強をしたくAmazon等で検索しています。 現在手持ちの本ではCのプログラムの解説(書き方)が主でアルゴリズムについての解説がとてもすくないです。 やっぱりCのソースがあったほうがいいのですが、詳しく解説(証明)している本が欲しいです。 お勧めの本がありましたら紹介してください。

  • アルゴリズムのご相談

    はじめまして DHCPのような動作をするアルゴリズムを考えている最中なのですが… その案の中でどうしてもクリア出来ない課題があります。 「配列で作られたテーブルにユーザ名の一覧があり、 そのユーザ名をキーワードとして配列のインデックスを抽出したい」 というもので、これだけなら簡単なのですが、以下3つの条件の提示により、無理ではないかと思えて仕方がないです。 ・ユーザ名は何らかのルールに則って作られた文字列ではない。 ・キーワードを頭から順に比較して探していく方法を使ってはいけない。 ・ユーザの追加・削除がある度にソートし直さなければならないような構造にしてはいけない。 2分探索法などの検索回数を減らす方法はソートされてることが前提条件ですし、 ユーザ名から配列のインデックスに使える数値に変換できるような都合のいい関数なんて存在しないように思えるのですが、いかがでしょう? ちなみに開発言語はCです。

  • 顧客データベースの開発環境の選択について教えてください

    現在、ある特定業界向けに顧客管理と営業支援を兼ねたパッケージソフトを企画しております。パッケージソフト開発ははじめての経験でお尋ねします。 ユーザーが使用するレコード数は最大で5万件程度と考えております。 想定 販売価格 30万円程度、年間販売想定数 50本くらい 使用するユーザー LAN環境で使用することを想定 5~10名/パッケージ その場合、いくつか選択枝があるのですが、どれを選んでいいのかもうひとつわかりません。以下のような選択枝があると思うですが、特にパッケージソフトの開発の観点から教えていただくと助かります。 ■選択枝1 データベースソフトオンリーで開発 ●アクセスやファイルメーカーで開発 その場合配布に問題がでそうです ■選択枝2 DBソフト+SQL系DBで開発 例 access + MYSQL or PostgreSQL or SQL sever ■選択枝3 プログラミング言語 + +SQL系DBで開発 例 VB + access(DBのみ) この場合どのような組み合わせがよいのか? ソフト開発のプログラミング言語は、delphiがよいという話も聞いております。 DBについては、コストを抑えたいので、オープンソース系のDBやaccessでどうかな?と思ってします。 以上ご教示いただけます様お願い申し上げます。

  • 乱数の順位付けのアルゴリズム

    [0,1]の範囲で乱数を1000個、配列に発生させて、小さいもの100個を選び出すアルゴリズムということを考えます(知りたいのは数値と配列番号、むしろ配列番号が大事)。まず想定できるのはソートですが、それにもいろんなものがあり、クイックソート、バブルソートなどが挙げられます。ソートのアルゴリズムは既に開発されつくしたのかもしれませんが、どのようになっているでしょうか。一番高速な(かつ間違いない)な方法が1つあればそれを採用したいのですが。 そして1つ厄介なのですが、そのトップ100個以外の900個はソートする必要がないということです。私が考えているアルゴリズムは、 1.既に100個の選ばれていると仮定(初期はすべて1) 2.新しい1個が来たとき、100個の最低値よりも小さいなら考慮の対象なのだから最低値を交換してその100個でソートする。そうでない場合は何もしない。 3.次の新しい1個を調べて、項目2をする。 4.発生させた1000個でそれを繰り返す。 このアルゴリズムだと100個のソートを何百回かぐらいやることになります。 これをするぐらいだったら1000個のソートを1回やればいいということになるでしょうか(不必要な残りの900個もソートされてしまう)。あるいはその1回の1000個のソートの中でやる必要のない処理を排除する工夫があるかもしれません。 問題が難しくなく、素人っぽくコード化できると思いますが、その分、非効率なところも放置されそうなので高速化できるコードの書き方があったら教えて頂きたいのですが。コードというよりアイディアだけ説明していただいても助かります。実際はフォートランになると思いますが。よろしくお願いします。

  • 開発言語について

    開発言語について、現在vb6にて開発された基幹業務が VISTA等のクライアントで一部動作検証がとれなくなってきております。 今後のクライアントOSを考慮し、基幹業務の再構築を検討しております。 そこで開発言語を.NETでいくかJAVAで開発するか迷っております。 それぞれの利点と弱点があるかと思いますが私には双方の知識が乏しく 皆様からの意見を伺いたく投稿いたしました。 開発工数・アプリ起動時間・動作スピード等の比較がわかりますと助かります。 また、開発ツールのお勧め情報がありますたらご助言をお願いします。 運用環境は専用線(20MB)で結ばれたデータセンターのサーバーと データベースがあり、アプリケーションは社内にて運用してます。 EDIにて特定取引先に対してVPNにてデータ配信をしております。

  • 仮想メモリでない環境でのmalloc freeのよいアルゴリズムを教えてください

    ゲーム機の開発をしています。 仮想メモリがないので、mallocとfreeを不定の順序で繰り返しているとヒープ領域が断片化し、そのうちにメモリは不足していないはずなのにmallocできなくなります。ゲーム機のSDKにはそういうことを想定しているのか malloc、free の代替関数を設定できるようになっています。そこで、代替関数を用意しようと考えていると考えています。 完全に断片化をさけるには、mallocした逆順にfreeするとか使い方の工夫をしないと無理とは思いますが、通信系のライブラリにの内部などでmallocしていたりして完全にはこちらの思うとおりにはできません。テクスチャーなどの常駐でなるべく多くのメモリを使いたいので、ヒープ領域はできるだけ小さくすませたいのです。どんなアルゴリズムでも、ある程度の断片化はさけられないと思いますが、malloc、freeのよいアルゴリズムが紹介されているところがありましたら、御教えください。使われ方との相性があると思いますので、複数のアルゴリズムが紹介されていればうれしいです。

  • アルゴリズム 木構造のパス表示

    下記のような入力データを出力データのように出力させたいのですが。 アルゴリズムを教えて頂けませんでしょうか? 言語は特定の言語でなくても構いません。 日本語で雰囲気が解ればそれに越したことはありません。 もし、特定の言語で記述頂ける場合、 (言語依存の特殊な表記方法を避けて頂けるとたすかります(知識が浅いため)。 但し言語依存の関数等は引数と戻り値の説明を入れていただけたら可です。 (勘違いしそうなので) トリッキーな書き方を避けべたな平書きでお決まりの処理部分は関数 で省略みたいな感じだとありがたいです(見やすいため)。 ※元データ生成データ共に、見た目のままのテキストデータです。 //入力データ例(階層等やパターンは決まって無いことが前提) 親 ├子1 ├子2 │├孫1 │└孫2 ├子3 │ └孫3 │   ├ひ孫1 │  └ひ孫2 └子4 //ここまで //出力データ 親\子1 親\子2 親\子2\孫1 親\子2\孫2 親\子3 親\子3\孫3 親\子3\孫3ひ孫1 親\子3\孫3ひ孫2 親\子4

  • クイックソートしながら重複要素削除アルゴリズム

    アルゴリズムが苦手な上、アルゴリズム解説自体C言語ベースで書かれ ている物が多く処理のイメージが沸かずクイックソートもコピペや既存 の関数で処理していて、満足に理解出来ていないのですが。 以下の問題を、お解かりになるかた教えて頂けませんでしょうか? ■問題 2万件位の数値データの中から重複要素を削除しながら昇順または降順で、 ソートするアルゴリズム(※1) ■条件 BASIC的(※2)な記述やプログラム中のコメントなどの形式でも構いま せん出来るだけ簡単に示して頂けると助かります。 補足 (※1)ソートする際、重複要素を消すともっと処理が早くなるのではと 思ったので。 目的は、処理の速さを求める事と、次回から応用が聞くよ うにソート自体を理解したいのでクイックソートで無くても構いません。 (※2)実際に動かなくても構いません、イメージが掴みやすい方が良いと    いう意味でとって下さい。

  • SHARP brain 用ソフト開発方法について。

    SHARP brain がwindows CE で動いていることを知り、brain用のソフトを作りたいと思ったのですが、開発環境が見つかりません。 開発環境はなにを使うといいでしょう。 C言語で作りたいのですが、windowsプログラミングと同じ感覚で作れるものなのでしょうか。できればDXライブラリを使用して作りたいと思っています。 知っている方助けてください。 できれば解説サイトなども紹介して頂きたいです。

  • 文字の上下反転処理

    CやC++ に限った質問では無いのですが、申し訳ありません。 ■質問 各プログラミング言語からの汎用利用が出来る文字ベースの将棋の駒のデータを作成したいのですが、最も目的に合った良い方法はないでしょうか? ■例 将棋で使われる「歩」などの略称の一文字の上下反転を行うアルゴリズム若しくは反転済みのデータなど。 ■必須要件 プラットフォームは固定でも良いが、利用言語に依存しない技術を使いデータが独立した形で少なくとも2つ以上のプログラム言語から利用できる。 元になる技術の著作権の問題など余り考えずに、再配布出来る。 ■開発環境など ・開発OS:クライアント=WINDOWS-XP サーバー=Linux ・開発言語:現段階では不特定で未定(なるべく簡単な言語)。 ・作り方:言語依存の低い各種API、DLL、PHPなどの既存するデータや技術の流用か自作 ・駒データの利用形態:P2Pや中央サーバ型でクライアント側またはサーバ側または双方での利用。 ■現在素人発想で考えている事 自作フォントで作成できないか? win-APIなどで文字反転処理できないか? 既成のPHPプログラムなど探してWEB上で実装できないか? ■お願い 考えている事をやればよいじゃないかと思われるかもしれませんが。 技術的に可能か不可能かも解らず実装後の問題、利用時における長所 短所も解らず。もっと良い処理もあるかもなどと思い。 漠然と、何から手をつけて良いかわからず悩んでいる状態ですのでご考慮お願いします。