• 締切済み

プログラミングにおけるアルゴリズムって、

プログラミングにおけるアルゴリズムって、 目的に沿うように、いくつかの単純な命令を組み合わせているものですよね? リニアサーチや、バイナリサーチなどの アルゴリズムの型のようなものがありますが、 目的に沿えば、自分で命令を組み合わせアルゴリズムを作ることは可能でしょうか?

みんなの回答

回答No.7

大風呂敷をひろげた哲学的な説明をさせて頂きます。 アルゴリズムの発想は20世紀の文明科学進展の大きな特徴の一つであります。 それは、何かを解析分析する場合、その何かをこれ以上細分化できない要素的なものにしてさらに再構築するという方法論の席巻であります。 代表的なものに物質を分子にまで分解し、元素が発見され、すべての物質がこの元素の化合物であることが、論証及び実証されました。既に宇宙には未知の元素は存在しません。 同様に、アルゴリズム(操作)というものも、これ以上分解できない最小限の操作の単位に分割し、その要素を組み合わせればあらゆるアルゴリズムの構築が可能であるというのが、今のコンピューター理論の根源にあります。 その最小限の操作とは論理演算命令です。しかし、実際の仕事では、論理演算のみを用いてプログラミングすることはありませんが、考え方として大切なものです。また、操作の単位を順序処理、判定(IF-Then-Else),繰り返し(DO-While)のみに絞ってプログラム仕様を作る方法をストラクチャードプログラミングと言います。 要するに、すべてのアルゴリズムは基本的な操作の組み合わせによって構築可能なのですわ。

noname#247825
noname#247825
回答No.6

既存のアルゴリズムを組み合わせるのではなく、独自に組みあげるという意味なら、YES。 既存のアルゴリズムが、複数のアルゴリズムの組み合わせに向かないのは、組み合わせられるとしても、アルゴリズムはたいてい何かに特化した作りになっているために、利点を発揮できなくなる。 戦車の頑丈さに、翼をつけても、飛べはしなくなるという事。 条件によって、アルゴリズムを選択するなら、アリだと思うよ。

  • SPROCKETER
  • ベストアンサー率26% (2030/7579)
回答No.5

 アルゴリズムというのは、計算処理をおこなって結果を出すまでの処理工程の理論で、たとえば、XとYを加算してX+Yの解を表示するというようなものです。OSもゲームも全てアルゴリズムがあります。アルゴリズムがわかっていないとソフトは作れません。  単純な命令の組み合わせでプログラムが作られているのは事実ですが、今のパソコンのCPUは命令の処理過程が複雑な命令も存在します。例を挙げますと、以下のようなものです。  ADD EAX,CS:[EBX*4+ESI+LABEL1]  これはEAXの値にLABEL1アドレス上に並んでいるテーブルの値から、EBXの値の4倍のインデックススケーリングとESIの値を加算した値をオフセットとしてテーブル上の数値を読み出してEAXに加算するという意味で、これよりもずっと複雑な命令もあります。  実際にプログラムを書いていれば、自然に身に付きますが、今のCPUは必ずしも単純な命令ではありませんし、C言語は命令語が長くて覚えにくいので、途中で投げ出しました。

  • chachaboxx
  • ベストアンサー率23% (412/1777)
回答No.4

