• ベストアンサー

アルゴリズムについて

あるプログラミングのテストでソートのアルゴリズムを書けというお題が出ました。 残念ながらアルゴリズムをいちいち覚えていなかったので回答を書けなかったんですが、皆さんは例えばクイックソートのアルゴリズムを書けと言われたら書けますか? やっぱり覚えておくべきなんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.1

アルゴリズムという言葉は意味は分かりますが これといった記法が存在するものではないですね。 プログラムもアルゴリズムを示すためのひとつの記法と言うこともできますし。 質問はフローチャートのことをおっしゃっているのかと思います。 いまいち質問の意図が見えにくいですが、質問に答えますと >皆さんは例えばクイックソートのアルゴリズムを書けと言われたら書けますか? はい、私は書けます。 >やっぱり覚えておくべきなんでしょうか? 覚えておくにこしたことはないと思いますが 暗記という意味だとすればフローチャートをわざわざ丸暗記する必要はないと思います。 要件だけ覚えて、後は自分の頭だけで考えながら書けるようになればそれで十分です。 要件というのは、例えばクイックソートで言えば 「軸要素をひとつ決め、軸要素を中心に残り左右に振り分ける。  後はこれを同様に繰り返す」 といったような内容のことです。 この要件だけを頭に思い描いてフローチャートが書けるようになる必要はあると思います。 当たり前のことですが、プログラムは提出された仕様通り動くように作らねばなりません。 クイックソートは非常に有名な並べ替えのアルゴリズムなのですでに解答はこの世に存在しますが 仕事では大抵の場合、答えは存在しません。 要求された仕様から、どうやって実現するのか、自分自身で考え アルゴリズムを考え出さなければなりません。 ましてや、クイックソートを書けるプログラマーはこの世にごまんといますし、 クイックソートひとつできたところで一銭にもなりません。 先は長いですね、がんばってください。

ran0441
質問者

お礼

回答が遅れてしまい申し訳ありません。 なるほど、要件だけ覚えて応用できるようにすれば良さそうですね。 実務でも調べれば済みそうですし。 ありがとうございました。

その他の回答 (5)

回答No.6

>やっぱり覚えておくべきなんでしょうか? テストで出る範囲ということで、点数を取りたいなら、少なくともこういうものがあって、大まかにこういうことをするものだという程度は覚えておくべきでしょう。 実務でどうかというと、○○ソートというものがあるということだけ覚えていればどういうアルゴリズムなのかということは調べればすぐ分かることですから、あえて”前向きに覚える”ほどのことはない事だと思いますけどね。

ran0441
質問者

お礼

回答が遅れてしまい申し訳ありません。 論理は覚えつつ、必要時にはその論理を元に作れる程度の力が要るなぁと思いました。 実務では結果が全てだから、調べて作ってテストが通ればOKってな感じですかね。 すっきりしました。 ありがとうございました。

回答No.5

職業プログラマー、趣味もプログラミングですが、 >クイックソートのアルゴリズムを書けと言われたら書けますか? 書けません。 書けなくても調べる力があればまったく問題ないでしょう。 車輪の再発明、ということわざもあります。 もしかして、出題の意図は、いくつかあるソートのアルゴリズムの 名前を書け、ってことだったりしませんか?

ran0441
質問者

お礼

回答が遅れてしまい申し訳ありません。 意外にも職業プログラマの方が書けなかったりするんですね? 確かに調べれば分かる範囲であれば、覚える必要はなさそうですね。 でも、書けないと自分のプログラミング力がつかないような気もします。 いずれにせよ回答ありがとうございました。

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.4

どのようなアルゴリズムでも覚えておくのに越したことはないですが、必ずしもそらで書ける必要はないと思います。 重要なのは、アルゴリズムを細部まで丸暗記することではなく、特性・特徴を把握し、直面した問題を解決するためのアルゴリズムを適切に選択できることではないでしょうか。 実際にアルゴリズムを書く(プログラミングする)際には、書籍を見るなりネットで調べるなりして書ければ問題ないと思います。 テストなどの場合は覚えておかないといけないでしょうけど…。 ただ、クイックソート程度であれば、何も見ずに書けても良いレベルだとは思います。

