みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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

目的に沿うように、いくつかの単純な命令を組み合わせているものですよね?

リニアサーチや、バイナリサーチなどの アルゴリズムの型のようなものがありますが、
目的に沿えば、自分で命令を組み合わせアルゴリズムを作ることは可能でしょうか?

投稿日時 - 2019-05-17 12:14:28

QNo.9617394

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(7)

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

投稿日時 - 2019-05-21 10:45:50

ANo.6

既存のアルゴリズムを組み合わせるのではなく、独自に組みあげるという意味なら、YES。

既存のアルゴリズムが、複数のアルゴリズムの組み合わせに向かないのは、組み合わせられるとしても、アルゴリズムはたいてい何かに特化した作りになっているために、利点を発揮できなくなる。

戦車の頑丈さに、翼をつけても、飛べはしなくなるという事。

条件によって、アルゴリズムを選択するなら、アリだと思うよ。

投稿日時 - 2019-05-21 00:09:45

ANo.5

 アルゴリズムというのは、計算処理をおこなって結果を出すまでの処理工程の理論で、たとえば、XとYを加算してX+Yの解を表示するというようなものです。OSもゲームも全てアルゴリズムがあります。アルゴリズムがわかっていないとソフトは作れません。

 単純な命令の組み合わせでプログラムが作られているのは事実ですが、今のパソコンのCPUは命令の処理過程が複雑な命令も存在します。例を挙げますと、以下のようなものです。

 ADD EAX,CS:[EBX*4+ESI+LABEL1]

 これはEAXの値にLABEL1アドレス上に並んでいるテーブルの値から、EBXの値の4倍のインデックススケーリングとESIの値を加算した値をオフセットとしてテーブル上の数値を読み出してEAXに加算するという意味で、これよりもずっと複雑な命令もあります。

 実際にプログラムを書いていれば、自然に身に付きますが、今のCPUは必ずしも単純な命令ではありませんし、C言語は命令語が長くて覚えにくいので、途中で投げ出しました。

投稿日時 - 2019-05-17 20:31:55

ANo.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倍以上速く抽出処理することが出来ます。

つまるところ、成果を得る為以外の無駄で時間のかかる処理の発見・見直し(操作方法も)が最も効果的で、演算効率を上げるのは次課題とした方がいい(アルゴリズムの)プログラムとも言えます。

投稿日時 - 2019-05-17 14:14:13

ANo.2

> 目的に沿えば、自分で命令を組み合わせアルゴリズムを作ることは可能でしょうか?

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

投稿日時 - 2019-05-17 12:33:33

ANo.1

定義は別として、現在の意味としては「ある問題を解決する方法の一つ」という意味ですので、自分で作るということももちろんあり得ますが、一般的には「みんながよく目にする基本的な問題」をどのように解決するかのお話になりまして、自分で作る前にすでに誰かが作って名前を付けているでしょう

たぶんアルゴリズムについて理解されていないと思いますので、もう少しアルゴリズムについて勉強をされるとこの質問が何を聞きたいのかよくわからないということが理解できると思います

投稿日時 - 2019-05-17 12:21:50

あなたにオススメの質問