算法 - 用于计数成对相互出现

时间:2016-05-03 10:20:56

标签: algorithm

我有一份清单清单。     L1 = [[...] [...] [.....] .....] 如果我在展平列表并从中提取唯一值后获取所有元素,那么我得到一个列表L2。 我有另一个列表L3,它是L2的一部分。

我想找到L1中L3元素的成对相互出现。关系是非指导性的。即a,b与b相同,a

EG-     L1 = [[a b c d] [a b d g f] [c d g] [d g] ....]     L2 = [a b c d g f]     说L3 = [c d g]

我想在L1中找到成对的L3相互出现。即这些价值观。     C,d:2     d,G:3     C,G:1

我得到O(n * n * m * p);哪里 - 没有。 L1中的列表,m - avg。没有。每个L1列表中的元素。 n - 没有。 L3中的元素。

我可以获得更高的复杂性吗?

python中的上面代码是:

这里sig_tags是L3,标签是L1。

x=[]
    for i in range(len(sig_tags)):
        for j in range(i+1,len(sig_tags)):
            count=0
            for k in tags:
                if (sig_tags[i] in k) and (sig_tags[j] in k):
                    count+=1
            if count>param:        
                x.append([sig_tags[i],sig_tags[j],count])
    return x

1 个答案:

答案 0 :(得分:1)

是的,你可以。

为每个元素赋一个id,然后将列表L1转换为位向量列表,如果该列表构成相应的字母,则该位为真。这是O(m * p)或O(M * p * log | Alphabet |),具体取决于您的实现方式。

现在检查一对是否属于一个列表,你需要检查cerain 2位是否为真,即O(1)。所以所有的检查都是O(n ^ 2 * p)。

总体而言,复杂度为O(n ^ 2 * p + m * p)。

如果使用哈希函数,则可以跳过分配ID。要小心,有时哈希函数计算很昂贵。