本からのアルゴリズム。


358

ポール・エルドスは、神がそれぞれの数学的定理の最もエレガントな証拠を保持している「本」について話しました。これは、本(現在は第4版になっていると思います):本からの証拠にも影響を与えました。

もし神がアルゴリズムに関する同様の本を持っていたら、どのアルゴリズムが候補者になると思いますか?

可能であれば、クリック可能なリファレンスと、それを機能させる重要な洞察も提供してください。

回答ごとに1つのアルゴリズムのみを入力してください。


11
いい質問です![編集:} 1つの質問。アルゴリズムとデータ構造の間に線を引くのはどこですか?アルゴリズムの重要な洞察がデータ構造と密接に関連している場合(たとえば、逆アッカーマン関数のUNION FIND)?
ロススナイダー

4
そのような本のための偉大なソースと多分候補は、「アルゴリズムの百科事典」ですspringer.com/computer/theoretical+computer+science/book/...
マルコスVillagra

21
私が非常に扱いにくいと考えているアルゴリズム(KMP、線形接尾辞配列)が他の人から「本から」と見なされていることに少し驚いています。私にとって、「本から」とは、簡単で明白なことを意味しますが、それは後知恵だけです。他の人がどのように「エレガント」と解釈するのか興味があります。
ラドゥグリゴール

49
@supercooldave神を信じる必要はありませんが、神の本を信じるべきです。;-)
ロススナイダー

10
1985年の講義で、エルデスは「神を信じる必要はないが、本を信じるべきだ」と言った。
ロバートマサイオリ

回答:


116

Union-findは美しい問題であり、その最適なアルゴリズム/データ構造(Disjoint Set Forest)はスパゲッティスタックに基づいています。インテリジェントな子供に説明するのに十分なほど単純で直感的ですが、実行時間に厳しい制約を課すには数年かかりました。最終的に、その振る舞いは逆アッカーマン関数に関連することが発見されました。これは、発見が計算についての視点の変化を示した関数です(実際、ヒルベルトのOn the Infiniteに含まれていました)。

ウィキペディアは、Disjoint Set Forestsの優れた紹介を提供しています。


109

Knuth-Morris-Prattストリングマッチング。これまでで最も滑らかな8行のコード。


4
それは、ある時点では明らかではなかったものであり、彼らがそれを思いついたので今だけ明らかになったことを理解するのはちょっと気が遠くなるでしょう...私たちはCarrの歴史理論を数学とコンピューターサイエンスに適用すべきだと思います。
リトウィックボーズ

1
説明によると、これはボイヤー・ムーアの高速部分文字列検索に関連していると思います。
バート

2
@Mechkoこのアルゴリズムが別々の人によって同時に独立して発見されたという事実は、ある程度明白であることを示しています。何かが「明白」であるかどうかは、プロジェクトの制約と広範なプログラミング環境の関数です。(1)高速テキスト検索および(2)真のO(n)アルゴリズムの重要性を認識している場合、および(3)以前に部分一致のテキストに遭遇した場合、および(4)時間がある場合「正しい」ことをするために、このアルゴリズムはおそらく明らかです。
マットギャラガー

インタビュークヌースは、アルゴリズムのためのアイデアは、スティーブン・クックの勉強から来たと言った双方向有限オートマトン回文のために。
カベ14

@Kaveh元のKMP論文のセクション7(歴史的注釈)をお読みください。素晴らしい発言があります。Morrisが「システムの他の実装者が理解するには複雑すぎた」テキストエディタを作成することについて。Knuthについて「Knuthの経験で初めて、オートマトン理論が彼に以前の問題を解決するよりも実際のプログラミングの問題を解決する方法を教えてくれた」。そして、「クヌースは、クックの定理を知らずに、モリスがすでにアルゴリズムを発見したことを知って悔やまれました。」楽しい。
ヘンドリック

93

並べ替えられていないリストのk番目の要素を線形時間で見つけるためのBlum、Floyd、Pratt、Rivest、およびTarjanのアルゴリズムは美しいアルゴリズムであり、数値がマスター定理にちょうど適合するためにのみ機能します。次のようになります。

  1. 5つの要素の各シーケンスを並べ替えます。
  2. それぞれの中央値を選択します。
  3. このリストの中央値を見つけるために繰り返します。
  4. 中央値の中央値でピボット(クイックソートなど)
  5. リストの適切な側を選択し、そのリスト内に配置して、繰り返します。

