![]() |
1
3
您可以使用一个从代表性元素到其他元素列表/向量/deque的映射。这就需要在插入容器时进行相对较少的比较,这意味着您可以在不需要执行任何比较的情况下迭代生成的组。
这个例子总是将第一个有代表性的元素插入到映射的deque存储中,因为它使通过组进行的后续迭代在逻辑上变得简单,但是如果这个重复证明了一个问题,那么只执行
然后,遍历这些组(相对而言)既简单又便宜:
我做了一些比较和对象计数的实验。在以100000个随机顺序组成50000组(即每组2个对象的平均值)的对象进行的测试中,上述方法的比较和复制次数如下:
(我试着减少副本的数量,但实际上是以牺牲比较为代价的,这在您的场景中似乎是成本较高的操作。) 使用多映射,并在最终迭代中保留上一个元素以检测组转换,这会导致以下代价:
使用单个列表并弹出前面的元素并对其他组成员执行线性搜索成本:
是的,这是我的最佳方法的~1.9b与~1.6m的比较。要使list方法在接近最佳比较数的任何地方执行,必须对其进行排序,这将花费与构建固有排序的容器相似的比较数。 编辑 我使用了您发布的代码,并对我以前使用的相同测试数据集运行了隐含算法(我必须对代码做一些假设,就像一些假设的定义那样),我计算了:
也就是说,与我的哑列表算法的比较数量完全相同,但是有更多的副本。我认为这意味着我们在这个案例中使用了基本相似的算法。我看不到任何其他排序顺序的证据,但看起来您需要一个包含多个等效元素的组列表。这可以在我的
我仍然看不到任何证据表明,像这张Deques地图这样的分类容器并不是一个好的(即使不是最佳的)策略。 |
![]() |
2
13
是的,你可以做得更好。
编辑您使用的方法似乎可以进行o(n^2)比较:
所以对于长度5,你要做4+3+2+1=10的比较;对于长度6,你要做15,等等(n^2)/2-n/2是精确的。n*对数(n)较小,对于任何合理较高的n值。 你的箱子里N有多大? http://img188.imageshack.us/img188/7315/foou.png 就减少哈希冲突而言,最好的方法是获得一个更好的哈希函数-d。假设这不可能,如果您可以生成一个变量(例如,不同的模),您可能可以执行嵌套哈希。 |
![]() |
3
7
1。最坏情况下对数组o(n log n)排序-mergesort/heapsort/binary tree sort等 2。比较邻居并把火柴拔出O(N) |
![]() |
4
5
将基于哈希表的结构从值保持为计数;如果C++实现不提供
|
![]() |
5
1
你试过分类吗?例如,使用像快速排序这样的算法?如果性能对您足够好,那么这将是一个简单的方法。 |
![]() |
6
1
如果已知为整数列表,并且知道它们都在a和b之间(例如a=0,b=9),则生成b-a元素数组,并创建b-a容器。 在非常特殊的情况下(普通整数列表),我建议您只计算它们,因为您无论如何都不能区分不同的整数:
如果他们 是 可区分,创建一个列表数组,并将它们添加到相应的列表中。 如果它们不是数字,请使用std::map或std::hash_map,将键映射到值列表。 |
![]() |
7
0
最简单的方法可能是对列表进行排序,然后迭代查找dup。 如果你对数据有所了解,更有效的算法是可能的。 例如,如果您知道列表很大,并且只包含1到n之间的整数,其中n相当小,则可以使用一对布尔数组(或位图),并执行如下操作:
现在,许多[]包含一个数组,其中的值被多次看到。 |
![]() |
8
0
大多数提到散列/无序映射解决方案的人都假设O(1)插入和查询时间,但这可能是O(n)最坏的情况。此外,还可以减少对象散列的成本。 就我个人而言,我会将对象插入到一个二叉树中(每个插入一个O(logn)),并在每个节点上保持计数器。这将产生O(nlogn)构造时间和O(n)遍历,以标识所有重复项。 |
![]() |
9
0
如果我正确理解了这个问题,那么这是我能想到的最简单的解决方案:
总运行时间:
注意,这取决于输入是一个向量。只有随机访问迭代器在第二个过程中具有对数复杂性。双向迭代器是线性的。 这不依赖于散列(按要求),它保留了所有原始元素(而不仅仅是为每个组返回一个元素,以及它发生的频率计数)。
当然,一些较小的常量优化是可能的。
根据假设的群体规模,
|
![]() |
10
0
只是为了说明我在三重存储的正常化过程中遇到了同样的问题。我使用Allegro Common Lisp的散列表功能实现了由Charles Bailey总结的方法3,该方法在Common Lisp中。 函数“agent equal?”用于测试TS中的两个代理是否相同。函数“merge nodes”合并每个集群上的节点。在下面的代码中,“…”用于删除不太重要的部分。
|
![]() |
11
0
由于C++ 11,哈希表是由STL提供的。
std::unordered_map
.
所以O(N)解决方案是将您的值放入
|
|
user3370507 · 如果存在,在MySQL中重复行 11 年前 |
|
Logic9 · .csv数据到Python中的字典中:重复值 11 年前 |
![]() |
M.Qasim · 如何查看具有一个或多个NA的重复记录? 12 年前 |