给出一个冻结的整数集列表,我如何找到出现在某个频率之上的第一个元素?
我正在实现的算法中有一个条件涉及超图对偶化。
给出两个超图G(实现为元组(G0,G1)),其中G0是顶点集合,G1是顶点的冻结集合(超边)列表,并且对于H同样(要注意,G0 =始终为H0)。
该算法的伪代码说是要在G1和H1中找到G1或H1中的任何x(由于某种理论而保证找到的)(可能是最快的x)可以找到),使得x的频率> = 1 / log(| G1 | + | H1 |)。
我天真地这样做:
def logOrMore(v,edges,sum):
count = 0
for edge in edges:
if v in edge:
count+=1
if count >= (1/log(sum)):
return True
return False
并在主要算法中:
...code...
sum = len(G[1])+len(H[1])
x = 0
for v in G[0]:
if logOrMore(v,G[1],sum):
x = v
break
if x ==0:
for v in G[0]:
if logOrMore(v,H[1],sum):
x = v
break
...more code...
当超图很大时,这已成为一个大问题。如何以最快的方式做到这一点?
G1的一个例子是
G1 = [frozenset({74, 76}), frozenset({73, 74, 29, 30}), frozenset({73, 74, 3, 4}), frozenset({74, 76, 29, 30}), frozenset({16, 73, 74}), frozenset({73, 74})]
但这是一个非常小的情况。最多可以达到列表内的1000个冻结集。
注意:整数的冻结集通常不会在大多数时间排序
这在Python 3.6.4中是有帮助的
答案 0 :(得分:1)
因此,如@martineau的注释中所建议,您只能在开始时执行一次阈值计算并存储为变量。
另一种可能的清理方法是使用名为first
的软件包。它被设计为可迭代并找到与条件匹配的第一个值。就您而言,听起来您正在寻找的值大于或等于阈值。
pip install first
文档中的示例,在列表中找到第一个偶数:
from first import first
first([1, 1, 3, 4, 5], key=lambda x: x % 2 == 0)
您可以使用此方法迭代冻结集以找到您的状况。但是,尽管有其他代码库,您也可以zip()
一起使用G和H列表,并且仅使用一个for循环来检查它们。