【问题标题】:Efficient way to find number of distinct elements in a list查找列表中不同元素数量的有效方法
【发布时间】:2012-12-02 06:31:26
【问题描述】:

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

当然,这与运行 Kruskal 算法并在它添加最后 k-1 条边之前停止它是一样的。

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

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

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

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

【问题讨论】:

    标签: python python-3.x k-means


    【解决方案1】:

    一种方法是对列表进行排序,然后通过将每个元素与前一个元素进行比较来遍历元素。如果它们不等于您的“不同计数器”的总和 1。这个操作是 O(n),对于排序,你可以使用你喜欢的排序算法,例如快速排序或归并排序,但我猜你使用的库中有可用的排序算法。

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

    希望这会有所帮助,

    迪达克·佩雷斯

    【讨论】:

    • 因为每次我连接两条边时都会进行这些检查,所以将 n 个元素插入到哈希表中进行 n 个循环(在最坏的情况下)将是 n X n 或 n2 操作?
    【解决方案2】:

    最简单也可能最有效的是

    len(set(l))
    

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

    请注意,要使其工作,l 的元素必须是可散列的,这对于数字是有保证的,但对于通用“对象”则不是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-26
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      相关资源
      最近更新 更多