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

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

5
興味深いアナグラムを見つける
言うと同じ長さの2つの文字列です。anagramming二つの文字列の全単射写像であるようそれぞれについて、。a1a2…ana1a2…ana_1a_2\ldots a_nb1b2…bnb1b2…bnb_1b_2\ldots b_np:[1…n]→[1…n]p:[1…n]→[1…n]p:[1\ldots n]\to[1\ldots n]ai=bp(i)ai=bp(i)a_i = b_{p(i)}iii 同じ文字列のペアに対して複数のアナグラムが存在する場合があります。例えば、場合 `abcab`と私たちが持っているとなど。a=a=a=b=b=b=cababp1[1,2,3,4,5]→[4,5,1,2,3]p1[1,2,3,4,5]→[4,5,1,2,3]p_1[1,2,3,4,5]\to[4,5,1,2,3]p2[1,2,3,4,5]→[2,5,1,4,3]p2[1,2,3,4,5]→[2,5,1,4,3]p_2[1,2,3,4,5] \to [2,5,1,4,3] アナグラムのの重み は、2番目の文字列を取得するために再配置できるチャンクを取得するために最初の文字列で行う必要のあるカットの数であると言います。正式には、この値の数れる。すなわち、その時点の数であり、はないない、正確1.For例によって増加及び、なぜならカットチャンクに、一度と、及び切り込み4回、5つのチャンクに。w(p)w(p)w(p)pppi∈[1…n−1]i∈[1…n−1]i\in[1\ldots n-1]p(i)+1≠p(i+1)p(i)+1≠p(i+1)p(i)+1\ne p(i+1)pppw(p1)=1w(p1)=1w(p_1) = 1w(p2)=4w(p2)=4w(p_2) = 4p1p1p_11234512345p2p2p_212345 2つの文字列とアナグラムが存在するとします。次に、少なくとも1つのアナグラムの重みを最小にする必要があります。これが一番軽いとしましょう。(最も軽いアナグラムが複数ある場合があります。重みだけに興味があるので気にしません。)aaabbb 質問 アナグラムが存在する2つの文字列が与えられたときに、2つの文字列の最も軽いアナグラムの正確な重みを効率的に生成するアルゴリズムが必要です。アルゴリズムが最も軽いアナグラムを生成する場合でも問題ありませんが、そうする必要はありません。 すべてのアナグラムを生成して重量を量るのは非常に簡単なことですが、多くのアナグラムが存在する可能性があるため、軽いアナグラムを直接検出する方法をお勧めします。 動機 この問題が興味深い理由は次のとおりです。コンピュータに辞書を検索させ、アナグラム、まったく同じ文字を含む単語のペアを見つけるのは非常に簡単です。しかし、作成されるアナグラムの多くは面白くありません。たとえば、Websterの第2国際辞書にある最長の例は次のとおりです。 胆嚢 十二指腸s造設 問題が明らかである:彼らは非常に軽いanagrammingを認めるため、これらの結果がおもしろくであることを単に交換cholecysto、duedenoおよびstomyセクション、一方2.の重量のために、このはるかに短い例では、はるかに意外で面白いです: 海岸線 断面 ここで、最も軽いアナグラムの重みは8です。 この方法を使用して、興味深いアナグラム、つまりすべてのアナグラムの重みが高いアナグラムを見つけるプログラムがあります。しかし、これは、可能なすべてのアナグラムを生成して重み付けすることでこれを行いますが、これは遅いです。

