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

特定のデータ構造(最も一般的にはツリー)内の要素を見つけるためのアルゴリズム。

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

3
バイナリ検索が3項検索よりも高速なのはなぜですか?
バイナリ検索を使用して要素の配列を検索するには、最悪の場合、回の反復が必要です。これは、各ステップで検索スペースの半分をトリミングするためです。代わりに、「三分探索」を使用した場合、各反復で探索空間の3分の2を切り捨てるので、最悪の場合は反復が必要です...log 2 N log 3 N &lt; log 2 NNNNlog2Nlog2⁡N\log_2 Nlog3N&lt;log2Nlog3⁡N&lt;log2⁡N\log_3 N < \log_2 N 三項検索の方が速いように思えますが、なぜ二項検索を使用するのですか?

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です。 この方法を使用して、興味深いアナグラム、つまりすべてのアナグラムの重みが高いアナグラムを見つけるプログラムがあります。しかし、これは、可能なすべてのアナグラムを生成して重み付けすることでこれを行いますが、これは遅いです。

7
BFS / DFSを使用して木の直径を見つけるアルゴリズム。なぜ機能するのですか?
このリンクは、BFS / DFSを使用して無向木の直径を見つけるためのアルゴリズムを提供します。要約: グラフ内のノードsでBFSを実行し、最後に検出されたノードuを記憶します。最後に検出されたノードvを思い出して、uからBFSを実行します。d(u、v)は木の直径です。 なぜ機能するのですか? このページ2には理由がありますが、混乱を招きます。証明の最初の部分を引用しています: グラフ内のノードsでBFSを実行し、最後に検出されたノードuを記憶します。最後に検出されたノードvを思い出して、uからBFSを実行します。d(u、v)は木の直径です。 正しさ:d(a、b)が木の直径になるように、aとbを2つのノードとします。aからbへの一意のパスがあります。tをBFSによって検出されたそのパス上の最初のノードとします。sからuへのパスとaからbへのがエッジを共有しない場合、tからuへのパスにはsが含まれます。そうp1p1p_1p2p2p_2 d(t,u)≥d(s,u)d(t,u)≥d(s,u)d(t,u) \ge d(s,u) d(t,u)≥d(s,a)d(t,u)≥d(s,a)d(t,u) \ge d(s,a) ....(さらに不等式が続きます..) 不平等は私には意味がありません。

2
スーパーマーケットで妻を見つけるにはどうすればいいですか?
2人が迷路で迷子になった場合、どちらのアルゴリズムを使用するかを事前に合意することなく、お互いを見つけるために使用できるアルゴリズムはありますか? このアルゴリズムにはいくつかの特徴があると思います。 各人は、他の人が何を決定しているかについての仮定を行わないロジックを使用してそれを導出できる必要がありますが、各人は他の人が同じ位置にいることを知っているので、他の人が決定しなければならないものについて推論することができます。 状況に完全な対称性があるため、両方のユーザーが同一のアルゴリズムを導出する必要があります(どちらも相手の開始位置に関する知識がなく、迷路は固定サイズであり、両方によって完全にマップされます)。アルゴリズムは決定論的である必要はないことに注意してください:ランダム化することができます。

7
2つの配列が異なる1つの要素。効率的に見つける方法は?
私はコーディング面接の準備をしていますが、この問題を解決する最も効率的な方法を実際に見つけることはできません。 ソートされていない数値で構成される2つの配列があるとします。配列2には、配列1にはない数値が含まれています。両方の配列はランダムに配置された番号を持ち、必ずしも同じ順序または同じインデックスではありません。例えば: 配列1 [78,11、143、84、77、1、26、35 .... n] 配列2 [11,84、35、25、77、78、26、143 ... 21 ... n + 1] 異なる数を見つけるための最速のアルゴリズムは何ですか?その実行時間は何ですか?この例では、探している数字は21です。 私のアイデアは、配列1を実行し、配列2からその値を削除することでした。完了するまで繰り返します。これは、実行時間に近いはずです。O (n ログn )O(nlog⁡n)O(n \log n)

