首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算列表中的唯一项目?

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

Stack Overflow用户
提问于 2011-03-14 14:15:54
回答 5查看 4.6K关注 0票数 2

怎样才能继续计算列表中唯一项目的数量?

例如,假设我有{1,3,3,4,1,3},并且我想得到数字3,它表示列表中唯一项目的数目(即|A|=3如果A={1,3,4})。有人会用什么算法来解决这个问题呢?

我试过一个双圈:

代码语言:javascript
复制
for firstItem to lastItem
  currentItem=a
  for currentItem to lastItem
    currentItem=b
    if a==b then numberOfDublicates++
uniqueItems=numberOfItems-numberOfDublicates

这不起作用,因为它计算重复的次数超过实际需要的次数。在开头的例子中,如下所示:

  1. 表示第一个循环它将对列表中的数字1计数+1重复,对于第二循环它将为列表中的第3号计数+2重复,对于E 111第三循环代码>E 212它将计数+1重复(重复数最后一个'3'),问题出现在这里。H 213G 214

知道怎么解决这个问题吗?

EN

回答 5

Stack Overflow用户

发布于 2011-03-14 14:19:19

将这些项添加到HashSet中,然后在完成后检查HashSet的大小。

假设您有一个好的散列函数,这是O(n)

票数 11
EN

Stack Overflow用户

发布于 2011-03-14 14:29:14

您可以检查是否有任何重复的数字后面。如果不增加uniqueCount:

代码语言:javascript
复制
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的散列键的计数。

票数 6
EN

Stack Overflow用户

发布于 2011-03-14 14:18:45

使用一种体面的排序算法对其排序,如mergesort或堆排序(最坏的情况都是habe (N log )),并循环排序列表:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5299792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档