![]() |
1
3
我的头是说这是关于秩序(2n ln n)。 把它和一粒盐一起吃。 |
![]() |
2
2
如果可以对集合中的元素进行排序,则可以使用 Mergesort 在集合上。唯一需要的修改是在合并阶段检查重复项。如果找到了,只需丢弃副本。由于mergesort是O(n*log(n)),与naive O(n^2)算法相比,这将提供潜在的速度。 但是,为了真正有效,您应该维护一个排序集并保持它的排序,这样您就可以跳过排序阶段并直接进入合并阶段。 |
![]() |
3
1
一个旁注:这取决于这种情况发生的频率。如果大多数集合对 做 至少共享两个元素,在进行比较的同时构建新的集合可能是最有效的,如果它们不匹配条件,则将其丢弃。如果大多数配对 不 共享至少两个元素,然后推迟新集合的构建,直到确认条件可能更有效。 |
![]() |
4
1
我不明白这是如何在小于0(n^2)的时间内完成的。 每个集合都需要与其他集合进行比较,以查看它们是否包含2个或更多共享元素。这是n*(n-1)/2比较,因此o(n^2),即使检查共享元素需要恒定的时间。 在排序中,幼稚的实现是O(n^2),但您可以利用有序比较的传递性(例如,您不知道Quicksort的下分区中的任何内容都需要与上分区中的任何内容进行比较,因为它已经与Pivot进行了比较)。这就是排序结果是O(n*log n)。 这里不适用。所以,除非集合中有一些特殊的东西,可以让我们根据之前的比较结果跳过比较,一般来说它是O(n^2)。 保罗。 |
![]() |
5
0
如果您的元素本质上是数字的,或者可以自然排序(例如,您可以指定一个值,如1、2、42等),我建议对合并集使用基数排序,并进行第二次传递以获取唯一的元素。 该算法应该是O(N),您可以使用位移位运算符和位掩码对基数排序进行相当大的优化。我为一个我正在做的项目做了类似的工作,它的工作方式很有魅力。 |
![]() |
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 7 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 7 月前 |
![]() |
b39b332d · 使用C++标准库实现高效间隔存储 11 月前 |
![]() |
Paul C · 在维基百科上,将二叉搜索树转换为排序链表的算法是否存在错误? 11 月前 |
![]() |
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 11 月前 |
![]() |
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 12 月前 |