例如,我有列表:
a[0] = [1, 1, 1, 0, 0]
a[1] = [1, 1, 0, 0, 1]
a[2] = [0, 1, 1, 1, 0]
# and so on
Run Code Online (Sandbox Code Playgroud)
它们似乎是不同的,但如果假设开始和结束是连接的,那么它们是圆形相同的.
问题是,我拥有的每个列表的长度为55,并且只包含三个和52个零.没有循环条件,有26,235(55选3)列表.但是,如果条件"循环"存在,则存在大量循环相同的列表
目前我通过以下方式检查循环身份:
def is_dup(a, b):
for i in range(len(a)):
if a == list(numpy.roll(b, i)): # shift b circularly by i
return True
return False
Run Code Online (Sandbox Code Playgroud)
在最坏的情况下,该功能需要55次循环移位操作.并且有26,235个列表可以相互比较.简而言之,我需要55*26,235*(26,235 - 1)/ 2 = 18,926,847,225次计算.它差不多是20吉加!
有没有什么好方法可以用更少的计算来做到这一点?或者支持循环的任何数据类型?