質問内容でサーチを例えにされていましたので、類似する例としてソートに関するアルゴリズムが記載されたHPがありましたので、ご参考までに。 http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/top.html アルゴリズムを作るというよりは、ご自身のプログラムでよく使う一般的でない処理用の関数を作って自分用のライブラリにすることはプログラマーではよくあります。 アルゴリズムというのは、命令の組み合わせ方というよりは、目的への辿り着き方であって、プログラミングする前から必要な考え方です。その方法に対してどのような命令を組み合わせるかというのは、最適化とかではないでしょうか。 実際はコンパイラなどが、設定に基づき最適なCPU命令セットを生成してくれるのですが、強者は自力でアセンブラ編集したりされてます。 昔言われていたのは、例えば 2×3 とするより 2+2+2 の方が処理が早い 浮動小数演算より実数演算が早い 変数参照よりポインタ参照が早い 等々。 昨今ではPC(CPU)がクソみたいに速いので、個人レベルのプログラミングでは試行錯誤して命令の組み合わせを考えてもあまり処理速度に体感的な変化はないかもしれません。※処理速度を10倍速くできたとしても1/10秒が1/100秒に短縮されるようなことです。 それよりも、計算方法や内容自体を検討した方が劇的な効果が得られる場合があります。例えば、CGで使われる光線計算(レイトレース)などでは、再描画するたびに全オブジェクトに対して再計算するのではなく、見えていない陰になっているるオブジェクトの計算は除外したり、画面解像度に応じた必要なオブジェクト数のみに対して計算するようなことでしょうか。コツはその処理範囲を厳格に求めるのではなくざっくりで済ますことです。 違うケースでは、例えば、ファイルからデータを取り出す処理をする場合、予め抽出要素や内容がわかっているなら、ファイル保存の時にデータ内容の目安になる様なファイル名にしておけば、どんな内容かわからない数ギガバイトのファイルを何百個も開いて閉じてすることなく、対象となる数百メガバイトクラスのファイルを数個開けば済むので、1000倍以上速く抽出処理することが出来ます。 つまるところ、成果を得る為以外の無駄で時間のかかる処理の発見・見直し(操作方法も)が最も効果的で、演算効率を上げるのは次課題とした方がいい(アルゴリズムの)プログラムとも言えます。

  • okwavey2
  • ベストアンサー率15% (251/1593)
回答No.3
  • f272
  • ベストアンサー率46% (8021/17145)
回答No.2

> 目的に沿えば、自分で命令を組み合わせアルゴリズムを作ることは可能でしょうか? 普通は自分でアルゴリズムを決めるでしょう。 そして,もしそれが一般的なものであれば,リニアサーチやバイナリサーチのように,すでに誰かが思いついていますから,それを使います。自分の問題に特有のアルゴリズムというのはほんの一部だけで済み,すでにあるアルゴリズムの組み合わせで解決できることが多いですね。

  • agehage
  • ベストアンサー率22% (2555/11363)
回答No.1

定義は別として、現在の意味としては「ある問題を解決する方法の一つ」という意味ですので、自分で作るということももちろんあり得ますが、一般的には「みんながよく目にする基本的な問題」をどのように解決するかのお話になりまして、自分で作る前にすでに誰かが作って名前を付けているでしょう たぶんアルゴリズムについて理解されていないと思いますので、もう少しアルゴリズムについて勉強をされるとこの質問が何を聞きたいのかよくわからないということが理解できると思います

