鑑於排序列表
1, 3, 5, 6, 9....
是否有一個快速的算法,而不是O(n)
計算給定範圍內[a, b]
元素的數量,假設所有的數字都是整數?什麼是查找排序範圍內元素數量的最快方法?
回答
這是一個O(log n)算法:使用binary search搜索兩個端點,那麼範圍內的元素數量基本上就是指數的差異。
爲了得到一個需要區分其中該範圍的端點是陣列中與否的情況下的具體數量。
你需要走差異化加一?我認爲這是關閉的。 – templatetypedef
@templatetypedef可能是的,有幾種情況取決於端點是否實際存在於數組中。 – Henry
也假定數據結構是可索引的。例如,如果排序的數據結構是鏈接列表或樹,則不存在索引。 OP說*排序列表* ...在這種情況下,您必須從a遍歷到b。這是(結果 - [a,b]中元素的數量),所以你的總數是log n + log n +(結果 - [a,b]中元素的數量) – thang
由於列表進行排序,你可以找到一個值的位置(或者,如果該值不在列表中,它應該被插入)在O(日誌(n))的時間。您只需在兩端執行此操作,然後減去以獲取範圍內元素的數量。元素是否是整數都沒有區別;該列表只需要進行排序。
你確實需要小心,如果該元素是不是唯一的;在這種情況下,在找到命中後,您可能需要對重複元素序列的末尾進行線性掃描。
lower_bound
和upper_bound
上有序容器操作。
首先找到該範圍中的較低的值,然後從那裏搜索到最後的上限值。函數的實現可能使用二進制搜索:
#include <algorithm>
#include <list>
#include <iterator>
int main() {
using std::list;
using std::upper_bound;
using std::lower_bound;
using std::distance;
list<int> numbers = {1, 3, 5, 6, 9};
int a = 3;
int b = 6;
auto lower = lower_bound(numbers.begin(), numbers.end(),
a);
auto upper = upper_bound(lower, numbers.end(),
b);
int count = distance(lower, upper);
return 0;
}
- 1. 查找數字是否在範圍內的最快方法
- 2. 查找元素是否存在於未排序數組中的最快方法?
- 3. 使用Selenium Webdriver查找元素的最快和最慢的方法是什麼?
- 4. 在未排序列表中查找元素的最有效方法是什麼?
- 5. 排序矢量的最快方法是什麼?
- 6. 使用R查找大量值的最快方法是什麼?
- 7. 什麼是獲得範圍補充的最快方法?
- 8. 排序這些n^2數字的最快方法是什麼?
- 9. 按類別查找角元素的最佳方法是什麼?
- 10. 在桶中查找數字的最快方法是什麼?
- 11. 查找數字最快的方法是什麼?
- 12. 最快方法來創建2D numpy的數組,其元素是在範圍
- 13. 最好的Excel方法來查找範圍內的數組?
- 14. 找出日期是否在特定範圍內的最佳方法是什麼?
- 15. 查找範圍內整數的數量
- 16. 查找範圍內的最大和第二大元素
- 17. 從給定範圍的向量中查找最大元素
- 18. 查找範圍內的素數
- 19. JSF2 - f:ajax元素的範圍是什麼?
- 20. 查找數組中不同元素的數量的最快方法
- 21. 什麼是從IE中刪除DOM元素的最快方法?
- 22. 替換DOM元素(jQuery)的最快方法是什麼?
- 23. 獲取集合元素的最快方法是什麼?
- 24. 什麼是最快的快速排序 - 排序算法的排名表?
- 25. 什麼是少數整數最快的排序算法?
- 26. 查找字符串中唯一元素數量的最快方法
- 27. 驗證數量範圍數組的最有效方法是什麼?
- 28. 什麼是最快的方式來檢查一個數字是否在python的特定範圍內?
- 29. 數組排序方法中的範圍
- 30. 什麼是最快,效率最高的內存和最簡潔的方法來計算3d範圍的點
哪種語言? – sgarizvi
我很好用C/C++,Java或C#。會把語言標籤。提前致謝。 – Chan
'std :: lower_bound'和'std :: upper_bound'?給你比你要求的更多... – Mehrdad