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

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

3
メルセンヌツイスターはなぜ良いと見なされているのですか?
メルセンヌツイスターは広く良いとみなされています。ちなみに、CPythonのソースによると、「現存する最も広範囲にテストされたジェネレーターの1つです」しかし、これはどういう意味ですか?このジェネレーターのプロパティをリストするように求められたとき、私が提供できるもののほとんどは悪いです: それは大規模で柔軟性がありません(例:シークなしまたは複数のストリーム)。 巨大な状態サイズにもかかわらず、標準的な統計テストに失敗し、 0付近に重大な問題があり、ランダム化がかなり不十分であることを示唆しています。 速くない 等々。XorShift *のような単純なRNGと比較すると、それは絶望的にも複雑です。 それで、なぜこれが良いと考えられたのかについての情報を探しました。オリジナルの論文は、「超天文学」期間と623次元の均等分布について多くのコメントを述べています。 多くの既知の尺度の中で、スペクトルテスト(Knuth [1981]を参照)や以下に説明するk分布テストなど、より高い次元の均一性に基づくテストが最も強いと考えられています。 ただし、このプロパティの場合、ジェネレーターは十分な長さのカウンターで叩かれます!これは、ジェネレーターで実際に気にしているローカル分布の解説を行いません(ただし、「ローカル」はさまざまなことを意味します)。そして、CSPRNGでさえ、それほど重要ではないので、このような長い期間は気にしません。 論文には多くの数学がありますが、私が知る限り、実際にはランダム性の品質に関するものはほとんどありません。そのほとんどすべての言及は、これらの元々の、ほとんど役に立たない主張にすぐに戻ります。 古い、より信頼性の高い技術を犠牲にして、人々はこの時流に飛び乗ったようです。たとえば、LCGの単語数を3(Mersenne Twisterの「たった624」よりもはるかに少ない)に増やし、各パスで上位の単語を出力すると、BigCrush(TestU01テストスイートのより難しい部分)を通過します)、ツイスターが失敗したにもかかわらず(PCG論文、図2)。これと、メルセンヌツイスターを支持して見つけることができた弱い証拠を考えると、他の選択肢よりも注目を集めたのは何ですか? これも純粋に歴史的なものではありません。メルセンヌツイスターは、実際には、少なくともPCGランダムよりも実際に証明されていると言われています。しかし、ユースケースは私たちの一連のテストよりも優れているほど識別力がありますか?一部のグーグルは、おそらくそうではないと示唆しています。 要するに、メルセンヌツイスターは、その歴史的背景とその他の両方において、どのようにして広く肯定的な評判を得たのだろうかと思っています。一方で私は明らかにその性質に懐疑的ですが、他方では、それが完全にランダムに発生したことを想像するのは困難です。

3
素因数乗算よりも効率的な階乗アルゴリズム
繰り返しと再帰の両方を使用して階乗をコーディングする方法を知っています(n * factorial(n-1)たとえば)。教科書を読んで(詳細な説明はありません)、階乗を半分に再帰的に分割することで、階乗をコーディングするさらに効率的な方法があることを読みました。 なぜそうなるのか理解しています。しかし、私は自分でそれをコーディングしてみたかったのですが、どこから始めればいいのかわかりません。友人は、私が最初にベースケースを書くよう提案しました。数値を追跡できるように配列を使用することを考えていましたが、そのようなコードを設計する方法が実際にはわかりません。 どのようなテクニックを研究すべきですか?

6
基数10を経由せずに基数から基数に変換する背後にある数学は?
任意のベースから任意のベースへの変換の背後にある数学を調べてきました。これは、何よりも結果の確認に関するものです。mathforum.orgで私の答えと思われるものを見つけましたが、正しいかどうかはまだわかりません。大規模なベースから小規模なベースへの変換は大丈夫です。なぜなら、最初の桁に次の桁の繰り返しを追加したいだけであるためです。私の問題は、小さなベースから大きなベースに変換するときに発生します。これを行うとき、彼らはあなたがあなたが持っている小さなベースに必要な大きなベースを変換する必要があるかについて話します。たとえば、ベース4からベース6に移動すると、6をベース4に変換して12を取得する必要があります。その後、大から小に変換するときと同じことを行います。私がこれに関して持っている難しさは、あなたが他のベースにある数字が何であるかを知る必要があるようです。したがって、ベース4に6が何であるかを知る必要があります。テーブルが必要になるため、これは私の頭に大きな問題を引き起こします。誰もがこれをより良い方法で行う方法を知っていますか? 基本的な変換が役立つと思いましたが、そのような機能が見つかりません。そして、私が見つけたサイトから、ベース10を経由せずにベースからベースに変換できるようですが、最初にベースからベースに最初の数値を変換する方法を知る必要があります。それはちょっと無意味になります。 コメンターは、文字を数字に変換する必要があると言っています。もしそうなら、私はすでにそれを知っています。しかし、それは私の問題ではありません。私の問題は、大きなベースを小さなベースに変換するために、最初に持っているベース番号を必要なベース番号に変換する必要があることです。これらのベースを他のベースに変換する能力があれば、すでに問題を解決しているので、これを行うことで目的を無効にします。 編集:10以下のベースから10以下の他のベースに変換する方法を考えました。10以上のベースから10以下のベースに移動することもできます。この問題は、10を超えるベースから10を超えるベースに変換するときに開始されます。または、10未満のベースから10を超えるベースに移行すると、コードが不要になります。コードに適用されます。

