8

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

4

3 回答 3

11

更新: - 独特与独特


如果您正在寻找“唯一”值(例如,如果您多次看到一个元素“JASON”,则它不再是唯一的,不应计算在内)

您可以使用HashMap在线性时间内做到这一点;)

(广义/与语言无关的想法是Hash table

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

步骤1:

遍历列表中的所有元素一次:O(n)

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

第2步:

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

分析:

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

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

于 2012-12-13T17:22:52.547 回答
1

您可以调整这个非常酷的 O(n) 时间和 O(1) 空间就地算法来删除重复值,以完成计算不同值的任务——只需计算等于最终 O 中的哨兵值的值的数量(n) 通过,并从列表的大小中减去它。

于 2012-12-13T17:46:04.030 回答
0

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

于 2012-12-13T17:54:13.513 回答