3
これは私のお気に入りのアルゴリズムの1つです。Chazelleの不一致の本から学んだ直観が好きです要素のグループの中央値のセットは、入力番号の順序付きリストの間隔の -netのようなものです。したがって、アルゴリズムは一般的なパラダイムに従います。正​​確な解が得られるまで、 -netを高速で計算し、ネット上の問題を解決し、入力の一部を再帰して解を絞り込みます。それは非常に有用なテクニックですϵ ϵ1/ϵϵϵ
サショニコロフ

5
ところで、グループのサイズをパラメータ化すると、定数はそれほど魔法ではありません。もちろん、それらはマスター定理で正しいことを与えるために最適化されています
サショニコロフ

Ruby実装、gist.github.com / chadbrewbaker / 7202412(定数、ログ)スペースを使用するアルゴリズムのバージョンはありますか、または中央値を保持するために線形スクラッチスペースを使用する必要がありますか?
チャドブルーベーカー

2
「これは、数がマスター定理にちょうど適合するためにのみ機能する」という主張は、本当ではありません。数値をより大きい数値に置き換えると、合計が未満になる必要がある2つの数値がと収束するため、十分に大きいすべて機能することがわかります。は最初に機能する数字であり、唯一の数字ではありません。nは1 3 / 4 0 N 55n13/40n5
ウィルサウィン

88

バイナリ検索は、私が今まで遭遇した中で最もシンプルで美しく、便利なアルゴリズムです。


エレガントを直感的に置き換えます。それについてエレガントなものは何もありません。そのシンプルさが本当の美しさです。
ロバートマサイオリ

@Robert Massaili:エレガントを美しいものに置き換えました。あなたはそれについて正しかった。
michalmocny

2
そして、正しく書くのはめちゃくちゃ難しいです
ジョン

私の最初の大学院のアルゴリズムコースでは、15分のクイズがあり、2〜3の問題を手作業で解決する必要がありました。このような最初のクイズには、バイナリ検索ツリーとヒープに関する2つの質問が含まれていました。約30人のクラスに2つの正解があると言われる前に、バイナリ検索の問題を間違えたことを知って、私は恥ずかしくてがっかりしました。しかし、それを知っていても、プロのコミュニティが正しくなるのに15年かかったという事実は驚異的です。
ステラバイダー

84

ここで、すべてのペアの最短パスのFloyd-Warshallアルゴリズムが表示されないことに驚いています。

d[]: 2D array. d[i,j] is the cost of edge ij, or inf if there is no such edge.

for k from 1 to n:
  for i from 1 to n:
    for j from 1 to n:
      d[i,j] = min(d[i,j], d[i,k] + d[k,j])

最短で最も明確な非自明なアルゴリズムの1つであり、エッジがある可能性があると考えると、パフォーマンスは非常に速くなります。それは、動的プログラミングのポスターの子になります!O n 2O(n3)O(n2)


2
このアルゴリズムは、非常にきれいな方法で一般化することもできます。例:r6.ca/blog/20110808T035622Z.htmlおよびcl.cam.ac.uk/~sd601/papers/semirings.pdf
ミハイルグルセンコフ


73

(特に他の回答と比較して)多少些細なことのように思えるかもしれませんが、Quicksortは本当にエレガントだと思います。私はそれを最初に見たとき、私はそれが本当に複雑だと思ったのを覚えていますが、今ではそれはあまりにも単純に見えます。


10
クイックソートは、アルゴリズムの本質とは何かという興味深い質問も提起します。たとえば、標準のエレガントなHaskell実装、標準の擬似コード定義とまったく同じように見えますが、漸近的な複雑さが異なります。それで、クイックソートはちょうど分割統治についてですか、それとも巧妙なその場でのポインタ操作がクイックソートの重要な部分ですか?Quicksortは純粋に機能的な設定で実装することもできますか、それとも可変性が必要ですか?
ヨルグW

2
アルゴリズムの「本質」または「道徳」のアイデアは、Melissa E. O'Neill(cs.hmc.edu/~oneill/papers/Sieve-JFP。)による美しい論文「エラトステネスの正真正銘のふるい」に由来しています。 pdf)そしてクイックソートの議論は、その論文のLtUの議論(lambda-the-ultimate.org/node/3127)から来ており、具体的にはこのコメントから始まります:lambda-the-ultimate.org/node/3127/#comment-45549
ヨルグWミットタグ

