如何计算列表中的唯一项?

时间:2011-03-14 14:15:55

标签: algorithm list count unique items

如何计算列表中唯一项目的数量?

例如说我有{1,3,3,4,1,3}我希望得到数字3,表示列表中唯一项目的数量(即| A | = 3,如果A = { 1,3,4})。有人会使用什么算法?

我尝试过双循环:

for firstItem to lastItem
  currentItem=a
  for currentItem to lastItem
    currentItem=b
    if a==b then numberOfDublicates++
uniqueItems=numberOfItems-numberOfDublicates

这不起作用,因为重复次数比实际需要的次数多。在开头的例子中,它将是:

  1. 对于第一个循环,它会为列表中的数字1计算+1重复。
  2. 对于第二个循环,它会为列表中的数字3计算+2个重复项。
  3. 对于第三个循环,它会再次为数字3重复+1重复(过度计算最后一个'3')和 这就是问题所在。
  4. 关于如何解决这个问题的任何想法?

5 个答案:

答案 0 :(得分:11)

将项目添加到HashSet,然后在完成后检查HashSet的大小 假设你有一个很好的哈希函数,那就是O(n)

答案 1 :(得分:6)

您可以查看该号码后面是否有重复项。如果不增加uniqueCount:

uniqueCount = 0;
for (i=0;i<size;i++) {
  bool isUnique = true;
  for (j=i+1;j<size;j++)
     if (arr[i] == arr[j] {
       isUnique = false;
       break;
     }
  }
  if(isUnique) {
    uniqueCount ++;
  }
}

以上方法的时间为O(N^2),空间为O(1)

另一种方法是对输入数组进行排序,将重复元素放在一起,然后查找相邻的数组元素。这种方法的时间为O(NlgN),空间为O(1)

如果允许您使用额外的空间,则可以使用哈希在O(N)时间和O(N)空间内完成此操作。哈希的关键是数组元素,值是它们的频率。

在哈希结束时,您只能获得值为1的哈希键的计数。

答案 2 :(得分:2)

使用像mergesort或heapsort这样的合适排序算法对它进行排序(两者都是最坏情况下的O(n log n))并循环排序列表:

sorted_list = sort(list)
unique_count = 0
last = sorted_list[0]

for item in sorted_list[1:]:
  if not item == last:
    unique_count += 1
  last = item

答案 3 :(得分:1)

list.sort();
for (i = 0; i < list.size() - 1; i++)
  if (list.get(i)==list.get(i+1)
    duplicates++;

答案 4 :(得分:0)

保持字典并在循环中添加计数

这就是它如何看待c#

int[] items = {1, 3, 3, 4, 1, 3};
Dictionary<int,int> dic = new Dictionary<int,int>();
foreach(int item in items)
   dic[item]++

当然在C#中有LINQ方式,但据我所知,问题是一般的;)