我試過對給定元素進行二進制搜索,並向左向右遍歷它,直到它獲得大於或小於它的元素爲止,但是如果所有元素都相同,它將一直持續到O(n)時間複雜度。有更好的算法嗎?更好的算法可以找到一個元素的重複次數,給定一個重複了任何no的元素的排序數組。時間
3
A
回答
5
您可以使用二進制搜索來查找範圍的下限(和/或上限),並執行二進制搜索以查找下限,以及元素範圍的上限或下限一個比你關心的還要大。
編輯:我發現的下界的大部分代碼是(我相信)比真正必要的更復雜一點。
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
做兩個二進制搜索:
在第一個搜索你選擇的左半部分,如果中間元素等於尋求元素。
在第二個搜索中,如果中間元素等於搜索元素,則選擇右半部分。
示例代碼在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
of n
類型的元素T
。那麼對於某些元素x
你可以找到它的重複次數爲:
T* ub = upper_bound(a, a + n, x);
int answer = ub - lower_bound(a, ub, x);
的複雜性顯然是O(logn)
。當所有元素相同或者a
中沒有元素x
時,upper_bound
將返回到a+n
和lower_bound
將在整個區間工作,這將在這些最壞情況下進行2 * logn
迭代。
相關問題
- 1. 如何計算數組中重複元素的重複次數?
- 2. 數組算法中的重複元素
- 3. 找到數組中的一個非重複元素?
- 4. 查找給定數組中的兩個重複元素
- 5. 查找給定數組中的2個重複元素
- 6. 元素按重複一定次數
- 7. 在一個元組內重複元素
- 8. 查找特定元素的數組與重複元素
- 9. Vue.js - 重複一個元素的特定次數
- 10. 查找數組中的重複元素?
- 11. 查找數組中的重複元素
- 12. 如何沿兩個軸重複一個數組的元素?
- 13. 如何計算一維數組中重複元素的數量?
- 14. 找到重複元素XOR運算符數組中的兩個非重複元素?
- 15. 通過其中一個元素重新排序數組元素
- 16. 查找兩個數組之間的重複元素
- 17. 伍重複一個元素多次
- 18. 查找在數組中找到的第一個重複元素的索引
- 19. JavaScript重複元素的計數次數
- 20. 任何更好的從線性數組中刪除重複元素的方法?
- 21. 大多數重複元素的數組的快速排序算法?
- 22. 給定一個排序數組,找到重複值的最大子數組
- 23. 編寫一個算法來查找數組中最常出現的元素。給算法的時間複雜性
- 24. 計算元素在一個序列中重複的次數(在R中)
- 25. 給定數組中數組元素的最長重複子集
- 26. 數組重複元素
- 27. PHP組重複數組中的元素
- 28. 定位一個重複元素--CSS
- 29. 制定一個算法來查找在2n數組中重複n次的元素
- 30. 重複在多個元素的函數
類似的問題在這裏,有一些信息和鏈接如何找到下限。上限是相似的。 http://stackoverflow.com/questions/6443569/implementation-of-c-lower-bound/ –