8
@Jörg:リンクリストにクイックソートを実装することは完全に賢明であり、配列でのインプレース実装と同じ漸近的な実行時間を持ちます(つまり、配列での素朴なアウトオブプレース実装も同じ実行時間を持ちます)平均および最悪の場合。スペースの使用に関しては、これは確かに異なりますが、「インプレース」バージョンでさえ、一定ではない余分なスペース(コールスタック!)を必要とすることを言わなければなりません。
コンラッドルドルフ

また、Vladimir YaroslavskiyのDual-Pivot Quicksortに言及する価値があります。これは、元のクイックソートpermalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/…

理論上のクイックソートは単純で(4つのステップで概説できます)、高度に最適化できますが、実際には正しくコーディングすることは非常に困難です。それが私の票を得られない理由です。
デニス


50

ミラー-ラビン素数判定法(と同様の試験)がブックにあるべきです。アイデアは、素数の性質を利用して(すなわち、フェルマーの小さな定理を使用して)素数でない数の証人を確率的に探します。十分なランダムテストの後に証人が見つからない場合、番号は素数として分類されます。

その点で、PRIMESがPにあることを示したAKSの素数性テストは、確かにThe Bookにあるはずです!


49

Schwartz-Zippel補題を使用した多項式同一性テスト:

誰かが深夜に目を覚まして、同一性について2つの単変量多項式をテストするように要求した場合、おそらくそれらを積和正規形に減らし、構造的同一性を比較するでしょう。残念ながら、この削減には指数関数的な時間がかかります。これは、ブール式を選言標準形に縮小することに似ています。

あなたがランダム化されたアルゴリズムを好む種類であると仮定すると、次の試みはおそらく反例を求めてランダムに選択された点で多項式を評価し、十分なテストに合格した場合に同一である可能性が高い多項式を宣言することです。Schwartz-Zippelの補題は、ポイントの数が増えると、偽陽性の可能性が非常に急速に減少することを示しています。

多項式時間で実行される問題の決定論的アルゴリズムは知られていません。


これはずっと前に提案されていたはずです!ありがとう!
arnab

1
本の中で目立つ場所にふさわしいいくつかの他のランダム化アルゴリズムがあります。これらの場合、決定論的選択肢と確率論的選択肢の対比はそれほど顕著ではありません。通常、決定論的アルゴリズムが存在しますが、はるかに複雑です。
Per Vognsen

数年前に論文に取り組んでいたときに、誰かが私にシュワルツ・ジッペルの補題ではないかと尋ねるまで、私は独立して同じアルゴリズムを発明しました。そして、私は言った、それは何ですか?:)
ヘリウム

46

深さ優先検索。これは、他の多くのアルゴリズムの基礎です。また、あるdeceivinglyシンプル:たとえば、あなたがスタックによってBFS実装でキューを交換する場合は、DFSを得るのですか?


1
また、Prolog実行の基礎でもあります!
muad

1
スタックが欠落しているBFSのポイントは何ですか?答えは「はい、DFSを取得します」だと思いました。
オマールアントリンカマレナ

1
まあ、誰もがこの問題は些細なことだと思うようです。また、誰もが答えは「はい」だと思っているようですが、これは間違っています。答えは、実際には「どのBFS実装を開始するかによって異なります」です。cs.stackexchange.com/questions/329/…を参照してください(これはCS.SEのベータフェーズを支援するために投稿した質問です)
ラドゥグリゴール

ここでも簡単に説明します:ics.uci.edu//~eppstein/161/960215.html
ラドゥグリゴー

42

ダイクストラのアルゴリズム:非負のエッジパスコストを持つグラフの単一ソース最短パス問題。どこでも使用されており、最も美しいアルゴリズムの1つです。インターネットはそれなしではルーティングできませんでした-それはルーティングプロトコルIS-ISおよびOSPF(Open Shortest Path First)の中核部分です。

  1. すべてのノードに距離値を割り当てます。最初のノードではゼロに設定し、他のすべてのノードでは無限に設定します。
  2. すべてのノードを未訪問としてマークします。初期ノードを現在として設定します。
  3. 現在のノードについて、未訪問のすべての隣接ノードを考慮し、それらの暫定距離を計算します(初期ノードから)。たとえば、現在のノード(A)の距離が6で、別のノード(B)と接続するエッジが2の場合、Aを介したBへの距離は6 + 2 = 8になります。この距離が以前に記録された距離(最初は無限大、最初のノードはゼロ)よりも小さい場合、距離を上書きします。
  4. 現在のノードのすべてのネイバーの検討が終了したら、訪問済みとしてマークします。訪問したノードは二度とチェックされません。現在記録されている距離は最終的なものであり、最小限です。
  5. すべてのノードにアクセスした場合、終了します。それ以外の場合は、(最初​​のノードから)最小距離の未訪問ノードを次の「現在のノード」として設定し、手順3から続行します。


