如何在线性时间内计算列表中的不同值?

时间:2012-12-13 17:20:21

标签: algorithm list count complexity-theory distinct-values

我可以考虑对它们进行排序,然后逐个遍历每个元素,但这是nlogn。是否有线性方法来计算列表中的不同元素?

3 个答案:

答案 0 :(得分:8)

更新: - 独特与独特


如果您正在寻找“唯一”值(如果您看到一个元素“JASON”不止一次,那么它不再是唯一的,不应该被计算在内)

您可以使用HashMap;)

在线性时间内完成此操作

(广义/语言不可知的想法是Hash table

HashMap / Hash表的每个条目都是<KEY, VALUE>对,其中键是唯一的(但对其对应的值没有限制)

第1步:

迭代列表中的所有元素: O(n)

  • 对于列表中看到的每个元素,检查它是否已经在HashMap中 O(1),摊销
    • 如果没有,请将其添加到HashMap中,并将列表中元素的值作为KEY,并将您看到此值的次数添加到VALUE O(1)
    • 如果是这样,请增加您到目前为止看到此KEY的次数 O(1)

<强>步骤2:

遍历HashMap并计算KEYS,其VALUE等于1(因此是唯一的) O(n)

<强>分析:

  • 运行时:O(n),摊销
  • 空格:O(U),其中U是不同值的数量。

但是,如果您正在寻找“distinct”值(如果您想要计算有多少不同的元素),请使用{{3而不是HashMap / Hash表,然后简单地查询HashSet的大小。

答案 1 :(得分:0)

你可以调整this extremely cool O(n)-time and O(1)-space in-place algorithm来删除重复计算不同值的任务 - 只需计算最终O(n)传递中等于sentinel值的值的数量,然后从大小中减去清单。

答案 2 :(得分:0)

将列表的每个元素添加到HashSet,然后检查HashSet的size(基数),这是列表中不同值的数量。