タグ付けされた質問 「algorithms」

アルゴリズムは、問題に対する抽象的な解決策を定義する明確に定義された一連のステップです。このタグは、問題がアルゴリズムの設計と分析に関連している場合に使用します。

11
クイックソートが実際に他のソートアルゴリズムよりも優れているのはなぜですか?
標準アルゴリズムコースでは、クイックソートは平均でであり、最悪の場合はであると教えられてい。同時に、最悪の場合(mergesortやheapsortのようなであり、最高の場合(bubblesortのような)線形時間であるが、メモリの追加の必要性がある他のソートアルゴリズムが研究されています。O (n 2)O (n log n )O (n ログn )O(nlog⁡n)O(n \log n)O (n2)O(n2)O(n^2)O (n ログn )O(nlog⁡n)O(n \log n) いくつかの実行時間をひと目見た後、クイックソートは他の効率ほど効率的であってはならないと言うのが自然です。 また、学生は基本的なプログラミングコースで、再帰があまりにも多くのメモリを使用するなどの理由であまり良くないことを学ぶと考えてください。したがって(これは本当の議論ではありませんが)、これはクイックソートがそうではないという考えを与えますそれは再帰アルゴリズムであるため、本当に良いです。 それでは、実際には、クイックソートが実際に他のソートアルゴリズムよりも優れているのはなぜですか?実世界のデータの構造に関係していますか?コンピューターのメモリの動作方法に関係していますか?一部のメモリは他のメモリよりもはるかに高速であることは知っていますが、それがこの直感に反するパフォーマンスの本当の理由であるかどうかはわかりません(理論的な推定と比較した場合)。 1更新:正規答えはに関与定数と言っている平均的な場合の、他のに関与する定数よりも小さいアルゴリズム。ただし、直感的なアイデアだけではなく、正確な計算を使用して、これを適切に正当化する方法はまだありません。O (n log n )O (n ログn )O(nlog⁡n)O(n\log n)O (n ログn )O(nlog⁡n)O(n\log n) いずれにせよ、いくつかの答えが示唆するように、メモリレベルでは実装がコンピューターの内部構造を利用し、たとえばキャッシュメモリがRAMよりも速いことを使用して、本当の違いが生じるようです。議論はすでに興味深いものですが、答えはそれに関係しているように思われるので、メモリ管理に関してさらに詳細を見たいと思います。 更新2:ソートアルゴリズムの比較を提供するいくつかのWebページがあり、一部は他よりも洗練されています(最も顕著なのはsort-algorithms.com)。素晴らしい視覚補助を提示する以外に、このアプローチは私の質問に答えません。

3
アルゴリズム分析の魔法の背後にあるシステムはありますか?
アルゴリズムの実行時間を分析する方法については、多くの質問があります(たとえば、ランタイム分析およびアルゴリズム分析を参照)。多くは似ています。たとえば、ネストされたループのコスト分析や、分割統治アルゴリズムを求めるものですが、ほとんどの答えはオーダーメイドのようです。 一方、別の一般的な質問への回答では、いくつかの例を使用してより大きな全体像(特に漸近解析に関する)を説明していますが、手を汚す方法はありません。 アルゴリズムのコストを分析するための構造化された一般的な方法はありますか?コストは、実行時間(時間の複雑さ)、または実行された比較の数、スペースの複雑さなどのコストのその他の尺度である場合があります。 これは、初心者を指すのに使用できる参照質問になるはずです。したがって、通常よりも広い範囲です。少なくとも1つの例で説明されているが、多くの状況をカバーする、一般的で教訓的に提示された答えを与えるように注意してください。ありがとう!

14
なぜグラフを見て、すぐに別のポイントに最も近いポイントを見つけることができますが、プログラミングにはO(n)時間がかかりますか?
明確にさせてください: 与えられた数の点nの散布図を考えると、精神的にプロット内の任意の点に最も近い点を見つけたい場合、グラフ内のほとんどの点をすぐに無視して、近くの小さな一定の数の点に絞り込みます。 しかし、プログラミングでは、ポイントのセットnが与えられ、任意のポイントに最も近いポイントを見つけるには、他のすべてのポイント、つまり時間をチェックする必要があります。O(n )O(n){\cal O}(n) グラフの視覚的な視覚は、私が理解できないいくつかのデータ構造に相当すると思われます。プログラミングでは、ポイントをクアッドツリーなどのより構造化された方法に変換することにより、時間でポイントに最も近いポイントを見つけるか、時間。N K ⋅のログ(N )O(ログN )kkknnnK ⋅ ログ(n )k⋅log⁡(n)k\cdot\log(n)O(ログn )O(log⁡n){\cal O}(\log n) しかし、データ再構築後のポイント検索用の既知の償却アルゴリズム(私が見つけることができる)はまだありません。O(1 )O(1){\cal O}(1) では、なぜこれは単なる目視検査で可能に見えるのでしょうか?

4
有限オートマトンを正規表現に変換する方法は?
正規表現を同じ言語を受け入れる(最小限の)NFAに変換することは、Thompsonのアルゴリズムなどの標準アルゴリズムを使用すると簡単です。しかし、他の方向はより面倒であるように思われ、結果の表現が面倒な場合があります。 NFAを同等の正規表現に変換するためのアルゴリズムは何ですか?時間の複雑さや結果のサイズに関して利点はありますか? これは参考質問になるはずです。メソッドの一般的な説明と重要な例を含めてください。

13
「いくつかのテストケースを試す」ヒューリスティックを欺く方法:正しいように見えるが実際は正しくないアルゴリズム
ある問題のアルゴリズムが正しいかどうかをテストするための通常の出発点は、いくつかの単純なテストケースでアルゴリズムを手動で実行してみることです。 「。これは優れたヒューリスティックです。これは、アルゴリズムに対する誤った試行の多くを迅速に排除し、アルゴリズムが機能しない理由を理解するための優れた方法です。 ただし、アルゴリズムを学習するとき、一部の学生はそこでやめようとします:試行することを考えられるすべてのコーナーケースを含む少数の例でアルゴリズムが正しく機能する場合、アルゴリズムが正しい必要があると結論付けます。「いくつかのテストケースで試してみることができるのに、なぜアルゴリズムが正しいことを証明する必要があるのか​​」と尋ねる学生が常にいます。 それでは、「多数のテストケースを試す」ヒューリスティックをどのように欺くのでしょうか。このヒューリスティックでは不十分であることを示す良い例を探しています。言い換えれば、表面的には正しいように見えるアルゴリズムの1つ以上の例を探しており、だれかが思い付く可能性のあるすべての小さな入力に対して正しい答えを出力しますが、アルゴリズムは実際には動作しません。たぶん、アルゴリズムはたまたますべての小さな入力で正しく動作し、大きな入力に対してのみ失敗するか、異常なパターンを持つ入力に対してのみ失敗します。 具体的には、私は探しています: アルゴリズム。欠陥はアルゴリズムレベルである必要があります。実装のバグを探していません。(たとえば、最低限、この例は言語にとらわれず、ソフトウェアエンジニアリングや実装の問題ではなく、アルゴリズムの問​​題に関連する必要があります。) 誰かがもっともらしく思いつくかもしれないアルゴリズム。擬似コードは、少なくとももっともらしいように見えるはずです(たとえば、難読化された、または明らかに疑わしいコードは良い例ではありません)。宿題や試験の問題を解決しようとするときに、一部の学生が実際に思いついたアルゴリズムである場合、ボーナスポイントがあります。 妥当な手動テスト戦略に高い確率で合格するアルゴリズム。手作業でいくつかの小さなテストケースを試みる人は、欠陥を発見する可能性は低いはずです。たとえば、「12個の小さなテストケースで手動でQuickCheckをシミュレート」しても、アルゴリズムが正しくないことを明らかにすることはできません。 好ましくは、決定論的アルゴリズム。私は多くの学生が「手作業でいくつかのテストケースを試す」が決定論的アルゴリズムが正しいかどうかをチェックする合理的な方法であると考えているのを見てきましたが、ほとんどの学生はいくつかのテストケースを試すことは確率論を検証する良い方法だとは思わないでしょうアルゴリズム。確率的アルゴリズムの場合、特定の出力が正しいかどうかを確認する方法がないことがよくあります。また、出力分布に関する有用な統計テストを実行するのに十分な例をクランクすることはできません。したがって、決定論的アルゴリズムは学生の誤解の中心により明確になるため、決定論的アルゴリズムに焦点を当てることを好みます。 私はあなたのアルゴリズムが正しいことを証明することの重要性を教えたいです。そして、このようないくつかの例を使って、正当性の証明の動機付けを助けたいと思っています。私は比較的単純で学部生がアクセスしやすい例を好むでしょう。重い機械や数学的/アルゴリズム的背景を必要とする例はあまり有用ではありません。また、「不自然」なアルゴリズムも必要ありません。ヒューリスティックを欺くための奇妙な人工アルゴリズムを構築するのは簡単かもしれませんが、非常に不自然に見えるか、このヒューリスティックを欺くためだけに明らかなバックドアが構築されている場合、おそらく学生には納得しません。良い例はありますか?

2
BIT:バイナリインデックスツリーの背後にある直感とは何ですか?
バイナリインデックス付きツリーは、他のデータ構造と比較して、文献が非常に少ないか比較的少ないです。それが教えられる唯一の場所はtopcoderチュートリアルです。チュートリアルはすべての説明で完了していますが、そのようなツリーの背後にある直感を理解できませんか?どうやって発明されたのですか?その正確さの実際の証拠は何ですか?

5
同じ目的に役立つさまざまなアルゴリズム/データ構造を学ぶ理由は何ですか?
私は学部生だったので、この質問について疑問に思っていました。これは一般的な質問ですが、以下の例で詳しく説明します。 私は多くのアルゴリズムを見てきました-例えば、最大流量の問題については、問題を解決できる3つのアルゴリズムを知っています:Ford-Fulkerson、Edmonds-Karp&Dinic、Dinicが最も複雑です。 データ構造(たとえば、ヒープ)には、バイナリヒープ、二項ヒープ、およびフィボナッチヒープがあり、フィボナッチヒープは全体的な複雑さが最適です。 私を混乱させているのは、すべてを知る必要がある理由はありますか?なぜ最高の複雑さを学び、慣れるだけではありませんか? すべてを知っているのが最善だと知っています。BでなくAを使用することでしか解決できない問題/アルゴリズムなど、「より有効な」理由があることを知りたいだけです。

3
使用する時間の複雑さの分析の表記をどのように知るのですか?
ほとんどの入門アルゴリズムクラスでは、(Big O)やような表記法が導入されており、学生は通常、これらのいずれかを使用して時間の複雑さを見つけることを学びます。OOOΘΘ\Theta ただし、、およびなどの他の表記法があります。ある表記法が別の表記法よりも望ましい特定のシナリオはありますか?oooΩΩ\Omegaωω\omega


8
グラフ検索:幅優先と深さ優先
グラフを検索する場合、幅優先と深さ優先の 2つの簡単なアルゴリズムがあります(通常、すべての隣接グラフノードをキュー(幅優先)またはスタック(深さ優先)に追加することによって行われます)。 さて、他のものよりも優れているものはありますか? 私が考えることができるもの: グラフ内のデータがかなり下にあると予想される場合、グラフのより深い部分に非常に高速で進むため、深さ優先の方が早く検索される場合があります。 逆に、データがグラフのかなり上にあると予想される場合、幅優先の方が結果が早くなる可能性があります。 私が見逃したものはありますか、それは主に個人的な好みに帰着しますか?

6
数値の基本的な操作に一定の時間がかかると仮定するにはどうすればよいですか?
通常、アルゴリズムでは、数値の比較、加算、減算を気にしません-それらが時間実行されると仮定します。たとえば、比較ベースの並べ替えがであると言うときにこれを想定しが、数値が大きすぎてレジスタに収まらない場合、通常は配列として表現するため、基本操作には要素ごとに追加の計算が必要です。O (n log n )O(1)O(1)O(1)O(nlogn)O(nlog⁡n)O(n\log n) で2つの数値(または他のプリミティブな算術関数)の比較ができることを示す証拠はありますか?そうでない場合、比較ベースの並べ替えがと言っているのはなぜですか?O (n log n )O(1)O(1)O(1)O(nlogn)O(nlog⁡n)O(n\log n) SOの質問に答えたときにこの問題が発生し、遅かれ早かれbig-intを処理する必要があるため、アルゴリズムがはないことに気付きました。また、擬似多項式時間アルゴリズムではなく、でした。PO(n)O(n)O(n)PPP

4
MapReduceの目新しさは何ですか?
数年前、MapReduceは分散プログラミングの革命として歓迎されました。批評家もいましたが、概して熱狂的な誇大宣伝がありました。それも特許を取得しました![1] 名前が連想させるmapとreduce関数型プログラミングでは、私が読んだとき(ウィキペディア) マップステップ:マスターノードは入力を受け取り、それをより小さなサブ問題に分割し、ワーカーノードに配布します。ワーカーノードがこれを順番に繰り返して、マルチレベルツリー構造になります。ワーカーノードは小さな問題を処理し、その応答をマスターノードに返します。 削減ステップ:マスターノードはすべてのサブ問題への回答を収集し、それらを何らかの方法で組み合わせて出力を形成します。これは元々解決しようとしていた問題への回答です。 または[2] MAPの内部: [...] MAPは入力値を単語に分割します。[...] MAPは、入力の指定された各キー/値ペアを潜在的に多くの中間キー/値ペアに関連付けることを目的としています。 REDUCEの内部: [...] [REDUCE]は、命令集約(たとえば、削減)を実行します。多くの値を取得し、それらを単一の値に削減します。 私は仕方がありません。これは、Mergesortの意味での分割と征服であり、単純で単純です!それで、MapReduceに(概念的な)目新しさはどこかにありますか、それとも特定のシナリオで役立つ古いアイデアの新しい実装ですか? 米国特許7,650,331:「効率的な大規模データ処理のためのシステムおよび方法」(2010) GoogleのMapReduceプログラミングモデル— R.Lämmelによる再訪(2007)

3
配列をインターリーブするためのインプレースアルゴリズム
要素の配列が与えられます2n2n2n a1,a2,…,an,b1,b2,…bna1,a2,…,an,b1,b2,…bna_1, a_2, \dots, a_n, b_1, b_2, \dots b_n タスクは、結果の配列が次のようになるようにインプレースアルゴリズムを使用して配列をインターリーブすることです b1,a1,b2,a2,…,bn,anb1,a1,b2,a2,…,bn,anb_1, a_1, b_2, a_2, \dots , b_n, a_n インプレース要件がなければ、新しい配列を簡単に作成し、要素をコピーして時間アルゴリズムを提供できます。O(n)O(n)\mathcal{O}(n) インプレース要件では、分割統治アルゴリズムはアルゴリズムを上げ。θ(nlogn)θ(nlog⁡n)\theta(n \log n) 質問は次のとおりです。 あるその場でもあり、時間アルゴリズムは、?O(n)O(n)\mathcal{O}(n) (注:均一コストのWORD RAMモデルを想定できるため、インプレースはスペース制限に変換されます)。O(1)O(1)\mathcal{O}(1)

9
サイズが大きくなると簡単になる問題はありますか?
これはばかげた質問かもしれませんが、入力のサイズが大きくなるにつれて実際に簡単になる問題がある可能性はありますか?実用的な問題はこのようなものではないかと思いますが、この特性を持つ退化した問題を発明できるかもしれません。例えば、おそらく、それは大きくなるか、または他の奇妙な方法で動作するときに「それ自体を解決」し始めます。

5
重み付きグラフで、エッジの重みとしてゼロを使用できますか?
ランダムグラフを生成するスクリプトを作成しようとしていますが、重み付きグラフのエッジが0の値を持つ可能性があるかどうかを知る必要があります。 実際、0をエッジの重みとして使用できることは理にかなっていますが、ここ数日でグラフを操作しており、その例を見たことはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.