作爲一個例子,假設你有在一個列表中的以下數字在此給定的順序:數據結構<O(n)的元素0的總和查詢多達n
list = [4, 10, 3, 5, 1]
所以列表[0] == 4和列表[4] == 1.
現在想象一下,您需要一個總和查詢,它會告訴您以前所有值的總和,直到給定的位置。
list.sum(0) == 4
list.sum(1) == 14
list.sum(2) == 17
list.sum(3) == 22
list.sum(4) == 23
此外,我想下面的操作,同時仍保持和查詢完整:
list.swap(0, 1) // swap the two positions
list == [10, 4, 3, 5, 1]
list.slideBefore(0, 3) // slides 1st position value to before the 2nd position
list == [4, 3, 10, 5, 1]
list.slideAfter(2, 3) // slide 1st position value to after 2nd position
list == [4, 3, 5, 10, 1]
list.replace(3, 9) // replace value at 1st param with literal value 2nd param
list == [4, 3, 5, 9, 1]
list.append(17) // adds value to end
list == [4, 3, 5, 9, 1, 17]
這可能是由陣列平凡處理。但總和查詢總是O(n)。我希望能夠找到一個數據結構,它將總和查詢保持在O(1)或O(lg n),同時還將上述操作保持在O(1)或O(lg n)。
我相信我可能可以操縱fast array數據結構來完成我想要的功能,但是我沒有完全解決它。
我看到的另一個數據結構是Fenwick樹,但是我不清楚它會工作。
任何建議,想法,技巧或提示?
在此結構下替換爲O(n)。否則,這是非常好的。 – 2010-11-22 23:17:16
我不明白slideBefore或slideAfter可能是O(1)。例如,slideAfter(2,5)將要求您重新計算項目3,4和5的總和。當然,「重新計算」是減去您正在移動的值的問題。如果它是slideAfter(2,1002),那麼您將重新計算1,000個值。此外,任何「滑動」操作本質上都是O(N)操作,因爲您必須移動數組中的數據。 – 2010-11-23 00:06:24