ran0441
質問者

お礼

回答が遅れてしまい申し訳ありません。 アルゴリズムの論理内容は理解しつつ、書けと言われたらその論理を元に作ればよいって考えると気が楽になりました。 ありがとうございました。

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.3

トランプカードを使って実際にやってみるのが良いかと。 忘年会でやると受けるかも・・

ran0441
質問者

お礼

回答が遅れてしまい申し訳ありません。 ソートのことなど考えたことがない人には目から鱗かもしれないですね。 この場合、いくつかのソートタイプを使ってどれが一番速くソートできるかってやるといいのかな。 ありがとうございました。

回答No.2

>クイックソートのアルゴリズムを書けと言われたら書けますか? 書けますが、使う言語にもよるでしょうね。 Pascalで書け、なんて言われたら「出来ない」って言うかも(笑)。 配列が扱い易い言語だったらそれ程難しくないかもな、とは思います。 >覚えておくべきなんでしょうか? 分かりません(笑)。プロの人はどう言うだろ? ただ、ちょっとした問題で「マトモに考えると詰まりそう」なんて場合は、アルゴリズムが必要かもな、とは思います。 大体のケースでは「著名なアルゴリズム」って数学由来なんじゃないのかな、とは思いますよ。もう「数学的定理」として定式化されている、と。 ですから、個人的には「言語の特徴」ってのは凄く大事で、「定理をそのまま置き換えられる」言語の方がラク、ではありますね。一々「プログラミング言語の不自由な様式」であるとか、「繰り返しを書くのがメンド臭い」とか、配列弄るのがメンド臭い、とかそう言うのは嫌です(笑)。単純に「何も考えずに」数式をただ置き換えていけるだけの言語だったら楽ちん、です。

ran0441
質問者

お礼

回答が遅れてしまい申し訳ありません。 そうですね、アルゴリズムって数学の範囲ですよね。 数学は嫌いなので覚えたくなかったんですが、論理自体は覚えておこうと思いました。 ありがとうございました。