40

Gentryの完全準同型暗号化スキーム(理想的な格子上または整数上の)は非常に美しいです。サードパーティは、秘密キーにアクセスすることなく、暗号化されたデータに対して任意の計算を実行できます。

暗号化スキームは、いくつかの鋭い観察によるものです。

  • 完全に準同型の暗号化スキームを取得するには、加算および乗算に対して準同型であるスキームがあれば十分です。これは、AND、OR、およびNOTゲート(およびチューリング完全性)を得るには加算と乗算(mod 2)で十分だからです。
  • そのようなスキームが必要であるが、いくつかの制限により、ある有限の深さの回路でしか実行できない場合、鍵のプライバシーを犠牲にすることなく、回路の深さの制限をリセットするために、復号化および再暗号化手順を準同型評価できます。
  • スキームの復号化関数の回路バージョンの深さを「押しつぶす」ことにより、最初は有限の浅い回路に任意の数の計算に制限されたスキームを有効にすることができます。

彼の論文では、Craig Gentryは暗号化における長年の(そして豪華な)未解決の問題を解決しました。完全に準同型なスキームが存在するという事実は、計算可能性に固有の構造が存在することを認識させることを要求します。

http://crypto.stanford.edu/craig/craig-thesis.pdf

http://eprint.iacr.org/2009/616.pdf

http://portal.acm.org/citation.cfm?id=1666420.1666445





34

接尾辞配列を構築するための線形時間アルゴリズムは本当に美しいですが、実際に値する認識を受け取っていませんでしたhttp://www.cs.helsinki.fi/u/tpkarkka/publications/icalp03.pdf


それそれにふさわしい認識受け取ったと思います-他に何があなたを考えさせるのですか?たとえば、C ++シーケンス解析ライブラリSeqAnに実装されています。
コンラッドルドルフ

現在、他の多くの線形および非線形の時間接尾辞配列構築アルゴリズムが存在することを言及する価値があります。「サフィックスの並べ替えに対する効率的で汎用性の高いアプローチ」、Journal of Experimental Algorithmics(JEA)、Volume 12、2008年6月には、これらの方針に沿ったいくつかの実験結果があります。
ラファエル

@ラファエル:私は、p。そのJEA紙の3は、彼らはあなたが持つ任意の論文を知っていますO(N ^ 2対数N)の下限「ゆるい」...である「と考えている」ものだけを与える証明可能線形時間よりも、実際に高速化されたアルゴリズムをスキューアルゴリズム?
user651

32

ガウス消去。ユークリッドGCDアルゴリズムからKnuth-Bendixへの一般化シーケンスを完了します。


ところで、一般化シーケンスとは何ですか?また、グロブナー基底に対するブッフバーガーのアルゴリズムはどこに適合しますか?(Knuth-Bendixに似ていますが、どこかでガウスの消去を一般化するという言及をどこかで見ました…)
ShreevatsaR

6
順序は次のとおりです。ユークリッドGCD->ガウス消去法->ブッフベルガー->クヌースベンディックス。(ガウス消去法の代わりに)単変量多項式除算とモジュロ(ガウス消去法から「離れた」一般化順序で、GEは多変量次数1、多項式環は単変量無制限次数、ブッフベルガー無制限次数)を入れることもできます。汎化ジャンプは、変数の追加によりEGCDからGEまたは多項式環へと最大になり、その後、無制限の署名のためにBuchbergerからKBへと大きくなります。–
Mitch

+1:ユークリッドアルゴリズムは、数学で最も有名な方程式ax-by = 1を解きます。CSに頻繁に表示されない理由は謎です。
手切ねなし

32

貯水池サンプリングのアルゴリズムとその証明を見たとき、私は感銘を受けました。非常にシンプルなソリューションを備えた典型的な「頭の体操」タイプのパズルです。それは間違いなく本に属していると思います。それはアルゴリズムと数学の定理の両方のためです。

