一尘不染

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

algorithm

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


阅读 242

收藏
2020-07-28

共1个答案

一尘不染

更新:-独特与独特


如果您正在寻找 “唯一” 值(例如,如果您多次看到“ JASON”元素,那么该元素将不再是唯一的,因此不应计数)

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

(广义的/与语言无关的想法是哈希表

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

第1步:

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

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

第2步:

遍历HashMap并计算KEY值等于1(因此唯一)的 O(n)

分析:

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

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

2020-07-28