Например, у меня есть списки:
a[0] = [1, 1, 1, 0, 0]
a[1] = [1, 1, 0, 0, 1]
a[2] = [0, 1, 1, 1, 0]
# and so on
Они кажутся разными, но если предполагается, что начало и конец связаны, то они кругообразно идентичны.
Проблема заключается в том, что каждый список, который у меня есть, имеет длину 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
Эта функция требует 55 операций циклического сдвига в худшем случае. И есть 26 235 списков, которые нужно сравнить друг с другом. Короче, мне нужно 55 * 26 235 * (26,235 - 1)/2 = 18,926,847,225 вычислений. Это примерно 20 гига!
Есть ли хороший способ сделать это с меньшими вычислениями? Или любые типы данных, которые поддерживают круговое?