私は与えられた要素のバイナリ検索を試みて、それよりも大きいか小さい要素を得るまで左と右にそれを横断しましたが、すべての要素が同じならO(n)時間の複雑さまで進みます。どんなに良いアルゴもありますか?要素の繰り返し数を見つけるためのより良いアルゴリズム。時間の
3
A
答えて
5
範囲の下限(および/または上限)を検出し、下限、および範囲の要素の上限または下限のいずれかをバイナリ検索するバイナリ検索を使用できますあなたが気にするものより1つ大きい
編集:私が下限を見つけるために見たコードのほとんどは、実際に必要なものよりも少し複雑です(私は信じています)。中央の要素が求め要素に等しい場合は、左半分を選択する最初の検索では
:
int *find(int *left, int *right, int val) {
assert(left<right);
while (left < right) {
int *middle = left + (right - left)/2;
if (*middle < val)
left = middle + 1;
else
right = middle;
}
return left;
}
3
は、2件のバイナリ検索を行います。
中間の要素が検索される要素と等しい場合は、右の半分を選択します。 Javaで
サンプルコード:
class Test {
public static int findElem(int[] arr, int elem, int l, int h,boolean first) {
if (h - l <= 1)
return first ? (arr[l] == elem ? l : h) : (arr[h] == elem ? h : l);
int m = l + (h - l)/2;
if (arr[m] < elem || (arr[m] == elem && !first))
return findElem(arr, elem, m, h, first);
return findElem(arr, elem, l, m, first);
}
public static int findElem(int[] arr, int elem, boolean first) {
return findElem(arr, elem, 0, arr.length, first);
}
public static void main(String[] args) {
int[] arr = { 0, 1, 2, 2, 2, 3, 3, 4, 4, 5 };
int elem = 2;
System.out.println("First index: " + findElem(arr, elem, true));
System.out.println("Last index : " + findElem(arr, elem, false));
}
}
1
あなたがすべき最初に、あなたのマッチングシーケンスの最後の要素のためのバイナリ検索。 C++を使用している場合は、STLにlower_bound
とupper_bound
のような機能があります。それ以外の場合は、アルゴリズムの単純な変更です。
また、あなたは3件のバイナリ検索し使用することができます:
- バイナリ検索を の右側のため
- バイナリ検索範囲
ただし、最後の2を実行できるということは、最初の解決策を達成したことを意味します(下限/上限を見つけることによって)
0
これを複数回実行する場合は、要素値をキーとして、最初と最後の要素のインデックスを値としてハッシュテーブルを作成できます。
ハッシュテーブルを作成するためにデータを読み取る操作はO(n)ですが、インデックスを参照する操作はO(1)操作に近いものです。
0
並べ替えられた配列a
がn
タイプのT
であるとします。次のように特定の要素にx
あなたはそれの繰り返しの数を見つけることができます:
T* ub = upper_bound(a, a + n, x);
int answer = ub - lower_bound(a, ub, x);
複雑さが明らかにO(logn)
です。すべての要素が同じであるか、またはx
がa
にある場合、upper_bound
はa+n
に戻り、lower_bound
は完全な間隔で動作し、これらの最悪のケースでは2 * logn
の反復を行います。
関連する問題
- 1. アンドロイド(アレイは、数字を繰り返し見つけるための方法)
- 2. 最大公約数を見つけるための線形時間アルゴリズム
- 3. AndroidのSQLiteの繰り返し要素
- 4. 子要素のidの繰り返し
- 5. 複数の繰り返しの間に1回繰り返した後にCSS3アニメーションを一時停止する
- 6. 変数を繰り返し確認するためのより良い方法をお探しください
- 7. WPFの繰り返し要素
- 8. で文字列の繰り返し文字を見つける
- 9. 繰り返しのイベントシーケンスを見つける方法
- 10. トップk要素を見つけるための平均時間複雑度
- 11. 時間単位あたりの繰り返し回数を制限する
- 12. 2つの数字の間の素数を見つける高速アルゴリズム
- 13. 繰り返し要素を持つ配列内の最大値を見つける
- 14. 数字のシーケンスの最後に繰り返しシーケンスを見つける
- 15. Rデータフレームの要素を繰り返す
- 16. Linqを使用して連続して繰り返す要素を見つけよう
- 17. 残り時間を見つける
- 18. BTreeMapからのアイテムの削除を繰り返して見つけました
- 19. 繰り返しが必要なhadoopの良い例
- 20. 2回繰り返された長時間の幅広い
- 21. 2Dアレイにおけるそのneigboursの最も小さい要素を見つけるための線形時間アルゴリズムを探す
- 22. 繰り返し要素を持つリストを生成
- 23. 繰り返し実行を見つけて壊れます
- 24. 複数の要素を見つける
- 25. 指定されたクラスのオブジェクトを見つけるためにコンテナとコンポーネントを繰り返す/繰り返しますか?
- 26. 繰り返し要素を持つ無限列
- 27. Pythonは重複/繰り返し要素を持つ "set"
- 28. コレクションを繰り返し処理し、1ではなく複数の値を見つけるより良い方法
- 29. 行を見つけて削除するループを繰り返す
- 30. "良い"隣人 - グラフの色付けを見つけるアルゴリズム?
同様の質問、ここでいくつかの情報とリンクを使って下限を見つける方法。上限は似ています。 http://stackoverflow.com/questions/6443569/implementation-of-c-lower-bound/ –