回答
是的,您可以使用二進制索引樹(或段樹)來執行O(logN)
查詢。
https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/ https://en.wikipedia.org/wiki/Fenwick_tree
再一次,救援的數據結構。感謝您的鏈接 – ronakshah725
如果你的稀疏數組作爲一個天真的,本地陣列實現(例如int[999999]
)則比O(n/p)
時間(其中p
是硬件線程你的號碼)手動迭代沒有更快的方法。
如果您的稀疏數組存儲在存儲最佳的格式(例如網頁或鏈表-的-頁的陣列),那麼最快是O(m/p)
其中m
是頁數和p
是多少硬件線程。
UPDATE:
在您的評論你說你想運行比O(n)
更快的單線程解決方案。這是不可能的。考慮這個稀疏陣列:
arr = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ]
計算機不能像一個人的眼睛+大腦一樣「看到」一個陣列。單線程計算機一次只能處理一個字(通常爲32或64位)的數據。所有計算機都知道arr
內有一個數組,因此它開始讀取它,它看到0
,然後它再次讀取0
,依此類推,讀取11 0
s,直到它最終遇到1
值。這是O(n)
解決方案。
唯一能夠解決這個問題的方法是使用並行化:人眼+大腦可以被視爲具有超過576萬個線程(90度人眼has 576 megapixels)的機器,它可以「看到」整個陣列我的StackOverflow即時發佈(O(1)
)。對於一臺計算機做同樣的程序就必須有多個線程(與預編程的數據偏移),它同時讀取數組,然後給你答案:
void Main() {
// Setup the threads
volatile int total = 0;
WaitHandle ev = new WaitHandle();
Int32[] arr;
ev.Reset();
for(int i=0; i < 100; i++) {
(new Thread(delegate() {
int offset = i;
ev.WaitOne();
total += arr[offset]; // assume this is a magic thread-safe increment operation
})).Start();
}
// Load the array
Int32[] arr = new Int32[] { /* 100 values */ };
ev.Set(); // unblock all 100 threads instantly
// assume there's a magic Thread.Join() wait here
Console.WriteLine("Total: {0}.", total);
}
這是唯一的出路以數學上合理的方式得到O(1)
時間來計算稀疏數組的總和。
...然而,即使這是不可能的,因爲沒有「魔術線程安全加法」操作存在。你可以做的最好的是m
- 中間加成操作的級別(其中m
是一些Log[X](n)
的值),但它仍然非常接近O(1)
。
但是'n'是範圍'b-a'的大小,而不是列表的大小,對吧? – Jasper
這是一個有趣的方法。但我真的很感謝單線程解決方案,它具有更低的界限或更好的複雜性。 – ronakshah725
@Jasper'n == b-a'在這種情況下。'n'是「通過搜索項目的數量」的抽象。雖然如果您使用的是存儲優化方法,那麼除非您使用散列表來跟蹤頁面地址,否則您無法在「O(1)」時間尋求任意索引。 – Dai
- 1. 填充稀疏數組
- 2. 在數組中的數據範圍之間填充日期?
- 3. Imagick調整大小,中心和稀疏填充問題
- 4. Haskell中的稀疏數組?
- 5. 稀疏文件中分配範圍的大小和數量有哪些限制?
- 6. 元組的稀疏數組
- 7. O(nlog * n)和O(n)之間?
- 8. 用數組範圍填充數組
- 9. 稀疏數組的長度
- 10. 生成填充值大於1的隨機稀疏矩陣python
- 11. Eigen填充稀疏行與三元組的主矩陣
- 12. VBA從數組中填充範圍
- 13. Scipy稀疏矩陣和稀疏矢量之間的歐幾里德距離
- 14. 在稀疏範圍重複鍵
- 15. 稀疏指數和密集指數之間的差異
- 16. Scipy稀疏...數組?
- 17. 在Python/Cython中的快速n維稀疏數組
- 18. 挑戰:如何高效地填充稀疏Flex ArrayCollection中的數據間隙?
- 19. 關於將稀疏矩陣填充到圖中
- 20. 基於日期範圍的填充點
- 21. 在jQuery getJson函數中填充的數組的範圍
- 22. 檢查n之間的範圍
- 23. 基於Python間隔的稀疏容器
- 24. matlab中的稀疏矩陣數組
- 25. 在特定範圍內填充數組
- 26. 稀疏三元組稀疏矩陣matlab
- 27. 給出範圍X,N間隔和重疊O,計算間隔大小
- 28. O(nlogn)+ O(n),O(nlogn)和O(nlogn + n)之間的關係是什麼?
- 29. 如何將n個數字相加到數組中的給定範圍,並在O(n)時間內顛倒數組中的範圍?
- 30. 如何從獲取的結果對象填充稀疏的UITableView?
你不能做的更好,然後爲O(n)。由於尺寸b - a將始終是形式(n/x),其中x是正數。你將不得不經歷b - a的整個長度。 – Haris
如果我在流中接收數據,我可以構造一棵樹或其他一些結構來提高總和嗎? – ronakshah725