我有一份清单清单。 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
答案 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。要小心,有时哈希函数计算很昂贵。