有沒有辦法在線性時間內連接2個表格?我聽說這可以通過另一個數據結構(Hashtable)來完成,但我不確定如何做到這一點。我一直在想一個Join會涉及一個交叉產品,因此它是O(n^2)。在O(n)時間執行連接?
回答
算法:
循環遍歷表A.將所有項目散列,將它們添加到Join數組中。
循環遍歷表B,檢查每個項目是否在散列表中(Check-O(1)),如果沒有,則添加到聯接表。
這取決於連接的類型。交叉連接總是會是O(n^2),因爲它必須產生O(n^2)個記錄。如果使用正確的數據結構,可以使用更好的複雜性(O(n log(n))或甚至可以攤銷O(n))來完成等連接。
我一直在尋找自然連接的時間複雜度 – Shankar 2011-04-05 20:25:09
連接的類型並不重要。用兩個不相交列表爲每個記錄添加一個值爲0的共同虛擬列。自然連接的複雜性仍然是二次的,因此是最壞情況的估計。 – 2011-04-13 22:36:11
您可以通過使用散列表在另一個表的ID中查找記錄,以接近O(n)的方式連接兩個表。
嗯,實際上該操作將接近爲O(n + m),其中Ñ和米是在兩個表中的項數。您將首先遍歷一個表中的記錄以從該表中的鍵構建哈希表,然後循環遍歷另一個表以在每個記錄的哈希表中查找匹配項。
查找散列表中的項目不是O(1)操作,但它很接近。隨着更多的數據你會有更多的散列衝突,所以一些查詢需要做多個比較。
非常感謝回覆 – Shankar 2011-04-05 20:28:12
很久以前,主要的數據庫供應商不推薦使用散列索引。因此,在O(max(n,m))時間內連接2個表格實際上並不重要。對於標準B樹索引,連接複雜度爲O(min(n,m)* log(max(n,m))。
- 1. O =(N²)執行十次時較慢?
- 2. 井字減少運行時間O(N)
- 3. O(n)的運行時間算法
- 4. Python腳本:如何判斷在O(N)或O(N^2)時間?
- 5. 時間複雜度 - O(n^2)到O(n log n)搜索
- 6. 時間複雜度O(N日誌(log n)的)+ N O(L)
- 7. 時間複雜度:O(logN)或O(N)?
- 8. O(nlog * n)和O(n)之間?
- 9. haskell長度運行時間O(1)或O(n)
- 10. 排序在O(n + mlogm)時間陣列
- 11. SQL內部連接,執行時間
- 12. 下面的函數是O(n)時間和O(1)空間,其中n = | A |?
- 13. 查找具有O(n)的時間和O(1)空間
- 14. 找到O(1)的空間和O(n)的時間
- 15. 紅黑樹:在log(n)時間中拆分/連接時間
- 16. 快速排序在O(n^2)時間內運行?
- 17. Binomial堆:證明合併運行在O(日誌n)時間
- 18. O(3^n)指數時間複雜度
- 19. 圖的O(m + n)時間算法
- 20. O(nlogn)+ O(n),O(nlogn)和O(nlogn + n)之間的關係是什麼?
- 21. O(log_2(n))= O(log_10(n))?
- 22. Big O - O(N^2)or O(N^2 + 1)?
- 23. 證明最大(O(f(n)),O(g(n)))= O(max(f(n),g(n))
- 24. 如何確定的時間複雜度爲O(M + N)或O(Math.max(M,N))
- 25. 在O(n)
- 26. 在O(N)
- 27. 使用N個線程執行後查找執行時間
- 28. 如何根據與dplyr的時間間隔執行連接?
- 29. Ideal跳過列表? O(n)運行時間?
- 30. 什麼是運行時間?它是O(n)嗎?
檢查這一個http://en.wikipedia.org/wiki/Hash_join – Andrey 2011-04-05 20:21:13
[A (http://oreilly.com/catalog/9780596005733) – Pointy 2011-04-05 20:22:02
@Andrey和@Pointy:非常感謝你的鏈接:) – Shankar 2011-04-05 20:23:54