如何在循环中合并关联数组且避免全遍历?求低计算耗时方案
问题需求
给定数组:
n = [[1,2],[2,3],[4,5],[1,6],[4,7],[8,9],[6,8]]
需要合并所有至少包含一个共同元素的子数组,最终得到结果:
[[1,2,3,6,8,9],[4,5,7]]
实际处理的数据集有约4百万个子数组,每个子数组的元素数量在0到1000之间,希望避免多次遍历这4百万个子数组,找到最快的实现方法。
现有思路与瓶颈
我的思路是:遍历数组n,检查相邻子数组是否存在共同元素,若有则合并为集合;遇到无共同元素的子数组时,创建新集合重复操作。后续如果遇到和已有集合有共同元素的子数组,直接将其加入对应集合,不用重新遍历整个原数组。
目前写的代码如下:
final_list = [] for i in range(0, len(n)-1): inter_list = list(set(inter_list)) if (n[i].ravel()[:,None] == n[i+1].ravel()).any(): inter_list.append(np.concatenate((DF_list[i], DF_list[i+1]), axis=0)) final_list.append(inter_list)
现在卡在了:不知道怎么用已经生成的final_list去检查后续的子数组,避免重新遍历原数组。
其他问题
- 是否有其他方法可以降低这个问题的计算复杂度?试过Dask库,但没法把复杂度降到O(n²)以下。
- 如果无法降低复杂度,有没有并行化的方案来提升处理速度?
- 补充:已经尝试过相关线程里的方法,但速度还是不够理想;而且用NetworkX的方法和数组循环的方法得到的结果不一致,前者第一个合并结果的长度大概是1400,后者大概是1250。
内容的提问来源于stack exchange,提问作者Kevin Patel
相关产品推荐
相关产品推荐

