タグ付けされた質問 「algorithm-analysis」

5
分割統治アルゴリズム– 2つ以上の部分に分割してみませんか?
クイックソートやマージソートなどの分割統治アルゴリズムでは、入力は通常(少なくとも入門テキストでは)2つに分割され、2つの小さなデータセットは再帰的に処理されます。データセット全体を処理する作業が半分以下で済む場合、これにより問題の解決が速くなるというのは理にかなっています。しかし、データセットを3つの部分に分割してみませんか?四?n? データを多くの多くのサブセットに分割する作業は価値がないと思いますが、2つのサブセットで停止する必要があるという直感が欠けています。 また、3ウェイクイックソートへの多くの参照を見てきました。これはいつ高速ですか?実際には何が使用されていますか?


5
アルゴリズム:O(n)とO(nlog(n))を合計するにはどうすればよいですか?
重複を見つけて削除する次のアルゴリズムがあります: public static int numDuplicatesB(int[] arr) { Sort.mergesort(arr); int numDups = 0; for (int i = 1; i < arr.length; i++) { if (arr[i] == arr[i - 1]) { numDups++; } } return numDups; } これの最悪の場合の時間の複雑さを見つけようとしています。私はマージソートが知っているnlog(n)し、私のforループではデータセット全体を反復処理しているので、それはとしてカウントされnます。しかし、これらの数値をどうするかはわかりません。合計するだけですか?もしそうするなら、どうすればいいですか?

8
ソートされたデータを必要とするバイナリ検索が線形検索よりも優れていると考えられるのはなぜですか?
線形検索は単純なアプローチであり、漸近的な複雑さのために、バイナリ検索はパフォーマンスよりも優れているといつも聞いています。しかし、バイナリ検索の前に並べ替えが必要な場合、線形検索よりも優れている理由を理解できませんでしたか? 線形検索はでO(n)あり、バイナリ検索はO(log n)です。これが、バイナリ検索の方が優れていると言う根拠のようです。ただし、バイナリ検索ではO(n log n)、最適なアルゴリズムのためのソートが必要です。したがって、ソートが必要なため、バイナリ検索は実際には高速になりません。 著者は、単純な線形検索アプローチを使用するよりも挿入ソートで、アイテムを挿入する必要がある場所を見つけるためにバイナリ検索を使用する方が良いと示唆するCLRSを読んでいます。この場合、各ループ反復で、バイナリ検索を適用できるソート済みリストがあるため、これは正当化されているようです。しかし、検索が必要なデータセットについての保証がない一般的なケースでは、ソート要件のために実際にバイナリ検索を使用していないのは線形検索よりも悪いですか? 私が見落としている実用的な考慮事項はありますか?または、ソートに必要な計算時間を考慮せずに、バイナリ検索は線形検索よりも優れていると見なされますか?

2
2N lnNを理解しようとすると、クイックソートが比較されます
SedgewickのAlgorithmsブックでクイックソートの分析を行っていました。彼は、N個の異なる項目の配列をソートしながら、クイックソートで比較の数について次の繰り返し関係を作成します。 私はこれを理解するのに苦労しています...任意の要素がピボットになるには1 / Nの確率がかかり、kがピボットになると、左のサブアレイにはk-1個の要素があり、右のサブアレイには配列にはNk個の要素が含まれます。 1.パーティション分割のコストはどのようにN + 1になりますか?パーティション分割を行うのにN + 1回比較しますか? 2.Sedgewickは、kの各値について、それらを合計すると、分割要素がkである確率+上記の式を得る2つのサブアレイのコストを言います。 数学の知識が少ない人(私)が理解できるように、誰かがこれを説明できますか? 具体的には、方程式の2番目の項をどのように取得しますか? その用語の正確な意味は何ですか?