関連するQ&A

  • アルゴリズム系の問題知りませんか?

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

  • 探索・整列アルゴリズムのメリット・デメリットについ

    「コンピューターはなぜ動くのか?」の第5章の「アルゴリズムと仲良くなる7つのポイント」のところにて、主な定番アルゴリズムとして、 表5.1 主な定番アルゴリズム (1)ユーグリットの互除去 (2)エラトステネスのふるい (3)線型探索 (4)2分探索 (5)ハッシュ法 (6)バブル・ソート (7)クイック・ソート 上記のアルゴリズムがあり、そのアルゴリズムの用途には (1)最大公約数のアルゴリズム (2)素数のアルゴリズム (3)データ探索のアルゴリズム (4)整列のアルゴリズム 上記のアルゴリズムがありますが、(3)~(4)のアルゴリズムの用途においてのメリット・デメリット ・データ探索のアルゴリズム (3)線型探索 (4)2分探索 (5)ハッシュ法 についてのメリット・デメリット ・整列のアルゴリズム (6)バブル・ソート (7)クイック・ソート についてのメリット・デメリット これらを教えて頂けばと思っております。 よろしくお願いたします。

  • 定番アルゴリズムのメリット・デメリットについて

    定番アルゴリズムとして以下のアルゴリズムが挙げられますが、 (1)ユークリッドの互徐法 (2)エラトステネスのふるい (3)線型探索 (4)二分探索 (5)ハッシュ探索 (6)バブル・ソート (7)クイック・ソート ↑これらの各々のアルゴリズムのメリット・デメリットについてをそれぞれ教えてください。 よろしくお願いします。

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

    [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個のソートの中でやる必要のない処理を排除する工夫があるかもしれません。 問題が難しくなく、素人っぽくコード化できると思いますが、その分、非効率なところも放置されそうなので高速化できるコードの書き方があったら教えて頂きたいのですが。コードというよりアイディアだけ説明していただいても助かります。実際はフォートランになると思いますが。よろしくお願いします。

  • プログラマにとって「アルゴリズム」や「データ構造」の知識は必須ですか?

    最近の、いわゆるパッケージソフトウェアや、Webアプリケーションの開発においては、 必要なコンポーネントをインポートして部品を組み立てていくイメージで コードを書いていくというのが主流だと思います。 ほとんどのプログラミング言語には、すでに便利な関数やパッケージが用意されており、「アルゴリズム」や「データ構造」といった知識はあまり必要になりません。 例えば、データをソートしたい場合、クイックソートなどで自分で実装しなくても、すでにソート関数が用意されているので、その関数を使用すれば良いわけです。 そのような環境においても、プログラマにとって「アルゴリズム」や「データ構造」の知識はやはり必須ですか? 時々、 ・「優先順位付き待ち行列」くらいは、スラスラ実装できなければ、プログラマとしては半人前 ・「離散数学」をしっかり理解していないと、プログラマとしては致命的 などという話も聞くのですが、皆さんの意見を聞かせてください。

    • ベストアンサー
    • Java
  • アルゴリズムについて

    「手作業によるソート」がレポートの課題として出されました。 「手作業のために効率的なアルゴリズムを考えて提案して分析しなさい」 条件は次の通り: 資料がそれぞれ A4 の紙一枚。見やすい位置に10桁の番号が書かれている。その番号の昇順にソートする。番号の分布については一切不明。二つのケースを想定: 1) 一人で資料5000枚をソート; 2) 20人で資料50000枚をソート。二つのケースに使えるアルゴリズム一つ、又は両ケースに使えるアルゴリズム一つでもよい。分析では O() での計算量 (理由つき) と実際に想定される時間。今まで習ったアルゴリズムとの類似点や相違点、手作業の特徴に考量した点などについても論じる。 何をすれば良いのかが分かりません。少しでも作業の道筋を示していただければ幸いです。 よろしくお願いします。

  • アルゴリズムの問題なのですが、マージソートとクイックソートについて教え

    アルゴリズムの問題なのですが、マージソートとクイックソートについて教えてください。 数列の(21 99 38 22 15 6)をマージソートで並び変えて、クイックソートでも並び変えたいのです。 マージソートで並び変えた手順は (21 99 38 22 15 6) (下矢印) (21 99 38)(22 15 6) (下矢印) (21 99)(38)(22 15)(6) (下矢印) (21)(99)(38)(22)(15)(6) (下矢印) (21 99)(38)(15 22)(6) (下矢印) (21 38 99)(6 15 22) (下矢印) (6 15 21 22 38 99) となりました。 この時、分割回数と統合回数がともに5なのですが、どう見たら5回なのでしょうか。 分割回数は3で統合回数も3ではないのでしょうか? クイックソートの方なのですが、 回答は (21 99 38 22 15 6) (下矢印) (15 6)(21)(99 38 22) (下矢印) (6)(15)(21)(22 38)(99) (15と38にした場合) (下矢印) (6)(15)(21)(22)(38)(99) となっていて、 最も効率のよいピボットを選択した場合分割回数は3となっています。 私がやってみたところ (21 99 38 22 15 6) (下矢印) (15 6)(21)(99 38 22) (下矢印) (6)(15)(21)(22)(38)(99)  (15と38を選んだ) これではいけないのでしょうか。 長くなりましたが、よろしくお願いします。

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

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

  • 量子アルゴリズムについて

    今、量子アルゴリズムの代表として挙げられているGroverアルゴリズムがあるのですが、そのアルゴリズムのプログラミングを作るのに手間取っています。 わがままなお願いですが、Groverアルゴリズムのプログラミングを教えてください(または、そのプログラミングをください。)。 それが無理ならば、プログラミングのヒントを教えてください。 P.S.努力が足りないと思はれるかもしれないが、提出期限まで残り2か月なのでなんとかしたいです。おねがいします。

  • 文字列をソートする方法

    数値をソートする方法にはバブルソートやクイックソートなどがあり アルゴリズムは分かるのですが 文字列を五十音順にソートしたい場合にはどのようにしたら良いですか? 検索をかけてみたのですが、大抵プログラミング言語に備わったsortの方法が紹介されており 自分で処理を行う方法については書かれていません。 ExcelのSort機能を使わない方法で教えてください。