如何在线性时间内计算列表中的不同值?
问题内容:
我可以考虑对它们进行排序,然后逐个遍历每个元素,但这是nlogn。有没有一种线性方法来计算列表中的不同元素?
问题答案:
更新:-独特与独特
如果您正在寻找 “唯一” 值(例如,如果您多次看到“ 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的大小。