有没有办法在线性时间内加入2个表格?我听说这可以通过另一个数据结构(Hashtable)来完成,但我不确定如何做到这一点。我总是想知道Join会涉及一个交叉产品,因此它是O(n ^ 2)。
答案 0 :(得分:4)
算法:
循环遍历表A.散列所有项目,将它们添加到Join数组中 循环遍历表B,检查每个项目是否在哈希表中(Check-O(1)),如果没有,则添加到Join表。
答案 1 :(得分:2)
如果在连接中使用的列上有可用的索引,则它是线性的,因为索引允许对两个表进行有序遍历。 (当然,这还没有计算摊销的指数成本。)
散列连接将是线性排序的,尽管散列本身并不是免费的,并且当涉及的密钥很长时,成本也会上升。
答案 2 :(得分:2)
这取决于联接的类型。交叉连接总是O(n ^ 2),因为它必须产生O(n ^ 2)个记录。如果采用正确的数据结构,则可以以更好的复杂度(O(n log(n))或甚至可能摊销的O(n)来完成等连接。
答案 3 :(得分:2)
您可以使用哈希表将两个表连接到O(n)附近,以根据另一个表的ID在一个表中查找记录。
嗯,实际上操作将接近O(n + m),其中 n 和 m 是两个表中的项目数。您首先遍历一个表中的记录以从该表中的键构建哈希表,然后您将遍历另一个表以在哈希表中为每个记录查找匹配。
查找哈希表中的项目不是O(1)操作,但它已关闭。使用更多数据,您将有更多的哈希冲突,因此一些查找需要进行多次比较。
答案 4 :(得分:1)
主要数据库供应商很久以前就弃用了哈希索引。因此,在O(max(n,m))时间内连接2个表在实践中确实无关紧要。使用标准B树索引,连接复杂度为O(min(n,m)* log(max(n,m))。