-1
A
回答
1
A Binary Search Tree(修改爲每個節點存儲從該節點的子樹的大小)應該做的伎倆。
查找第k個最大將花費O(log n)
時間。
添加,刪除和更新(刪除,然後添加)將分別採取< = O(log^2 n)
時間(或可能只是O(log n)
)。
根據查找數據的方式,您可能需要一個帶有指向BST(用於更新操作)指針的數組或散列映射。
查找第k個最大的看起來像:
Node findKthLargest(Node node, int k)
if (node.left != null)
if (k <= node.left.count)
return findKthLargest(node.left, k)
else
k -= node.left.count
if (k == 0)
return node
if (node.right != null)
return findKthLargest(node.right, k)
,因爲它不能深入瞭解這兩種left
和right
,很明顯地看到,只需要O(log n)
時間。
添加,刪除和更新將不得不修改子樹的適當計數,但只能修改樹中較高的子樹。由於使用平衡二叉搜索樹,這些操作(不進行計數修改)每個都需要O(log n)
時間,並且在修改計數時,在O(log n)
的每個步驟中只需要執行O(log n)
個額外工作(在樹上),顯然它可以不要超過O(log^2 n)
。
+0
哇。真的謝謝,我會嘗試自己實現它。 – Sayakiss 2013-05-09 09:18:48
相關問題
- 1. 高效地合併大字典集合
- 2. MongoDB:如何從集合中找到第n個最高工資
- 3. 查找包含最多集合的大小爲K的集合
- 4. 如何從集合列表中找到最大集合或超集合(最大集合不是集合中列表中的另一集合的集合)
- 5. 如何有效地追蹤集合中最小的元素?
- 6. 得到集合中的最大集合
- 7. 在Python中查找n個最大的集合集合
- 8. 找到一個集合中最常見/最常見的元素?
- 9. 如何高效匹配大型集合
- 10. 如何找到在集合元素的索引,而不jQuery的
- 11. 找到第2個元素中第k個元素的最大值
- 12. 找到第k個最小元素
- 13. 查找n個排序元素的中間k組合的高效方法
- 14. K-子集最大的變化
- 15. 找到列表中第K個最大元素的程序
- 16. 排列中第k個最大元素
- 17. 如何在數組中找到最大k個元素?
- 18. 如何將一個集合劃分爲K個子集,這樣子集中元素的總和最小?
- 19. 如何在Java中遞歸地生成N元素集合中的所有k元素子集
- 20. 如何在地圖中有效地找到一組集合的子集?
- 21. 添加到集合中的Rails元素在集合中找不到
- 22. 可能在集合中有子集合?
- 23. 如何高效地獲取包含多個嵌套集合的集合
- 24. 選擇集合中的隨機元素
- 25. 獲得集合的第n個元素
- 26. 爲了實現從第一個元素到最後一個漸變而繪製的元素集合
- 27. 綁定一個ListBox到集合中的元素集合
- 28. Linq:在集合中查找元素
- 29. 在集合中查找元素
- 30. 如何:在Java中找到兩個集合之間的集合差異
看看http://en.wikipedia.org/wiki/Selection_algorithm – srikanta 2013-05-09 08:38:18
@srikfreak,但元素可能會有所不同?我知道O(n)的選擇... – Sayakiss 2013-05-09 08:40:07
@DKK BST可能太慢了嗎?可能需要O(n)來完成查詢或更新。而且它只是在計算複雜度上搜索集合一樣慢。 – Sayakiss 2013-05-09 08:41:57