在C中删除重复的整数对的有效方法

时间:2018-12-01 16:32:11

标签: c algorithm sorting

我找到了类似问题的答案,但没有一个能准确描述我的问题。 因此冒着被下地狱的风险的可能性,我想知道是否有一种标准方法可以解决我的问题。此外,我可能会问错问题。也许可以通过另一种方式更有效地解决问题。

所以这里有一些背景: 我正在遍历粒子列表。每个粒子都有其相邻粒子的列表。现在,我需要创建一个相互关联的唯一粒子对的列表。 每个粒子都可以用整数来标识。

我应该只是建立一个包括重复项在内的所有对的列表,并使用某种排序和比较器来消除重复项,还是应该首先避免将重复项添加到我的列表中?

性能对我来说真的很重要。我猜大多数循环可能是矢量化和线程化的。平均每个粒子大约有15个邻居,我预计最多将有1e6个粒子。

我确实有一些想法,但是我不是一个经验丰富的编码人员,我不想浪费1周的时间通过对不同情况进行基准测试来测试每种方法,只是发现我的问题已经存在一个标准的方法了。 有什么建议吗?

顺便说一句:我正在使用C。

一些伪代码

for i in nparticles
  particle=particles[i]; //just an array containing the "index" of each particle
                         //each particle has a neightbor-list
  for k in neighlist[i]  //looping through all the neighbors
  //k represent the index of the neighbor of particle "i"
    if the pair (i,k) or (k,i) is not already in the pair-list, add it. otherwise don't

1 个答案:

答案 0 :(得分:0)

由于比较排序的复杂度为O(n log n),因此每次迭代对元素进行排序不是一个好主意。

下一个最好的办法是将项目存储在搜索树中,更好的是二进制搜索树,以及更好的是自均衡的二进制搜索树,您可以在GitHub上找到实现。

即使是更好的解决方案,访问时间也将为O(1),您可以通过2种不同的方式实现这一点,一种是简单的标识数组,在该位置上,如果存在该指针,则可以保存一个指向项目的指针id或定义当前id为空的一些标志。这非常快,但很浪费。您需要O(N)内存。

我认为最好的解决方案是使用集合或has-map。基本上是相同的,因为可以使用哈希映射来实现集。

这是一个github project,带有c哈希映射实现。 和s tack overflow answer到一个类似的问题。