我可以考虑对它们进行排序,然后逐个元素检查,但这样的时间复杂度是nlogn。有没有一种线性方法来计算列表中不同元素的数量?
我可以考虑对它们进行排序,然后逐个元素检查,但这样的时间复杂度是nlogn。有没有一种线性方法来计算列表中不同元素的数量?
更新:- distinct vs. unique
如果你正在寻找唯一值(例如,如果你看到一个元素“JASON”出现了不止一次,则它不再是唯一的,不应计算),那么可以使用HashMap在线性时间内完成;)
(通用/语言无关的想法是哈希表)
HashMap /哈希表的每个条目都是<KEY, VALUE>
对,其中键是唯一的(但对应于其对中的值没有限制)
步骤1:
遍历列表中的所有元素一次:O(n)
步骤2:
遍历HashMap并计算VALUE等于1(因此唯一)的KEYS的数量O(n)
分析:
如果你想要筛选出独特的值(比如你想数一下有多少个不同的元素),那么使用HashSet而不是HashMap/散列表,然后查询HashSet的大小即可。
您可以将这个极其酷炫的O(n)时间复杂度和O(1)空间复杂度的原地算法应用于计算不同值的任务 - 只需在最终的O(n)遍历中计算等于哨兵值的值的数量,并从列表的大小中减去该数量。
O(n)
。 - sampson-chenO(n)
,如果每个对象具有相同的哈希值。 - SpaceTrucker