【发布时间】:2015-10-20 04:40:17
【问题描述】:
我正在开发一个瓶颈是 list1.Except(list2) 的应用程序。来自这篇文章:should i use Except or Contains when dealing with HashSet or so in Linq except 的复杂度是 O(m+n) (m 和 n 代表列表的大小)。但是,我的列表已排序。这有帮助吗?
我能想到的第一个实现:
foreach element in list2 (m operations)
look for it in list1 (ln(n) operations)
if present
set it to null (O(1), removing has a O(n))
else continue
它的复杂度为 O(m*ln(n)),当 m 小而 n 大时,这非常有趣(这正是我的数据集的情况:m 约为 50,n 约为 1 000 000 )。然而,它产生 null 的事实可能对使用它的函数有很多影响......有没有办法保持这种复杂性,而不必编写 null(然后跟踪它们)
任何帮助将不胜感激!
【问题讨论】:
-
创建自己的扩展方法,使用BinarySearch?
-
第一件事是你已经注意到这两个东西的行为是不同的。此外,如果您的算法是复杂度 m*ln(n),那么对于大 m 和小 n,乍一看,它看起来将具有大致相同的性能,因此复杂性可能无济于事,您可能只需要对事物进行基准测试和看看哪个表现更好。
-
其实我忘了说m在50左右,n在1 000 000左右
-
@Damien 我想我没有得到你的建议。据我了解,依次遍历两个列表应该是 O(m+n)