本については、エルデスが死んで天国に行ったときに、神と会うように要求したという話があります。リクエストは承諾され、会議のためにエルデスは1つの質問しか持っていませんでした。「本を見てもいいですか?」神はイエスと言い、エルデスをそれに導いた。当然、非常に興奮して、エルドスは次を見るためだけに本を開きます。

定理1:...
証明:明白。

定理2:...
証明:明らかです。

定理3:...
証明:明らかです。


4
定理4:…証明:読者へのエクササイズ。
ジョン

31

ウサギとカメアルゴリズム。私はそれを見つけようとして一生を無駄にしたとしても、そのようなアイデアを思い付く方法がないと確信しているので、私はそれが好きです。


6
同じ漸近法で問題を解決し、アルゴリズム設計パターンに従うダムアルゴリズムを知っていますか?繰り返し深化について話している。n番目の反復では、ルートの2 ^ n番目の後継者から開始し、繰り返しを探して2 ^ n個の後継者を探します。繰り返しごとにいくつかのステップをたどっていますが、検索半径の幾何学的な成長率は、漸近に影響しないことを意味します。
ヴォーグセンごと10

30

ユークリッドの無限に多くの素数の証明としての基本的で「自明な」例:

MAX-CUTの2近似 -頂点ごとに独立して、2つのパーティションのいずれかに同じ確率で割り当てます。


6
はい、非常に素晴らしいアルゴリズムです。あまり自明、2の別の要因のコストで、このアルゴリズムは、最大化のために働くすべての劣モジュラ機能だけでなく、グラフカット機能を。これはFeige、Mirrokni、およびVondrak FOCS 07からの結果である
アーロン・ロス

30

私は常に、メトリックTSPに(3/2)近似を与えるChristofidesのアルゴリズムに偏っていました。実際、私に喜んで電話してください、しかし、私はそれの前に来た2-approximationアルゴリズムさえ気に入りまし。(すべてのエッジを複製するのではなく)奇数次の頂点のマッチングを追加することによって最小のスパンニングツリーオイラーを作成するクリストフィデスのトリックはシンプルでエレガントであり、このマッチングがウェイトの半分以下であることを確信させることはほとんどありません最適なツアーの。


実際、適切な近似が保証された他の単純でエレガントな近似アルゴリズムもたくさんあります。
ジャンヌH.コルホネン



25

線形計画法のアルゴリズム:シンプレックス、楕円、および内点法。

http://en.wikipedia.org/wiki/Linear_programming#Algorithms


実際、これらの問題に対する理解を深めるために、いくつかのノーベル賞が授与されました。
ロススナイダー

@Ross KantorovichはLPを発明し、それをリソース割り当てに適用したことでノーベル経済学賞を受賞しました。他にどんな賞を考えていましたか?
マークReitblatt

@Mark KoopermansはKantorovichでノーベル賞を受賞しましたが、「数度」と言うのはまだ不正確でした。
ロススナイダー

22

SATインスタンスの特定のクラスを解決するためのロビンモーザーアルゴリズム。このようなインスタンスは、Lovasz Local Lemmaによって解決可能です。モーザーアルゴリズムは、実際、補題のステートメントの非ランダム化です。

私はそれが数年後に彼のアルゴリズム(およびその正当性の証明のためのテクニック)が十分に消化され、Book from Algorithmの実行可能な候補になるまで洗練されると思います。

このバージョンは、GáborTardosと共に書かれた彼のオリジナルの論文の延長です。



21

KnuthのアルゴリズムXは、正確なカバー問題のすべての解を見つけます。それについてとても不思議なのは、彼がそれを効率的に実装するために提案したテクニック:Dancing Linksです。


20

Schieber-Vishkinを含める必要があります。これは、一定の時間で最も一般的な祖先クエリに応答し、線形時間でフォレストを前処理します。

私は、第4巻ファシクル1でのクヌースの説明と彼の黙想が好きです。彼はそれを完全に理解するのに丸二日かかったと言った、そして私は彼の言葉を覚えている:

とても美しいと思いますが、驚くべきことに文学で悪い報道を受けています(..)それは私を刺激する数学に基づいています。


10
待ってください、それは美しいかもしれませんが、それを完全に理解するのに2日間かかった場合、それは本当に「本から」ですか?
シュリーバツァー

@ShreevatsaR本の脚注には細かい活字があります:)
hsmyers
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.