GroupBy操作的渐近复杂性是什么?

时间:2011-02-03 17:47:48

标签: sql linq complexity-theory big-o

我对未编制索引的数据集上的GroupBy操作的渐近复杂度(大O)感兴趣。最着名的算法的复杂性是什么?SQL服务器和LINQ使用的算法的复杂性是什么?

3 个答案:

答案 0 :(得分:3)

忽略group by正在处理的基本SQL,当提交给GROUP BY操作本身时,复杂性只是O(n),因为数据是按行扫描并在一次传递中聚合。它线性缩放为n(数据集的大小)。

当将Group By添加到复杂查询中时,等式发生变化,O(n)成为Group By 添加到整个等式的上限;如果内部复杂查询是这样的,那么在基本查询的解析中,数据已经被排序了。

答案 1 :(得分:1)

可以对已排序的行(n log(n)复杂度)进行一次遍历(n复杂度)分组,因此分组依据的复杂度为n log(n),其中n是行数。如果group by语句中使用的每一列都有索引,则无需排序,复杂度为n。

答案 2 :(得分:0)

关于Linq,我想你想要了解Linq-to-object组的复杂性(Enumerable.GroupBy)。

使用ILSpy检查实现,在我看来它是O(n)。 (.Net Framework 4系列。)

它枚举一次源集合。对于每个元素,它计算其分组键。然后,它检查是否已将哈希表中的密钥映射到元素列表,如果缺少哈希表,则将密钥添加到哈希表中。然后,它将元素添加到哈希表中的相应条目列表中。