Как определить, совпадает ли структура вложенного списка с другой, но с элементами, заменяемыми на новые - PullRequest
2 голосов
/ 31 мая 2019

Допустим, у нас есть два вложенных списка: L1 = [[0, 1], [0, 2]] и L2 = [[1, 2], [1, 3]]

Вопрос в том, существует ли биекция между целыми числами в одном списке и целыми числами в другом списке, которая преобразует L1 в L2?Для L1 и L2, указанных выше, ответ - да.

BIJECTION:

  • старый 0 становится новым 1
  • старый 1 становится новым 2
  • старый 2 становится новым 3

Напомним наш вложенный список L1 = [[0, 1], [0, 2]].Если мы применим отображение, описанное выше, то получим L2 = [[1, 2], [1, 3]]. Поэтому foo(L1, L2) должно вернуть True.foo - это имя оператора равенства, который мы пытаемся реализовать.

Кроме того, порядок не имеет значения.Каждый список должен рассматриваться как математический «набор».

Ниже приведены некоторые примеры:

Левый список: [[2, 1], [3, 1]]
Правый список: [[1, 2], [1, 3]]: True foo(left,right)возвращает True
почему?
порядок не имеет значения

Левый список: [[2, 1], [3, 1]]
Правый список: [[1, 2], [3, 4]]
foo(left,right)возвращает False
почему?
Два целых числа внутри левого списка одинаковы, но все целые числа внутри правого списка отличаются друг от друга.

left = [[2, 1], [3, 1]]
right = [[0, 1], [0, 1]]
foo(left, right) возвращает False
почему?
правый список содержит только 2 различных целых числа (0 и 1).Левый список содержит 3 различных целых числа (1, 2, 3)

Некоторые более длинные примеры приведены ниже:

Исходный список: [[0, 1], [0, 2], [1, 2], [1, 3], [0, 1, 2]]

A1: [[4, 1], [4, 0], [1, 0], [1, 3], [4, 1, 0]]: True

A2: [[4, 1], [4, 0], [1, 3], [1, 0], [4, 0, 1]]: True

B: [[1, 2], [3, 1], [2, 4], [1, 4], [2, 4, 1]]: True

C: [[3, 2], [5, 2], [5, 0], [0, 2], [5, 0, 2]]: True

D: [[5, 2], [5, 2], [3, 0], [0, 2], [5, 0, 2]]: False

E: [[3, 0], [0, 3], [5, 0], [0, 2], [5, 0, 2]]: False

Bijection для примера A1:

ORIGINAL  A
 0        4
 1        1
 2        0
 3        3    

A2 простоизменение порядка A1

В примере B 2 и 4 играют ту же роль, что и 0 и 2 в исходном списке.1 играет одинаковую роль в обоих списках, как и 3.

В примере C 0 и 5 играют ту же роль, что и 0 и 2 в исходном списке, 2 играет ту же роль, что и 1 висходный список, и 3 играет одинаковую роль в обоих списках.В примере D есть два одинаковых подсписка ([5, 2]), в то время как исходный список не имеет повторяющихся подсписков.В примере E 0 во всех четырех подсписках длины-2, в то время как в исходном списке нет ни одного числа во всех четырех подсписках длины 2.

Вот код, который я получил от моей попыткиоднако он не работает, когда заменяется небольшое число (например, 0) на одно из самых больших чисел в списках (например, 4).Когда он выполняет сортировку, он не может распознать, что 4 играет ту же роль, что и 0. Поскольку младшие числа можно заменить на большие, сортировка не будет работать.

def CheckUnique(configs, newconfig):
    sortednewconfig = sorted([sorted(i) for i in newconfig])
    presentnumbers = []
    canonicalnewconfig = []
    for sub in sortednewconfig:
        for i in sub:
            if i not in presentnumbers:
                presentnumbers.append(i)
    for sub in sortednewconfig:
        cansub = []
        for i in sub:
            cansub.append(presentnumbers.index(i))
        canonicalnewconfig.append(cansub)
    if canonicalnewconfig not in configs:
        return True
    else:
        return False

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Вы пытаетесь решить измененную форму, известную как « проблема изоморфизма графа ».Существуют алгоритмы, которые определяют, являются ли два графика изоморфными, но все существующие алгоритмы очень медленные, особенно для больших графов.

" Графики " - это диаграммы с точками и линиями.

Предположим, у нас есть два вложенных списка:

L1 = [[0, 1], [0, 2], [1, 2], [1, 3], [0, 1, 2]]
L2 = [[4, 1], [4, 0], [1, 3], [1, 0], [4, 0, 1]] 

Нарисуйте картинку L1 из следующих инструкций:

  • Для каждого элемента подсписка нарисуйтеточка.Например, рассмотрим подсписок [0, 1].Он получит две точки, одну точку для 0 и одну точку для 1.
  • Нарисуйте круг вокруг группы точек, если они находятся в одном подсписке.
  • Нарисуйте линию между двумя точками, если две точки представляют одно и то же целое число.

initial graph

После этого сгруппируйте каждую группу точек (подсписок) в одну точку.

condensed graph

Вы можете нарисовать аналогичную диаграмму для вложенного списка L2 Вопрос в том, выглядят ли две диаграммы для L1 и L2 после удаления всех чисел одинаковыми?Возможно, вам придется поменять цвета вокруг (синие края станут красными, красные станут, синие и т. Д.). Также, возможно, придется перемещать точки, пока они не будут выглядеть одинаково.

Традиционная проблема изоморфизма графовимеет линии, соединяющие точки одного цвета.Ваша проблема немного отличается от традиционной тем, что ваши края окрашены.

Я думаю, что вы можете избавиться от отдельных цветов и просто пронумеровать каждое ребро количеством цветов, которые были там раньше.Затем он становится «гранично-взвешенным графом»

edge-weighted graph

Выполните поиск в Google по запросу «граф изоморфизма гранично-взвешенных графов».

То, над чем вы работаете, чрезвычайно сложно.Я рекомендую заглянуть на веб-сайты местных университетских отделов математики для людей, с которыми вы можете связаться.Ищите электронный адрес профессоров, чья должность называется «теоретик графиков».Свяжитесь с ними и спросите их совета.

Как я уже сказал, вы работаете над чрезвычайно трудно.

Я думаю, что выможно решить следующим образом:

  1. Построить граничный взвешенный график для левого списка
  2. Построить граничный взвешенный график для правого списка
  3. Определите,два графика изоморфны или нет.
1 голос
/ 31 мая 2019

Используйте all и any с zip вместе с ним:

>>> l = [[0, 1], [0, 2], [1, 2], [1, 3], [0, 1, 2]]
>>> l2 = [[4, 1], [4, 0], [1, 3], [1, 0], [4, 0, 1]]
>>> all([any(i in x for i in y) for x, y in zip(l, l2)])
True
>>> l3 = [[5, 2], [5, 2], [3, 0], [0, 2], [5, 0, 2]]
>>> all([any(i in x for i in y) for x, y in zip(l, l3)])
False
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...