1、前一版本算法分析
前一版本的算法主要时间是消耗在合并有交集的类别上,代码结构如:
for i, cls in enumerate(clses):
for cls_j in clses[i+1...显然这里是一个两层循环,平方的时间复杂度,如果列表有1万个元素,这就变成了1亿次循环(平方就是这么可怕)!
那这里优化的方向:
是否减少输入的列表的长度?
循环能否转成矩阵计算(并行计算)?...一段simhash码的子串有16个二进制位,该子串的表达空间最大有2的16次方(共65536),就算有一亿篇文章,如果均分成65536份,那也变得很小(当然实际的分布并不是均匀的),如果从这点出发,那计算的时间复杂度将会大大降低...重新梳理一下这算法流程,假设有三篇文章,每篇文章有4个simhash子串:
文章1: A1, B1, C1, D1
文章2: A2, B2, C2, D3
文章3: A3, B3, C3, D3
按照我们的假设...,相对于第三个版本的平方时间复杂度,那是快多了,1.7万的文章进行相似性过滤时间能降到一秒以下。