从指向任何泛型类型的指针数组中删除重复指针

时间:2014-04-04 15:03:22

标签: c algorithm pointers

是否有一种从数组中删除重复指针的通用方法,例如输入如下:

enter image description here

返回:

enter image description here

不需要知道指针指向的东西的类型吗?

2 个答案:

答案 0 :(得分:4)

我会做以下事情:

  • 对指针数组进行排序 - O(n lg n)
  • 遍历数组,将第一次出现的内容复制到另一个数组 - O(n)

如果对数组进行排序,则跟踪指针是否重复是非常容易的:您只需保存最后复制的数据,不要复制下一个,直到它不同为止。

另一种简单的暴力方法(如果你需要保留原始数组中指针的顺序)将是在数组中向前搜索,用NULL替换重复项。这具有O(n ^ 2)复杂度,但您可能不关心适度的数组大小。例如:

k=0
for(i=0; i<n; i++) {
   if( myarray[i] == NULL ) {
       continue;
   }
   current = myarray[i];
   unique[k] = current;
   k++;
   for(j=i+1; j<n; j++) {
       if( current == myarray[j] ) {
           myarray[j] = NULL;
       }
   }
}

答案 1 :(得分:1)

使用哈希表有帮助,这是一个解决方案预期案例O(N) [不是最坏的情况]。

H = Empty Hash Table

foreach ptr in Array:
    if ptr NOT present in H:
        insert ptr to H

// H now have every ptr only once

wi = 1                    // write index
for ri = 1..n:            // read index
    ptr = Array[ ri ]
    if ptr in H:
        Array[ wi ] = ptr
        remove ptr from H
        wi++