7
Big Oh表記は定数値に言及していません
私はプログラマーであり、アルゴリズムを読み始めたばかりです。表記法、つまり、Bog Oh、Big Omega、およびBig Thetaに完全には納得していません。その理由は、Big Ohの定義によるもので、関数f(x)が常にf(x)以上になるように関数g(x)が存在する必要があることを示しています。または、n> n0のすべての値に対してf(x)<= cn。 定義に定数値を記載しないのはなぜですか?たとえば、関数6n + 4の場合、O(n)と表記します。しかし、定義がすべての定数値に当てはまることは事実ではありません。これは、c> = 10およびn> = 1の場合にのみ有効です。cの値が6よりも小さい場合、n0の値は増加します。では、なぜ定義の一部として定数値に言及しないのでしょうか?

2
2 ^ sqrt(n)の時間計算量
私はアルゴリズムの質問を解決していますが、私の分析では、O(2 ^ sqrt(n))で実行されます。どれくらい大きいの?O(2 ^ n)と同等ですか?まだ非多項式時間ですか?

1
ダメラウ・レヴェンシュタインの改善の可能性は?
最近、Wikipediaの疑似コードからDamerau-Levenshtein距離アルゴリズムを実装しました。私はそれが動作します正確にどのように任意の説明を見つけることができなかったとの擬似コードは次のように完全に情報価値がない変数名を使用してDA、DB、i1、そしてj1左のように私は私の頭を掻きます。 Pythonでの実装は次のとおりです。https://gist.github.com/badocelot/5327337 Pythonの実装は、プログラムをウォークスルーして何が起こっているのかを理解し、変数の名前をよりわかりやすい名前に変更するのに役立ちました。私は、私が参照枠を持っているレーベンシュタイン距離を計算するためのワーグナーフィッシャーアプローチに十分に精通していました。 過度に長くなるおそれがあるので、ここに私がダメラウ=レヴェンシュタインを理解する方法を示します。 ミステリー変数: DA(last_row私のコードでは)は、各要素が表示された最後の行を保持する一種のマップです。私のコードでは、それは実際のPython辞書です DB(last_match_col)は、現在の行の文字がb一致する最後の列を保持しますa i1(last_matching_row)は、DA現在の文字の行番号ですb j1更新される前のDB/ の値の単なるコピーlast_match_colです。私のコードでlast_match_colは、更新された場所に移動してこの変数を削除しました 転置コスト: H[i1][j1] + (i-i1-1) + 1 + (j-j1-1) で現在の文字スワップのコスト計算されてbの最後の文字とbであることが知られてa追加または削除のどちらかとの間のすべての文字を処理すること、(最後の試合を)。 コストの要素: H[i1][j1] 転置を見つけると以前の作業が無効になるため、基本コストを転置前の計算のポイントに戻します。 (i-i1-1) 現在の行と現在の文字に一致する最後の行の間の距離であり、これは必要な削除の数です (j-j1-1) 現在の列と一致する最後の列の間の距離、つまり追加の数 余分なもの+ 1は、転置自体のコストです この分析が正しくない場合は、どこに問題があるのか​​を知りたいです。言ったように、アルゴリズムがオンラインでどのように機能するかについての詳細な説明は見つかりませんでした。 改良版? しかし、それを理解して、転置された文字間の追加と削除の両方のコストを計算することには欠陥があるように思われたことに感銘を受けました。1つの追加と1つの削除は置換に相当し、これはチェックしていません。 それがすべて正しい場合、解決策は簡単です。転置された文字間の文字のコストは、追加と削除のどちらか高くなるはずです。できるだけ多くを置換に変換し、残っている追加または削除を追加します。 したがって、コストは次のようになります。 H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1 これがこのバージョンの私のコードです:https : //gist.github.com/badocelot/5327427 いくつかの簡単なテストから、これは正しいようです。たとえば、 "abcdef"-> "abcfad"は編集距離を2(転置 "d"と "f"、 "e"を "a"に変更)しますが、元のアルゴリズムは距離を3(最後の3つ)にします。文字は置換、または1つの転置+ 1つの追加+ …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.