関連するQ&A

  • プログラミング設計思想をどうやって独学?

    2chまとめサイトで、「プログラミングの勉強をを始めたい。どの言語がお勧め」という質問があると、 「プログラミング言語をおぼえるよりも、どの言語でも通じる設計思想やアルゴリズムを勉強したほうがいい」などという回答がよく見られます。 私はwebプログラミングの勉強をして、ブログを一から自分で作って見たいと思っているのですが、 どうやったらその設計思想、アルゴリズムを独学できるでしょう?

    • ベストアンサー
    • CSS
  • アルゴリズム系の問題知りませんか?

    再来週大学院試験を控えている者です。 入試の項目に「プログラミング(アルゴリズム)」と書いてあり、ある程度複雑なアルゴリズムを考えるような問題が出る事が予想されます。 きっと二分探索木やクイックソートのような問題が出るように思います。 アルゴリズムを考えるような問題としていい問題ご存じないでしょうか? アルゴリズムを考えるような問題としてはハノイの塔とかよいように思いますが ちょっと入試の問題としては出ないような気がします。 自分では他に線形リストやスタックなども勉強したんですが、 C,JAVA,Pascal,フォートランなどどの言語で回答してもよい事になっているので言語に限定した問題は出ないように思います。 90分で解く3問あるうちのプログラムは1つですから30分以内に解けるような問題のはずです。 (出題される可能性も考えていただければ幸いです)よい問題をご存知でしたら教えてください。 よろしくお願いします。

  • 実践的な遺伝子的アルゴリズムの作成法

    素人ですが、遺伝子的アルゴリズムを考える上で、大きな問題に直面しています。 1)最適化の対象を如何にコーディングするか? 2)交叉点を如何に設けるか? これらは組合せの対象の要素間に何らかの曖昧な複数の相関関係がある場合に難しくなります。 そこで、 1)「遺伝子的アルゴリズム」をタイトルにした一般の技術系の和書に書かれている以外に、実例を調べる手段? 2)社会人が遺伝子的アルゴリズムの開発の実際を学ぶための公共の機関、例えば聴講生として学べる場所? 3)遺伝子的アルゴリズムを組み込んだソフトを作る上で、普段使用しているC++などの汎用プログラム言語と、SchemaやLISPなどの知能プログラミング言語とでは、どちらが便利なのでしょうか? これらの人工知能プログラム言語には、コーディングや交叉のための専用のコマンドが提供されているのでしょうか? 自分は、情報工学の出身ではないため、C++言語と「遺伝子的アルゴリズム」の技術書籍以外には、バックグラウンドがありません。よろしくお願いいたします。

  • どのプログラミング言語を学んだらよいでしょうか?

    プログラミングを学ぼうと思うのですが、いろいろあって どれを学べばよいかわかりません。 目的によって違うというのをよく聞くのですが、 正直言ってしまうと目的は特になく、なんでもいいから プログラミングができるようになりたいということです。 (もちろん極端に変な言語はいやですが。) このような場合はどの言語を学んだらよいでしょうか。 また、それに関してわかりやすい本などありますでしょうか。 ちなみに自分は全くの初心者です。

  • 遺伝的アルゴリズムの評価式に関する質問です。

    膨大な数の組み合わせから正解の組み合わせを求めるという大規模組み合わせ問題があったとします。 このような問題を遺伝的アルゴリズムを用いて解こうとしているのですが、今用いている評価式より良いアイデアが自分では考えつかなかったため質問します。 以下、問題や用いている遺伝的アルゴリズムに関する詳しい説明です。 例えば、仮に、23, 21, 65, 78, 43, 78, 83, 56, 78 ,89 の10個の数の組み合わせがあるとき、 合計して109になる組み合わせ(23,21,65)を見つけたいという問題です。(正解の組み合わせは複数個あっても、一個見つかれば良い。また正解の組み合わせは必ずあるものとする。) この問題を遺伝的アルゴリズム(GA)を使って解くとします。 以下、簡単なGAの説明です。 表現型に2進数ビット列を用いる。 個体数は200とし、初期個体はランダムで生成する。 評価式はf(x) = b/(b+|b-t|)(bは正解の組み合わせの合計値で、tは2進数ビット列で1を立てた場所の数の合計値である。)。終了条件はこの評価値がf(x)=1になることである。 交叉は一様交叉で突然変異も行う。 表現型について詳しく説明すると、 コード化に 0と 1の並びである2進数ビット列を用いて、 その場所に対応する数を加算する場合は1を, 逆に加算しない場合は0を遺伝子の表現型に立てビット列を生成しました。 例えば今回の正解の組み合わせ(109)を2進数ビットで表すと下のようになる。 23, 21, 65, 78, 43, 78, 83, 56, 78 ,89 1 1 1 0 0 0 0 0 0 0 ←2進数ビットを用いた表現型。 (1が立っている場所の数が加算されて合計で109となり、これが正解の組み合わせであることがわかる。) そして、この遺伝的アルゴリズムの評価式を f(x) = b/(b+|b-t|) とします。(bは正解の組み合わせの合計値で、tはビット列で1を立てた場所に対応する数の合計値である。) 評価式f(x)=1になる、つまり正解の組み合わせが見つかれば、遺伝的アルゴリズムは終了する。 この評価式で遺伝的アルゴリズムを回しているのですが、この簡単な評価式では近似解に陥ったとき、解を求めるのがどうしても遅くなってしまいます。 全体的に長く、わかりにくい説明で申し訳ないのですが、この評価式の改善案、またはこの遺伝的アルゴリズムの改善案などがあれば教えていただきたいです。 以上、よろしくお願いします。

  • アルゴリズムの勉強方法について

    お世話になります。 20年近く前に、初級シスアドに受かってはいるものの その後、ITから離れており、最近になって自己啓発の一環として 基本情報処理技術者の資格を取ってみたいと思っております。 当方、プログラミングの経験はありません。 昔と試験要綱も変わったようで、午後に出題されるという アルゴリズムの勉強方法について悩んでいます。 独学なので取りあえず「アルゴリズムを、はじめよう」という初心者 向けの本を読んでいるのですが、なかなか身についているのか否かが 実感できておりません。本を読んで「なるほど」とは思うものの、 白紙の状態から自分でアルゴリズムを書けるレベルには到底至って おりません。 即効性が出てこないのは、筋トレや外国語学習と似ているのかも しれないと思っているのですが、効果的な方法をとらないと、ただ 時間を無駄にしているだけになるのではないかと考えております。 そこで、アルゴリズムの効果的な学習方法について、ご教示 いただけると助かります。宜しくお願いいたします。

  •   プログラミング

      プログラミング  つまらない質問かもしれませんがお答え下さい。  自分は自分専用のOSをプログラミングして1からビル・ゲイツがやったみたいに作ってみたいのですが、それにはどうしてやったらいいか分かりません。別にマイクロソフト社に競合するのが目的ではないのですが、ビル・ゲイツの影を追ってみたいのです。どうしたらそれが出来るのでしょうか?またその事を詳しく解説した本があったら教えて下さい。よろしくお願い申し上げます。

  • コンピュータやアルゴリズムについて

    文系の大学生です。 今までプログラミングをインターネットのサイトや書籍で勉強していたのですが、最近になって ・サーバ ・アプリケーション ・ネットワーク ・データベース といった、プログラミングの裏で働くアルゴリズムやコンピュータの仕組みについて自分が知らないことに気がつきました。 大学では情報系の科目を履修して勉強もしたのですが、いわゆる「般教」科目なので、技術の深いところまでは勉強しなかったのです。 一応、C/SモデルやTCP/IPといった単語は知っており、単体ではある程度分かるのですが、それらの知識が有機的に繋がっていない気がします。 例えば、 「C/Sモデルでは分散処理によりサーバとクライアントが分けられる」 程度の理解ではなく、 「C/Sモデルでは分散処理ののとき、データベースがこうなり、ネットワークはこうなっており、TCP/IPはこうである」 といったように、有機的に理解したいわけです。 そこで、アルゴリズムやコンピュータの仕組みについて体型的に学べるサイトや書籍などがあれば、教えていただけると幸いです。

  • プログラミング学習の障壁

    プログラミング学習に関してのアンケート調査をしています。 このアンケート結果は卒業論文に使用いたしますので、 ぜひともご協力お願いいたします。 <質問> 質問1.構文に関する知識(for 等)を理解・習得することが難しいので、プログラミングは習得することが難しいと考えられますか? a.とてもそう思う    b.そう思う    c.あまり思わない    d.思わない 質問2.アルゴリズムを理解・習得することが難しいので、プログラミングは習得することが難しいと考えられますか? a.とてもそう思う    b.そう思う    c.あまり思わない    d.思わない 質問3.構文とアルゴリズムを同時に考えることが難しいので、プログラミングは習得することが難しいと考えられますか? a.とてもそう思う    b.そう思う    c.あまり思わない    d.思わない 質問4.指導者が自分の質問に対して解答してくれるまでにかかる時間に満足していますか? a.とても満足      b.満足   c.あまり満足ではない  d.不満 <解答方法> (例)1-a    2-c    3-c    4-b といった形式でお答えいただけるとありがたいです。 ご協力ありがとうございました

  • アルゴリズムは、たった3つの制御構造の組み合わせで記述することができることのハードウエアとからめた理解。

    すべてのアルゴリズムは、たった3つの制御構造の組み合わせで記述することができる。3つの制御構造とは、図1~3が示すような順次実行、分岐実行、繰り返し実行である http://www.rsch.tuis.ac.jp/~kitakaze/2008/flow.html とありますが、 以前、学生時代、教授がこれについて、ハードウェアとからめて説明していたのを 思い出します。 「ハードウエアを見ても、CPUがどうの、こうのだから、 順次実行、ハードウエアのここで分岐を実行して、 ハードウェアのここで反復実行をしている。だからソフトウエアとしてもこの3つの命令ですべてのアルゴリズムを記述できるわけだ」 というような感じの説明でした。 そのときは、なるほど深く理解しているひとは、アルゴリズムというソフトウエアと 回路、素子などによる構成物であるハードウエアと両方見て、合理的に説明する能力が あるのだなと感心しました。 その具体的なひとことは残念ながら思い出せませんので質問します。 ハードウェアとアルゴリズムが3つの指令(分岐、繰り返し、順次)ですべて記述できること の間の関係をうまく説明できる方はいますか? よろしくお願いします。