2
無向グラフ上の最短経路?
だから私はこの(多少基本的な)質問はここに属していると思った: サイズが100のノードのグラフが10x10のパターンで配列されているとします(チェス盤を考えてください)。グラフは無向であり、重み付けされていません。グラフを移動するには、3つのスペースを前方に移動し、1つのスペースを右または左に移動します(チェスナイトがボード上を移動するのと同様)。 開始ノードが固定されている場合、ボード上の他のノードへの最短パスをどのように見つけますか? 実行可能な移動であるノード間にのみエッジがあると想像しました。したがって、この情報が与えられたら、開始ノードから終了ノードまでの最短パスを見つけたいと思います。 私の最初の考えは、各エッジは重み1で重み付けされるということでした。しかし、グラフは無向であるため、ジクストラは理想的なフィットではありません。したがって、私は深さ優先検索の変更された形式を使用してそれを行うことにしました。 しかし、検索を使用して最短経路を取得する方法を視覚化することはできませんでした。 私が試したもう1つのことは、開始ノードをルートとしてツリー形式でグラフを配置し、次に希望の終了ノードを与えた最も浅い(最も低い行番号)結果を選択することでした...これはうまくいきましたが、非常に効率的ではなかったため、大きなグラフでは機能しません。 誰かが私にこの方向性を正しい方向に向けるようなアイデアを持っていますか? どうもありがとうございました。 (グラフの視覚化を試みましたが、評判が悪いためできませんでした)

4
グラフの深さ優先検索におけるグレーノードの目的
私が見た深さ優先検索の多くの実装(例:ここ)では、コードは灰色の頂点(発見されたが、そのすべての隣人が訪問されたわけではない)と黒の頂点(発見され、そのすべての隣人が訪問された)を区別します。この区別の目的は何ですか?DFSアルゴリズムは、グレーであるか黒であるかに関係なく、訪問先の頂点にアクセスすることはないようです。

4
重複しないビットベクトルのペアを見つける
幅kのビットベクトルのリストを提供します。あなたの目標は、共通の1がない2つのビットベクトルをリストから返すか、そのようなペアが存在しないことを報告することです。nnnkkk 例えば、私があなたに与える場合次いで、唯一の解決策は{ 00110 、11000 }。代替的に、入力[ 111 、011 、110 、101 ]解を持ちません。そして、すべてゼロのビットベクトル000 ... 0と別の要素eを含むリストには、自明な解{ e 、000 ... 0 }があります。[ 00110 、01100 、11000 ][00110,01100,11000][00110, 01100, 11000]{ 00110 、11000 }{00110,11000}\{00110, 11000\}[ 111 、011 、110 、101 ][111,011,110,101][111, 011, 110, 101]000 ... 0000...0000...0eee{ e 、000 ... 0 }{e,000...0}\{e, 000...0\} 少し難しい例がありますが、解決策はありません(各行はビットベクトルで、黒い四角は1で、白い四角は0です): ■ ■ ■ ■ □ □ …

2
許容されるヒューリスティックは最適なソリューションをどのように保証しますか?
A *(または他の最適なパス検索アルゴリズム)を使用する場合、使用されるヒューリスティックは許容できる必要があります。つまり、実際のソリューションパスの長さ(または移動)を過大評価してはなりません。 許容されるヒューリスティックは最適なソリューションをどのように保証しますか?直感的な説明を探しています。 必要に応じて、8パズルのマンハッタン距離ヒューリスティックを使用して説明できます。

2
AO *アルゴリズムを実装する方法は?
検索アルゴリズムを実装するときに、異なるデータ構造が使用されることに気付きました。たとえば、キュ​​ーを使用して幅優先検索を実装し、スタックを使用して深さ優先検索を実装し、最小ヒープを使用してA *アルゴリズムを実装します。これらの場合、検索ツリーを明示的に構築する必要はありません。 しかし、AO *アルゴリズムの検索プロセスをシミュレートする単純なデータ構造を見つけることはできません。検索ツリーを明示的に構築することがAO *アルゴリズムを実装する唯一の方法であるかどうかを知りたいですか?誰でも私に効率的な実装を提供できますか?