2
N未満のランダムビットで2 ^ Nの1の確率をシミュレートする
次の離散分布をシミュレートする必要があるとします。 P(X=k)={12N,1−12N,if k=1if k=0P(X=k)={12N,if k=11−12N,if k=0 P(X = k) = \begin{cases} \frac{1}{2^N}, & \text{if $k = 1$} \\ 1 - \frac{1}{2^N}, & \text{if $k = 0$} \end{cases} 最も明白な方法は、NNNランダムビットを描画し、それらすべてが000(または111)に等しいかどうかをチェックすることです。しかし、情報理論は言う S=−∑iPilogPi=−12Nlog12N−(1−12N)log(1−12N)=12Nlog2N+(1−12N)log2N2N−1→0S=−∑iPilog⁡Pi=−12Nlog⁡12N−(1−12N)log⁡(1−12N)=12Nlog⁡2N+(1−12N)log⁡2N2N−1→0 \begin{align} S & = - \sum_{i} P_i \log{P_i} \\ & = - \frac{1}{2^N} \log{\frac{1}{2^N}} - \left(1 - \frac{1}{2^N}\right) \log{\left(1 - \frac{1}{2^N}\right)} …

5
ソートされた配列に要素を追加する
これを行うための最速の方法は何ですか(アルゴリズムの観点からも、実際的な問題からも)? 私は次の線に沿って何かを考えていました。 配列の末尾に追加して、これに近いベストケース(開始時に完全にソートされた配列)があり、実行時間が線形である(最適な場合)ので、バブルソートを使用できます。 一方、ソートされた配列から開始することがわかっている場合、バイナリ検索を使用して、指定された要素の挿入ポイントを見つけることができます。 私の考えでは、2番目の方法はほぼ最適ですが、そこに何があるのか​​興味があります。 どうすればこれを最適に行うことができますか?

8
計算の複雑さに関する知識のないプログラマーになることは問題ですか?
私は大学で運動を割り当てられました。私はそれを家に持ち帰り、それを解決するためのアルゴリズムをプログラムしようとしました。 それから、私が思いついた最も些細なことを作り、講師に見せました。簡単な観察の後、彼は私のソリューションの実行時の複雑さは実現不可能であり、より効率的なものを示していると感じました。そして、計算の複雑さについて何も知らないプログラマーの伝統があります(私はそれらの1つでした)。

1
ハッシュテーブルとバイナリツリー
辞書を実装する場合(「顧客IDで顧客データを検索したい」)、使用される一般的なデータ構造はハッシュテーブルとバイナリ検索ツリーです。たとえば、C ++ STLライブラリは(バランスのとれた)バイナリ検索ツリーを使用して辞書(マップと呼びます)を実装し、.NETフレームワークは内部でハッシュテーブルを使用することを知っています。 これらのデータ構造の長所と短所は何ですか?特定の状況で合理的な他のオプションはありますか? キーが強力な基礎構造を持っている場合、たとえば、キーがすべて1からnまでの整数である場合など、特に興味がないことに注意してください。

7
ランダム化アルゴリズムと非決定的アルゴリズムの違いと関係
ランダム化アルゴリズムと非決定的アルゴリズムの違いと関係は何ですか? ウィキペディアから ランダム化されたアルゴリズムは、そのロジックの一部として、ランダムの程度を採用するアルゴリズムです。アルゴリズムは通常、ランダムビットのすべての可能な選択に対して「平均的なケース」で良好なパフォーマンスを達成することを期待して、その動作を導く補助入力として均一にランダムなビットを使用します。正式には、アルゴリズムのパフォーマンスは、ランダムビットによって決定されるランダム変数になります。したがって、実行時間または出力(あるいは両方)はランダム変数です。 非決定的アルゴリズムは決定論的アルゴリズムとは反対に、異なる実行に異なる動作を示すことができるアルゴリズムです。アルゴリズムが実行ごとに異なる動作をする可能性があるいくつかの方法があります。同時アルゴリズムは、競合状態のために異なる実行で異なる実行することができます。確率的アルゴリズムの振る舞いは、乱数ジェネレータによって異なります。非決定的な多項式時間の問題を解決するアルゴリズムは、実行中の選択に応じて、多項式時間または指数時間で実行できます。 ランダム化アルゴリズムと確率的アルゴリズムは同じ概念ですか? はいの場合、ランダム化アルゴリズムは一種の非決定的アルゴリズムですか?

4
特定のサイズのすべての非同型グラフを列挙する
サイズすべての無向グラフを列挙したいのですが、各同型クラスのインスタンスが1つだけ必要です。言い換えると、個の頂点上のすべての非同型(無向)グラフを列挙したいのです。これどうやってするの?nnnnnnn より正確には、次のプロパティを持つ一連の無向グラフを生成するアルゴリズムが必要です:個の頂点上の無向グラフごとに、がと同型であるようなインデックスが存在します。アルゴリズムが可能な限り効率的であることを望みます。言い換えれば、私が気にするメトリックは、このグラフのリストを生成して反復する実行時間です。第二の目標は、アルゴリズムが実装するのに複雑すぎないのが良いことです。G1,G2,…,GkG1,G2,…,GkG_1,G_2,\dots,G_kGGGnnniiiGGGGiGiG_i 各同型クラスから少なくとも1つのグラフが必要であることに注意してください。ただし、アルゴリズムが複数のインスタンスを生成する場合は問題ありません。特に、すべての可能なグラフをカバーしている限り、出力シーケンスに2つの同形グラフが含まれていれば、そのようなアルゴリズムを見つけやすくしたり、より効率的なアルゴリズムを有効にしたりすることができます。 私のアプリケーションは次のとおりです。サイズすべてのグラフでテストしたいプログラムがあります。2つのグラフが同型である場合、私のプログラムは両方で同じ動作をすることを知っています(両方で正しいか、両方で間違っています)ので、各同型クラスから少なくとも1つの代表を列挙し、次にテストするだけで十分ですそれらの入力に関するプログラム。私のアプリケーションでは、はかなり小さいです。nnnnnnn 私が検討したいくつかの候補アルゴリズム: 考えられるすべての隣接行列、つまり、対角線上にすべて0がある対称 0-or-1行列をすべて列挙できます。ただし、これには行列の列挙が必要です。これらの行列の多くは同型グラフを表すため、これは多くの労力を浪費しているようです。2 n (n − 1 )/ 2n×nn×nn\times n2n(n−1)/22n(n−1)/22^{n(n-1)/2} 考えられるすべての隣接行列を列挙し、それぞれについて、以前に出力したグラフのいずれかと同型かどうかをテストできました。以前に出力されたものと同型でない場合は、出力します。これにより、出力リストが大幅に短縮されますが、少なくともステップの計算が必要になります(グラフの同型チェックが超高速であると仮定した場合でも)。私のメトリック。2n(n−1)/22n(n−1)/22^{n(n-1)/2} 隣接行列のサブセットを列挙することは可能です。特に、が個の頂点グラフである、一般性を失うことなく、なるように頂点が配置されていると仮定できます。。言い換えれば、すべてのグラフは、頂点が非減少度の順に配置されているグラフと同型です。そのため、このプロパティを持つ隣接行列のみを列挙すれば十分です。そのような隣接行列がいくつあるのか正確にはわかりませんが、よりもはるかに少なく、GGGnnnV={v1,…,vn}V={v1,…,vn}V=\{v_1,\dots,v_n\}degv1≤degv2≤⋯≤degvndeg⁡v1≤deg⁡v2≤⋯≤deg⁡vn\deg v_1 \le \deg v_2 \le \cdots \le \deg v_n2n(n−1)/22n(n−1)/22^{n(n-1)/2}2n(n−1)/22n(n−1)/22^{n(n-1)/2}計算のステップ。ただし、これによって多くの冗長性が残ります。多くの同型クラスが何度もカバーされるため、これが最適であるとは思えません。 もっと良くできますか?正しく理解すれば、約非同型グラフの等価クラス。上記のアルゴリズムより実行時間が良いアルゴリズムを見つけることができますか?どれだけ近づくことができますか下限?私は主に小さな扱いやすさ(たとえば、または程度;そのようなアルゴリズムを完了までもっともらしく実行できるほど小さい)を気にし、大きな漸近性についてはあまり気にしません。2n(n−1)/2/n!2n(n−1)/2/n!2^{n(n-1)/2}/n!∼2n(n−1)/2/n!∼2n(n−1)/2/n!\sim 2^{n(n-1)/2}/n!nnnn=5n=5n=5n=8n=8n=8nnn 関連:等価でないバイナリ行列を構築します(残念ながら、有効な答えを受け取っていないようです)。

2
検索アルゴリズムをテストするためのグラフはどこで入手できますか?
ダイクストラ、深さ優先などの一連のパス検索アルゴリズムを実装しています。 最初はいくつかの自作グラフを使用していましたが、今はもう少し挑戦してみたいので、どちらかを探しています ベンチマークで使用されるグラフ。 現実世界の都市のグラフ(または、Googleマップ、または可能であれば他の種類のソースからそのような情報をダウンロードする方法)。 可能であれば、さまざまなサイズのグラフのセットに対してアルゴリズムを試すことができるように、それらのソースにフロンティアを簡単に作成または許可してもらいたいと思います。 私は主要な目標から転用されないようにシンプルなソリューションを探しています(異なるアルゴリズムのセットを比較します)。そのため、グラフデータを独自の形式(基本的には、接続された(x, y)ポイントのセット)。 具体的には、2D巡回グラフを探しています。それらのグラフが現実世界の都市通りを反映している場合(一方通行の通り、双方向の通りなどを考慮に入れて、さらに良い!)

1
有向グラフの2つのノード間の単純なパスの数を数えるのはどれくらい難しいですか?
有向グラフの2つのノード間にパスがあるかどうかを判断するための簡単な多項式アルゴリズムがあります(たとえば、深さ優先探索でルーチングラフトラバーサルを実行します)。 しかし、驚くべきことに、存在をテストする代わりにパスの数をカウントしたい場合、問題はさらに難しくなるようです。 パスが頂点を再利用できるようにする場合、sからtまでのパスの数をn個のエッジで見つける動的プログラミングソリューションがあります。ただし、頂点を再利用しない単純なパスのみを許可する場合、考えられる唯一の解決策は、パスのブルートフォース列挙です。これは、指数関数的な時間の複雑さを伴います。 お願いします 2つの頂点間の単純なパスの数を数えるのは難しいですか? もしそうなら、それは一種のNP完全ですか?(私はそれが技術的に意思決定の問題ではないという理由で言っています...) そのようなハードカウントバージョンを持っているPの他の問題はありますか?**

4
ソーシャルネットワークでの可能性のある接続を判断する方法
私は、「提案された友人」アルゴリズムに取り組むアプローチを決定することに興味があります。 Facebookには、知り合いかもしれないと思う個人を推薦する機能があります。これらのユーザーは、通常(ユーザーが友人を特に推奨するエッジケースを除く)、自分と非常によく似たネットワークを持っています。つまり、共通の友人の数が多い。Twitterは「Who To Follow」メカニズムについても同様の道をたどっていると思います。 Facebookの従業員であるStephen Doyle(Igy)は、外見などの友人よりも評価することがEdgeRankの公式を使用している関連ニュースフィードは同様の投稿であることを提案しました。別のユーザーがGoogleランクシステムを提案しました。 Facebookは、ニュースフィードの最適化を述べてい。Σ Uewede∑uewede\sum u_{e}w_{e}d_{e} あなたはeueu_{e} =閲覧ユーザーとエッジ作成者間のアフィニティスコア =このエッジの重み(作成、コメント、いいね、タグなど) =エッジが作成された時間に基づく時間減衰係数 wewew_{e} deded_{e} これらのアイテムを合計すると、オブジェクトのランクが得られるはずです。これは、Igyが示唆したように、同様の形式の何かが提案された友人に使用されることを意味します。 だから私はこれがすべてのタイプの接続がランクシステムを介して一般的に行われる方法であると推測していますか?

4
シンプレックスからの均一なサンプリング
私は、N個の乱数の配列を生成するアルゴリズムを探しています。N個の数字の合計は1で、すべての数字は0と1の範囲内にあります。たとえば、N = 3、ランダムポイント(x、y、 z)三角形内にある必要があります: x + y + z = 1 0 < x < 1 0 < y < 1 0 < z < 1 理想的には、エリア内の各ポイントに等しい確率が必要です。難しすぎる場合は、要件を削除できます。ありがとう。

2
特定のラダーが有効かどうかを効率的に判断する方法は?
私の地元のスカッシュクラブには、次のように機能するはしごがあります。 シーズンの初めに、クラブの各メンバーの名前を別々の行に並べた表を作成します。 次に、各名前の横に、勝ったゲームの数とプレイしたゲームの数を記入します(プレイヤーの勝ち/ゲームの形式で)。 したがって、シーズンの初めには、テーブルは次のようになります。 Carol 0/0 Billy 0/0 Alice 0/0 Daffyd 0/0 任意の2人のプレイヤーが試合をすることができ、1人のプレイヤーが勝ちます。テーブルの一番下に最も近いプレーヤーが勝った場合、プレーヤーの位置が切り替わります。その後、ステップ2を繰り返し、各プレイヤーの隣の勝ちとゲームの数を更新します。たとえば、アリスがビリーを破った場合、 Carol 0/0 Alice 1/1 Billy 0/1 Daffyd 0/0 これらの試合はシーズンを通して続き、最終的にはおおよその強さの順にリストされます。 残念ながら、更新はかなり偶然に行われるため、間違いが発生します。以下は無効なテーブルの例です。つまり、いくつかの開始順序(シーズンの初めに使用した順序を忘れてしまった)と一致と結果のシーケンスに対して上記の手順を正しく実行しても作成できなかったテーブルです。 Alice 0/1 Billy 1/1 Carol 0/1 Daffyd 0/0 Alice 2/3 Billy 0/1 Carol 0/0 Daffyd 0/0 Alice 1/1 Billy 0/2 Carol 2/2 Daffyd 0/1 テーブルが与えられた場合、それが有効かどうかをどのように効率的に判断できますか?以下に注意することから始めることができます。 元の開始順序を忘れているため、名前の順序は重要ではありません。 勝利の合計数は、プレイしたゲームの数の合計の半分でなければなりません。(これは、上記の最初の例が無効であることを示しています。) …

2
Cのvoid型がempty / bottom型と類似していないのはなぜですか?
ウィキペディアと私が見つけた他のソースはvoid、空のタイプではなくユニットタイプとしてリストCのタイプを見つけました。void空の/下の型の定義によりよく適合するように思えるので、この混乱を見つけます。 void私が知る限り、値は存在しません。 戻り値の型がvoidの関数は、関数が何も返さないため、何らかの副作用しか実行できないことを指定します。 タイプのポインターvoid*は、他のすべてのポインタータイプのサブタイプです。また、void*C との間の変換は暗黙的です。 最後の点voidに、空の型であることの引数としてのメリットがあるかどうかはわかりvoid*ませんvoid。 一方、voidそれ自体は他のすべてのタイプのサブタイプではありません。これは、タイプがボトムタイプであるための要件であると言えます。
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

3
選択ソートがバブルソートよりも速いのはなぜですか?
ウィキペディアには、「...選択ソートはほとんど常にバブルソートおよびGNOMEソートよりも優れている」と書かれています。どちらもバブルソートよりも選択ソートが速いと考えられる理由を誰にでも説明してください: 最悪の場合の時間の複雑さ:O( n2)O(n2)\mathcal O(n^2) 比較の数: O( n2)O(n2)\mathcal O(n^2) 最適な時間の複雑さ: バブルソート:O(n )O(n)\mathcal O(n) 選択ソート:O( n2)O(n2)\mathcal O(n^2) 平均ケース時間の複雑さ: バブルソート:O( n2)O(n2)\mathcal O(n^2) 選択ソート:O( n2)O(n2)\mathcal O(n^2)

1
順序付け前、順序付け、順序付けのどの組み合わせがユニークですか?
私たちは、予約注文を知っています、 post L(x) => [x] post N(x,l,r) => (post l) ++ (post r) ++ [x] 先行予約 pre L(x) => [x] pre N(x,l,r) => [x] ++ (pre l) ++ (pre r) 順序通りのトラバーサル応答。順次化。 in L(x) => [x] in N(x,l,r) => (in l) ++ [x] ++ (in r) ペアごとに異なるキー/ラベルを想定していても、どちらも特定のツリーを一意に記述していないことは簡単にわかります。 そのために3つのどの組み合わせを使用できますか。 肯定的な答えには、ツリーを再構成するための(効率的な)アルゴリズムと、それが正しい理由の証明(アイデア)が含まれている必要があります。負の答えは、反例、つまり、同じ表現を持つ異なるツリーを提供する必要があります。

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