You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效找出两个聚类结果列表的公共部分?

高效获取两个聚类结果的公共簇方法

核心思路

公共簇的本质是:一组节点在两个聚类结果中始终属于同一个子簇——也就是这组节点在第一个聚类里同属一个簇,在第二个聚类里也同属一个簇,且无法再添加其他节点满足这个条件。

要高效解决这个问题,可以通过「节点-簇集合映射」+「交集去重」的方式实现,时间复杂度为O(n)(n为总节点数),具体步骤如下:


具体步骤

  1. 构建节点到簇集合的映射
    把每个聚类结果中的簇转换成集合,然后为每个节点记录它所在的簇集合。这样可以快速查询任意节点在对应聚类中的所属簇范围。

  2. 计算节点的公共簇交集
    对每个节点,计算它在两个聚类中所属簇集合的交集——这个交集就是该节点在两个聚类中都被归为同一组的最大节点集合。

  3. 去重得到公共簇
    把所有节点的交集结果去重,剩下的就是两个聚类的公共部分。


代码实现示例

def get_common_clusters(com1, com2):
    # 构建节点到簇集合的映射
    def build_cluster_map(clusters):
        cluster_map = {}
        for cluster in clusters:
            cluster_set = frozenset(cluster)
            for node in cluster:
                cluster_map[node] = cluster_set
        return cluster_map
    
    map1 = build_cluster_map(com1)
    map2 = build_cluster_map(com2)
    
    # 计算所有节点的交集,去重
    common_clusters = set()
    for node in map1:
        # 两个簇集合的交集就是公共子簇
        common = map1[node] & map2[node]
        common_clusters.add(common)
    
    # 转换成列表格式返回
    return [list(cluster) for cluster in common_clusters]

# 测试示例
com1 = [[1,2,3,4], [5, 6, 7, 8], [9]]
com2 = [[1, 2, 4], [3], [5, 6, 7, 8], [9]]
print(get_common_clusters(com1, com2))
# 输出: [[1,2,4], [3], [5,6,7,8], [9]]

方法优势

  • 时间效率高:构建映射和计算交集都是线性时间操作,适合处理大规模节点的聚类结果。
  • 逻辑清晰:通过集合交集直接锁定公共子簇,避免了复杂的簇匹配遍历。

内容的提问来源于stack exchange,提问作者CaponeBoom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:55:23