2
バイナリ検索と補間検索の組み合わせの背後にある研究や理論はありますか?
私は読んで、このアルゴリズムはまだバイナリ検索アルゴリズムとみなすことができるの?数年前、ログファイルのインデクサー/検索を作成して、日付/時刻ウィンドウごとに大きなプレーンテキストファイル内のログエントリを見つけることを思い出しました。 これをしている間、私は補間検索を試すことにしました(それがそれが何であるかわからなかったので、自分でアイデアを見つけました)。その後、何らかの理由で、補間ステップとバイナリ分割ステップを交互に行うというアイデアを続けました。ステップ0では、テストポイントを決定するために補間し、ステップ1では正確な中間点などを取得します。 次に、純粋な補間検索、純粋なバイナリ検索、および組み合わせの試行を使用して、システムのベンチマークを行いました。交互アプローチは、時間とランダムに選択された時間のセットを見つける前に必要なテストの数の両方で明確な勝者でした。 リンクされた質問に触発されて、「代替補間検索とバイナリ検索」をすばやく検索したところ、何も見つかりませんでした。答えの1つに対するコメントで示唆されているように、「ヘッジ補間検索」も試しました。 既知のものにつまずいたことがありますか?特定の種類のデータに対して高速であるという理論的な正当性はありますか?通常、ログファイルはその間は大きく(たとえば、検索する1,000万行の1-2 GBのテキスト)、その中の日付/時間の広がりは、アクティビティの激しいバースト、一般的なピーク時間、および静かな時間で複雑でした。私のベンチマークテストは、検出するターゲット時間の均等な分布からサンプリングしました。

2
地球の連続地図上で経路探索を行うための最先端のアルゴリズムとは何ですか?
ノルウェーのフィヨルドのどこかに太陽電池式の自律水上船があり、かなり最近の地図セット、GPS受信機を備えていて、詳細なコマンドをダウンリンクする手段がないと仮定します。この船は、可能な限り早い時期に海南島に到達しなければなりません。 地球上の海上ルートを見つけるための決定論的なアルゴリズムは何ですか? 彼らの時間とメモリの複雑さは何ですか? たとえば、地球の地図を、接続されたポリゴン(つまり、球/楕円体のドローネ三角形分割)を含む図に変換した後、A *を使用できますか? 回答は、理想的には上記の質問の議論を伴う論文への参照を提供する必要があります。 Rob Langが指摘したように、アルゴリズムは通常の基準に適合しなければなりません。時間の制約がない場合、地球の海と海の任意の2点間の最短経路につながるか、そうでなければ経路探索の失敗を示します。 ここには興味深いサブトピックがあります(オンライン計算用の事前計算時間/ストレージのトレーディング、締め切りが始まる前にやや準最適なルートを提供するなど)が、これらは主な問題に付随しています。

2
ユニバーサル検索の一般的な説明とは何ですか?
コンピューターサイエンスのトピックに関する本を読んでいますが、前提条件の一部が欠けています。通常、用語に出会ったとき、私は単にそれらを調べますが、ユニバーサル検索については、統計/コンピューターサイエンスの背景のない読者に適した説明を見つけることができませんでした。 私は、Scholarpediaのユニバーサル検索に関するこの記事を読んでいますが、これはトピックをカバーしているようです。ユニバーサル検索(またはレビン検索)の意味を説明していただければ幸いです。

3
このアルゴリズムはまだバイナリ検索アルゴリズムと見なされますか?
2番目のコードカタ(毎回異なるメソッドを使用してバイナリ検索アルゴリズムを5回実装するように要求する)を実行している間に、次のように機能するわずかに異なるソリューションを思い付きました。 長さ100のソートされた配列があり、その開始フィールドに数字200が含まれ、その終了フィールドに数字400が含まれている場合、人間を研究する数学として、私は通常のバイナリ検索アルゴリズムのようなフィールド50ではなく、番号270です。 次に、配列のフィールド35の数が270の場合、35は検索したインデックスです。 そうでない場合は、取得した数値(280など)を比較し、配列の下部を取得する操作を繰り返します(したがって、開始フィールドに200を含み、終了フィールドに280を含む35フィールドがあります)。私が見つけた数は、私が探しているもの、または配列の上部よりも大きいです(たとえば260を取得しました:現在、65のインデックスがあり、最初のインデックスには260が含まれ、最後のインデックスには400が含まれています。取得した数値が検索している数値よりも小さい場合、このサブ配列のインデックス4(配列全体のインデックス39)。 問題は、このアルゴリズムをバイナリ検索アルゴリズムと見なすことはできますか?そうでない場合、独自の名前を持っていますか?

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