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

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 三項検索の方が速いように思えますが、なぜ二項検索を使用するのですか?

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)

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

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

1
現代の正規表現の表現力
私は最近、主に単語のグループを特別なプロパティと照合する正規表現の課題を提案するWebサイトについて友人と話し合いました。彼は||||||||、数|が素数であるような文字列に一致する正規表現を探していました。そのような言語は、通常であれば、補題をポンプの翻訳が素数のためにあるという事実与えますので、私はすぐにそれが今まで動作しません彼に言われた十分な大きさ、それが存在するのk ≤ pがあるようP + N kは、すべての主要ですN ≥ - 1、よく、これは全くケースしにくい(素数の配分、そのような未知の自明とプロパティを破砕、...)pppk≤pk≤pk \leq pp+nkp+nkp + nkn≥−1n≥−1n \geq -1 しかし、誰かが解決策に付属している:一致しない(||+?)\1+ キャプチャグループに一致するように、この表現しようとする(つまりすることができ||、|||、||||などの上の出現箇所)のn ≥ 2回。一致する場合、文字列で表される数はkで割り切れるので、素数ではありません。それ以外の場合です。k≥2k≥2k \geq 2|n≥2n≥2n \geq 2kkk そして、グループ化と後方参照により、正規表現が理論的な意味で...正規表現よりも実際にはるかに表現力豊かになることが明らかになったので、私は愚かに感じました。今では、実際の正規表現を実行するときに私が知らなかったルックアラウンドやその他の演算子も追加されました。 ウィキペディアによると、文脈自由文法によって生成された言語よりもさらに表現力があります。だからここに私の質問があります: 現代の正規表現エンジンを使用して、(文脈自由文法から生成された)代数言語を表現できますか より一般的な説明、または現代の正規表現で説明できる言語の種類の複雑さの少なくとも上限はありますか? より実用的には、その背後に深刻な理論がありますか、それとも有限オートマトンに基づく実際の正規表現の最初のブロックに実装可能と思われるたびに新しい機能を追加するだけですか? 「モダンな正規表現」は質問が具体的ではないことを知っていますが、少なくとも後方参照を使用することを意味します。もちろん、この「現代の正規表現」言語に対する特定の制限を想定している部分的な回答者がいる場合は、遠慮なく投稿してください。

4
(ビット)加算とシフトをプリミティブとして使用して平方根を計算する
質問:ビットの自然数与えられた、(ビット)の加算とシフトのみを使用してを計算する方法は?nnnNNN⌈N−−√⌉⌈N⌉\lceil \sqrt{N} \rceilO(n)O(n)O(n) ヒントは、バイナリ検索を使用することです。しかし、必要な複雑さを実現できませんでした(を取得しました)。O(n2)O(n2)O(n^2) それはどういう意味ですかusing only $O(n)$ (bit) additions and shifts: これはアルゴリズムブックの練習問題です。 私の意見では、それは2を追加し、言うことを意味しビットは、自然数は、コストとシフトする、と言うビットは、自然数もコスト。次に、そのような操作を回しか使用できません。 比較のコストについては触れられていません。私はそれを無視することができると思います、または2つ、たとえばビットの自然数を比較することもを要すると仮定することができます。nnnO(1)O(1)O(1)nnnO(1)O(1)O(1)O(1)O(1)O(1)O(n)O(n)O(n)nnnO(1)O(1)O(1) 私のアルゴリズムO(n2)O(n2)O(n^2): ビットの数の範囲を決定の: したがって、 t_1 \ triangleq \ lfloor \ frac {n-1} {2} \ rfloor + 1 \ le t \ le \ lceil \ frac {n} {2} \ rceil + 1 \ triangleq t_2。ttt⌈N−−√⌉⌈N⌉\lceil \sqrt{N} \rceil2n−12≤N−−√≤2n2⇒2⌊n−12⌋≤⌈N−−√⌉≤2⌈n2⌉2n−12≤N≤2n2⇒2⌊n−12⌋≤⌈N⌉≤2⌈n2⌉2^{\frac{n-1}{2}} …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.