2
バイナリ検索のbig-Oのログがベース2ではないのはなぜですか?
コンピューターサイエンスアルゴリズムを理解するのは初めてです。私はバイナリ検索のプロセスを理解していますが、その効率性について少し誤解しています。 要素のサイズでは、特定の要素を見つけるのに平均でnステップかかります。両側の底2の対数を取ると、log 2(s )= nが得られます。それでは、バイナリ検索アルゴリズムの平均ステップ数はlog 2(s )ではありませんか?s = 2ns=2ns = 2^nnnnログ2(s )= nログ2⁡(s)=n\log_2(s) = nログ2(s )ログ2⁡(s)\log_2(s) バイナリ検索アルゴリズムに関するこのウィキペディアの記事では、平均パフォーマンスはと述べてい。これはなぜですか?なぜこの数字ははないのですか?O (ログn )O(ログ⁡n)O(\log n)ログ2(n )ログ2⁡(n)\log_2(n)

3
最悪のケース
私は最悪の与えるトラブル発見の良いリソース持っています場所での安定したソートアルゴリズムを。誰かが良いリソースを知っていますか?O(nlnn)O(nln⁡n)O(n \ln n) ただのリマインダーは、渡された配列を使用することを意味し、ソートアルゴリズムは一定の余分なスペースのみを使用できます。安定とは、同じキーを持つ要素が、元の配列と同じ順序でソートされた配列に表示されることを意味します。 たとえば、単純なマージソートは最悪の場合および安定ですが、O (n )の余分なスペースを使用します。標準のクイックソートは安定したものにできますが、適切に配置されていますが、最悪の場合はO (n 2)です。ヒープソートは配置されています。最悪の場合はO (n ln n )ですが、安定していません。 ウィキペディアには、どのソートアルゴリズムにどの欠点があるかを示す優れたチャートがあります。安定性の3つの条件すべて、最悪の場合O (n ln nO (n lnn )O(nln⁡n)O(n \ln n)O (n )O(n)O(n)O (n2)O(n2)O(n^2)O (n lnn )O(nln⁡n)O(n \ln n)および所定の位置にある。O (n lnn )O(nln⁡n)O(n \ln n) Katajainen、Pasanen、Teuholaによる「Practical in-place mergesort」と呼ばれる論文を見つけました。この論文は、最悪の場合がプレースマージソートバリアントにあると主張しています。結果を正しく理解している場合、配列の最初のと配列の最後ので(ボトムアップ?)mergesortを再帰的に使用し、2番目のをマージするためのスクラッチスペースとして。私はまだこれを読んでいるので、結果を正しく解釈しているかどうかについてのさらなる情報はありがたいです。O (n lnn )O(nln⁡n)O(n \ln n)1414\frac{1}{4}1212\frac{1}{2}1414\frac{1}{4} また、安定したクイックソートの最悪のケースにも非常に興味があります。私が理解していることから、クイックソートを最悪のケースO (n ln n )に変更するには、通常は安定性を損なう適切なピボットを選択する必要があります。O (n lnn …

1
キューをBFS実装のスタックに変更すると、DFSを取得できますか?
次に、幅優先検索の標準的な擬似コードを示します。 { seen(x) is false for all x at this point } push(q, x0) seen(x0) := true while (!empty(q)) x := pop(q) visit(x) for each y reachable from x by one edge if not seen(y) push(q, y) seen(y) := true ここpushでpopは、キュー操作であると想定されています。しかし、スタック操作の場合はどうでしょうか?結果のアルゴリズムは、深さ優先順で頂点を訪問しますか? 「これは取るに足らない」というコメントに投票した場合、なぜそれが取るに​​足らないのかを説明してください。この問題は非常に注意が必要です。

3
より単純なパスの数発見アルゴリズム
G=(V,E)G=(V,E)G=(V,E)ssstttssstttGGGtttP ⇝ Z V P S R Y のV V S 、R 、Y 、VのP O Vs⇝ts⇝ts \rightsquigarrow tこれが他のパスのサブパスである場合、DFSもこのサブパスを再度通過します。たとえば、からまでのパスの数を見つける必要がある隣接リストを考えます。 ここで、DFSはで始まり、 DFSが正常に実行されないため、ます。 pathは。これはに遭遇するため、頂点色を灰色に変更しないためです。pppvvv posryvzworryvwzsszvposzorsvsrryyvvwzwz\begin{array}{|c|c c c|} \hline p &o &s &z \\ \hline o &r &s &v\\ \hline s &r \\ \hline r &y \\ \hline y &v \\ \hline v &w …

4
「ソート度」の測定方法
配列の「ソート度」を測定する標準的な方法があるかどうか疑問に思っていますか?可能性のある反転の中央値を持つ配列は、最大限にソートされていないと見なされますか?つまり、基本的には、並べ替えまたは逆並べ替えのいずれかが可能な限り行われないということです。

2
トップダウンとボトムアップの動的プログラミングに違いはありますか?
トップダウンとボトムアップの動的プログラミングには根本的な違いがありますか? 特に、ボトムアップでは解決できるがトップダウンでは解決できない問題がありますか?または、ボトムアップアプローチは、トップダウンアプローチの繰り返しを単に解くだけですか?

2
素朴なシャッフルはどの程度漸近的に悪いのでしょうか?
各アイテムをランダムに選択された別のアイテムと交換して配列をシャッフルするこの「ナイーブ」アルゴリズムが正しく機能しないことはよく知られています。 for (i=0..n-1) swap(A[i], A[random(n)]); 具体的には、nnn回の反復のそれぞれで、n nnn選択肢の1つが(一様な確率で)行われるため、計算にはnnnnn^n可能な「パス」があります。可能な順列のn!n!n!は、パスの数に均等に分割されないnnnnn^nため、このアルゴリズムがそれぞれを生成することは不可能です!n!n!n!等しい確率の順列。(代わりに、いわゆるFischer-Yatesシャッフルを使用する必要があります。これは基本的に[0..nから乱数を選択する呼び出しを変更する]と[i..n)から乱数を選択する呼び出しです。それは私の質問には意味がありません。) 私が疑問に思っているのは、素朴なシャッフルはどの程度「悪い」のでしょうか?より具体的には、せるP(n)P(n)P(n)すべての順列及び組ことC(ρ)C(ρ)C(\rho)得られた順列生成ナイーブアルゴリズムを通じてパスの数であるρ∈P(n)ρ∈P(n)\rho\in P(n)、関数の漸近挙動が何を M(n)=n!nnmaxρ∈P(n)C(ρ)M(n)=n!nnmaxρ∈P(n)C(ρ)\qquad \displaystyle M(n) = \frac{n!}{n^n}\max_{\rho\in P(n)} C(\rho) そして m(n)=n!nnminρ∈P(n)C(ρ)m(n)=n!nnminρ∈P(n)C(ρ)\qquad \displaystyle m(n) = \frac{n!}{n^n}\min_{\rho\in P(n)} C(\rho)? 主な要因は、これらの値を「正規化」することです。ナイーブシャッフルが「漸近的に良好」であれば、 limn→∞M(n)=limn→∞m(n)=1limn→∞M(n)=limn→∞m(n)=1\qquad \displaystyle \lim_{n\to\infty}M(n) = \lim_{n\to\infty}m(n) = 1。 私は(私が見たいくつかのコンピューターシミュレーションに基づいて)実際の値は1から離れていると疑っていますが、が有限であるか、が0?これらの量の振る舞いについて何がわかっていますか?lim m (n )limM(n)limM(n)\lim M(n)limm(n)limm(n)\lim m(n)

2
通常のセットを学習するためのDana Angluinのアルゴリズムに改善はありますか
1987年の独創的な論文で、Dana Angluinは、メンバーシップクエリと理論クエリ(提案されたDFAの反例)からDFAを学習するための多項式時間アルゴリズムを提示しています。 彼女は、nnn状態を持つ最小DFAを学習しようとしており、最大のカウント例の長さがmmmである場合、O(mn2)O(mn2)O(mn^2)メンバーシップクエリと最大理論クエリを作成する必要があることを示しています。n−1n−1n - 1 通常のセットを学習するために必要なクエリの数が大幅に改善されましたか? 参考資料と関連質問 Dana Angluin(1987)「クエリおよび反例からの正規集合の学習」、Infortmation and Computation 75:87-106 メンバーシップクエリおよび反例モデルで学習するための下限

4
動的プログラミングとは何ですか?
この質問が愚かに聞こえる場合は、事前に申し訳ありません... 私の知る限り、動的プログラミングを使用したアルゴリズムの構築は次のように機能します。 問題を再帰関係として表現します。 メモ化またはボトムアップアプローチのいずれかを使用して、再帰関係を実装します。 私の知る限り、動的プログラミングに関するすべてを述べてきました。つまり、動的プログラミングでは、再帰関係を表現したり、コードに変換したりするためのツール/ルール/メソッド/定理は提供されません。 それでは、動的プログラミングの特別な点は何ですか?ある種の問題に取り組むための漠然とした方法以外に、それはあなたに何を与えますか?

3
ハードウェア/実装は、アルゴリズムの時間/空間の複雑さに影響しますか?
私はCSの学生でもないので、これはばかげた質問かもしれませんが、どうか私に耐えてください... プレコンピューター時代では、引き出しの配列のようなものでのみ配列データ構造を実装できます。値を抽出する前に、対応するインデックスでドロワーを見つける必要があるため、配列検索の時間の複雑さはバイナリ検索を想定。O(log(n))O(log(n))O(log(n)) しかし、コンピューターの発明は大きな違いをもたらしました。最近のコンピューターはRAMから非常に高速に読み取ることができるため、配列ルックアップの時間の複雑さはと考えています(技術的にはそうではありません。O(1)O(1)O(1) 別の例は、Python辞書です。誤って記述されたオーバーロードマジックメソッド(または、途方もなく不運、つまり、多くのハッシュ衝突を伴うキーで辞書アクセスの複雑さを得るかもしれませんが、通常はと推定されます。この場合、時間の複雑さは、Python辞書のハッシュテーブル実装と、ハッシュ関数のキーの実装の両方に依存します。O(n)O(n)O(n)__hash__O(1)O(1)O(1) これは、ハードウェア/実装がアルゴリズムの時間の複雑さに影響する可能性があることを意味しますか?(両方の例はアルゴリズムではなくデータ構造に関するものですが、後者は前者に基づいて構築されており、データ構造の時間の複雑さを聞いたことがないため、ここでは「アルゴリズム」という用語を使用しています) 私にとって、アルゴリズムは抽象的かつ概念的であり、時間/空間の複雑さなどの特性は、特定の方法で実装されているかどうかによって影響されるべきではありませんが、そうですか?

2
停止ステータスが不明な非常に短いプログラムとは何ですか?
Binary Lambda Calculusのこの579ビットプログラムには、不明な停止ステータスがあります。 01001001000100010001000101100111101111001110010101000001110011101000000111001110 10010000011100111010000001110011101000000111001110100000000111000011100111110100 00101011000000000010111011100101011111000000111001011111101101011010000000100000 10000001011100000000001110010101010101010111100000011100101010110000000001110000 00000111100000000011110000000001100001010101100000001110000000110000000100000001 00000000010010111110111100000010101111110000001100000011100111110000101101101110 00110000101100010111001011111011110000001110010111111000011110011110011110101000 0010110101000011010 つまり、このプログラムが終了するかどうかはわかりません。それを決定するには、Collat​​zの予想を解く必要があります-少なくとも、2 ^ 256までのすべての数値に対して。このリポジトリには、このプログラムがどのように取得されたかの完全な説明があります。 また、停止ステータスが不明な短いBLCプログラムがありますか?

3
フロイドのサイクル検出アルゴリズム| サイクルの開始点の決定
私はフロイドのサイクル検出アルゴリズムを理解する助けを求めています。ウィキペディア(http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare)の説明を読みました。 アルゴリズムがO(n)時間でサイクルを検出する方法を見ることができます。ただし、亀とウサギのポインターが初めて会った後、亀のポインターを最初に戻し、亀とウサギの両方を一度に動かすことで、サイクルの開始を決定できるという事実を視覚化することはできません。彼らが最初に会うポイントは、サイクルの始まりです。 私がそれを理解/視覚化できないので、誰かが説明を提供することで助けてくれますか?

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