請推薦一個O(logn)刪除的數據結構,並且我需要索引O(1)或O(logn)中數據結構中的元素。在O(logn)O(logn)刪除和索引訪問的數據結構
0
A
回答
2
大多數自我平衡有序的二叉樹可以被修改,以保持每個節點的孩子數量,並保持每個操作的lg(n)時間是非常容易的。
它們明確修改每個操作少於lg(n)個節點,並且根據我的經驗,它們修改的節點通常是「垂直相關的」。它不是免費的,但它往往不昂貴。
一旦你有樹的節點,找到n
個元素的數據很容易(如果n
是更大然後#在左子樹,從n
減去#左子樹和遞歸到右子樹,否則遞歸到左子樹中,保持不變n
)。
這也適用於非二元自平衡樹,如B樹。
據我所知,沒有std
容器支持隨機對數刪除,插入和索引操作。我找了一回。我也對boost進行了快速檢查,甚至查看了多索引容器,並且找不到一種方法來實現它。
腳註:
當你修改你想要得到一個節點的孩子的數量的成本是一棵樹O(1)在節點上,你必須從修改節點你的變化一直到根。每個修改節點至多有lg(n)個。但是,如果節點彼此「垂直相關」,則需要修復的節點在每個節點更改上幾乎都是相同的。另一方面,假設你的樹重新平衡算法以某種方式設法修改lg(n)完全不相關的節點,成本將高達lg(n)* lg(n)來維持計數。
相關問題
- 1. 通過O(logn)訪問和O(logn)插入實現數據結構?
- 2. 是O(LogN)== O(3LogN)?
- 3. 爲O蟒蛇heapq刪除(LOGN)
- 4. 比較O((logn)!)和O(2^n)
- 5. 時間複雜度:O(logN)或O(N)?
- 6. BIg O符號:n * logn
- 7. 查找第n個fib數,在O(logn)
- 8. O(logn)中從0〜N的位計數
- 9. O(logn)時間和算法關係
- 10. 查找RBTREE在O(LOGN)的算法
- 11. 添加,刪除的O型插接件(LOGN)
- 12. dificulty解決O(logn)中的代碼
- 13. 爲什麼deleteMin的堆取O(logn)?
- 14. O(logn)^ 2時間表現的示例
- 15. 分鐘堆比O(logn)增加鍵好?
- 16. 用於刪除O(logN)中小於k的元素的數據結構其中N是元素數
- 17. 運行時間爲O(logn)的二進制數除算法
- 18. 查找O(nlogn)和O(logn)附加空間中的最小正數
- 19. 這段代碼是O(n)還是O(logn)?
- 20. 爲什麼TreeSet迭代O(n)而不是O(n * logn)?
- 21. 哪一個更好? O(n^1/2)或O(logn)
- 22. 在Elixir中進行二元搜索O(logN)?
- 23. 如何刪除在ArrayList中重複的元素在O(LOGN)時間
- 24. 在O(logn)運行時間中通過數組?
- 25. 這個解決方案的時間複雜度是O(N)還是O(LogN)?
- 26. 在O(logn)時間使用STL堆執行減少鍵
- 27. 給出一種預處理方法,允許您在O(logn)
- 28. 證明是n +(logn)時間^ 2是O(n)
- 29. 3Sum算法版本O(N^2 logn)時間
- 30. 數據結構隨機訪問時至少爲O(ln N),刪除時至少爲O(ln N)[NOT DUPLICATE]
聽起來像[二叉樹](http://en.wikipedia.org/wiki/Binary_tree#Deletion)或堆,取決於您的索引訪問需要支持 – nbrooks
爲什麼你需要索引?許多數據結構沒有有意義的索引。索引是否必須保持不變? – svick
按索引,你的意思是「按排序順序獲得第n個元素」? – Yakk