Предположим, что у нас есть списки (выраженные как массивы или что-то еще на любом языке). Эти списки одинаково длинны и содержат одни и те же уникальные элементы, но в другом порядке.Как найти список шагов, необходимых для изменения порядка списка, чтобы получить другой список?
Например:
First list: A, B, C, D
Second list: A, D, B, C
Теперь то, что я пытаюсь найти список шагов, которые необходимы, чтобы изменить порядок первого списка, чтобы соответствовать второму списку. В этом примере, было бы только один шаг:
3 -> 1
То есть, потому что элемент с индексом 3 был перемещен в индекс 1. Заметим, что В и С меняются индексы, но это только потому, что они " делая пространство "для D, когда оно вставлено в индекс 1, поэтому этот шаг не должен включаться в список ходов!
Другой пример:
First list: A, B, C, D, E, F
Second list: D, B, A, C, E, F
Changes: 3 -> 0, 1 -> 1
Поскольку D был перемещен в индекс 0 и B был перемещен в 1. Заметим, что для B, мы используем оригинальный индекс 1 вместо того, что было бы после первого хода был выполнен.
Все эти действия выполняются одновременно, то есть нет порядка, но мы просто создаем новый список, помещая перемещенные элементы туда, где они должны быть, а затем заполняя оставшиеся слоты остальными элементами.
Теперь мой вопрос: Кто-нибудь знает какой-либо алгоритм для этого?
Заранее благодарен! :)
вам нужно найти ли самый короткий список шагов или любой подходящий список является приемлемым? –
@ Алексей Шестаков: любой подходящий список приемлем! :-) –
Вы не можете просто переместить все элементы на свои соответствующие позиции? Итак, для вашего второго примера движения будут: 5 -> 5, 4-> 4, 3 -> 0, 2 -> 3, 1 -> 1, 0 -> 2? – Dygestor