繁体   English   中英

查找列表中不同元素数量的有效方法

[英]Efficient way to find number of distinct elements in a list

我正在尝试使用Kruskal的最小生成树算法进行K均值聚类。 我最初的设计是运行输入的全长Kruskal算法并产生MST,然后删除最后的k-1个边(或等效的k-1个最昂贵的边)。

当然,这与运行Kruskal算法并在添加最后k-1个边之前停止它相同。

我想使用第二种策略,即不要运行全长的Kruskal算法,而是在到目前为止的簇数等于K之后停止它。我在使用Union-Find数据结构,并在此Union-Find数据中使用列表对象结构体。

此图上的每个顶点都由列表中的当前簇表示,例如[1,2,3...]表示顶点1,2,3位于其不同的独立簇中。 如果两个顶点连接在一起,则它们在列表数据结构上的相应索引将更新以反映这一点。

例如,合并顶点2和3将列表数据对象[1,2,2,4,5.....][1,2,2,4,5.....]

我的策略是,每当两个节点合并时,计算列表中DISTINCT元素的数量,如果它等于所需集群的数量,则停止。 我担心这可能不是最有效的选择。 有没有一种方法可以有效地计算列表中不同对象的数量?

最简单且可能最有效的是

len(set(l))

其中l是列表。 如果合适的话,您可以考虑将数据存储在集合中而不是列表中。

请注意,要使此方法起作用, l的元素必须是可哈希的,这是为数字保证的,但对于通用“对象”则不能保证。

一种方法是对列表进行排序,然后通过将每个元素与上一个元素进行比较来遍历元素。 如果它们不相等,则对您的“计数器”求和1。 此操作为O(n),对于排序,您可以使用您喜欢的排序算法,例如快速排序或合并排序,但是我想您使用的lib中有可用的排序算法。

另一种选择是创建一个哈希表并添加所有元素。 插入的数量将是不同的元素,因为不会插入重复的元素。 我认为最好的情况是O(1),所以也许这是更好的解决方案。 祝好运!

希望这可以帮助,

迪达克·佩雷斯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM