Комментарии 77
Для фанатов Харухи решение Игана даёт точную инструкцию о том, как просмотреть все возможные варианты порядка первого сезона, используя всего 93 924 230 411.
Так я не понял, решение дает конкретную суперперестановку или все-таки количество ее элементов?
При этом оно позволяет вычислить суперперестановку для этого количества элементов (если вы вдруг захотите начать их смотреть — у Игана есть описание алгоритма и даже код на С написан для генерирования).
1) читаем новеллу
2) смотрим сериал.
PS: мое личное мнение — лучше в хронологическом.
Код, кстати, для n 5 генерирует подстроку длиной 154
Кстати, код Эгана и для n = 4 генерирует 34, а должен 33 вроде бы.
Я думал над алгоритмом, как бы я его писал: циклический сдвиг изначальной перестановки до замыкания с записью в файл/буфер, далее проверка последней перестановки, чтобы понять, какое число подставить для продолжения цепочки… да еще и так, чтобы перестановки не повторялись. Трудоемко получается, надо проверять все что было сгенерировано ранее, дабы не словить повторы или не нагенерировать лишнего.
Но что-то мне кажется (только кажется пока), что алгоритм Джонсона Троттера для перестановок тут бы пригодился бы (там как раз циклический сдвиг)… но не уверен.
Кстати, я не заметил сразу, что
число суперперестановок = факториал числа + число суперперестановок от предыдущего. Т.е. для n = 5 120+33 и т.д. только 872 все ломает
Всего 120 строк. Начинаю жалеть, что не знаю С++ (и, видимо, ООП, раз там node, struct… Не посмотрел на ваш код и понял, что программист бы из меня не вышел: я бы если написал так, то наверное, неделю сидел, обдумывая)
Интересно, почему у Эгана за 600 строк переваливает.
Форкнул себе.
При n = 7 там симметрия сохраняется.
Интересно, как тот человек сократил до 872 для n 6
Видимо, мне пока надо его на бумаге еще обдумывать.
www.njohnston.ca/2014/08/obvious-does-not-imply-true-the-minimal-superpermutation-conjecture-is-false
Если по формуле из статьи смотреть (n-2) + (n-1)! + n! для n=4 нижняя граница 32, а не 33.
И для n=3 нижняя граница = 8. И вдруг неожиданно это приобретает смысл, если обратить внимание на то, что мы работает с кольцом (не знаю, какой термин употребить, имеется в виду замкнутая последовательность). Тогда для n=3 12312132 последняя единица берется из начала. В общем, изначально кольцо представлено, как цепочка. И это надо учитывать. И тогда все верно: 8, 32, 152, 872.
посмотреть на картинку.
Тогда на мой взгляд алгоритм такой (если не напутал):
1) Крутим до n, например n = 3
123
231
312
2) Проверяем делится ли номер итерации нацело на n (вроде также как в написанном коде у MaxVetrov и Эгана)
Делится, тогда идем по хвосту слева направо (два прохода, чтобы снова не делилось нацело )
3) То, что осталось — идет в начало, перевернутый хвост идет в конец.
4) Снова крутим.
213
132
321
5) Дошли до факториала. Остановка.
Проверил на n=4, n=5 — все верно.
Тогда, чутье подсказывает, что можно без struct, но пока не на сто процентов уверен.
Сделал, последовательность у меня без последней единицы. Для n = 10 получилось 4979527
github.com/dcc0/Superpermutations_php/blob/master/superpermutations.php
<?php
$n = 7;
$fact = 5040;
$perm = "1234567";
for ($i = 1; $i != $fact + 1; $i++)
{
print $perm . "\n";
$mm = $i;
$m = $n;
while ($m > 0)
{
if ($mm % $m == 0) {
$mm/= $m--;
}
else
{
$perm = substr($perm, $n - $m + 1).strrev(substr($perm, 0, $n - $m + 1));
continue 2;
}
}
}
?>
Про рекурсивный вариант, нашел на Ruby.
https://rosettacode.org/wiki/Superpermutation_minimisation#Ruby
Даже если не использовать массивы, в распоряжении 120 с хвостом символов аски.
Упорядочил исходный алгоритм на С89 на stdio.
github.com/dcc0/permutations/blob/master/permutations_spiral.c
12345, то последняя перестановка — это реверс от первой. Т.е. 54321. По ней и можно делать остановку.
т.е. пока ( строка != «54321» ). Но каждый раз сравнивать строки, наверное, не очень хорошо. strcmp вроде бы посимвольно сравнивает. Потеря времени. Вариант с факториалом (субъективно) выглядит более строго в математическом смысле. Такой алгоритм легче понять и перевести на псевдокод или любой язык. Его уже можно воткнуть в курсовую или статью.
Но там другой порядок вывода, а он не подойдет для создания последовательности. Рекурсивный на Ruby хочу разобрать.
Последовательность 873.
Не знаю насколько близко к классике я написал алгоритм который создаёт последовательность 873. Саму её я не нашёл чтобы проверить.
123456123451623451263451236451234651234156234152634152364152346152341652341256341253641253461253416253412653412356412354612354162354126354123654123145623145263145236145231645231465231425631425361425316425314625314265314235614235164235146235142635142365142315642315462315426315423615423165423124563124536124531624531264531246531243561243516243512643512463512436512431562431526431524631524361524316524312564312546312543612543162543126543121345621345261345216345213645213465213425613425163425136425134625134265134215634215364215346215342615342165342135642135462135426135421635421365421324561324516324513624513264513246513241563241536241532641532461532416532413562413526413524613524163524136524132564132546132541632541362541326541321456321453621453261453216453214653214356214352614352164352146352143652143256143251643251463251436251432651432156432154632154362154326154321654321
В ней 148 последовательностей с повторами(*). И максимально 4 последовательности с повторами подряд. Выглядит симметрично. Просматривается цикличность.
2 3 4 6
— Цифрами обозначено сколько идет подряд значений без повторов.
*
— Каждая звёздочка это последовательность в которой есть повтор минимум одной цифры.
6*6*6*6*6**6*6*6*6*6**6*6*6*6*6**6*6*6*6*6***6*6*6*6*6**6*6*6*6*6**6*6*6*6*6**6*6*6*6*6***6*6*6*6*6**6*6*6*6*6**6*6*6*6*6**6*6*6*6*6****6*6*6*6*6**6*6*6*6*6**6*6*6*6*6**6*6*6*6*6***6*6*6*6*6**6*6*6*6*6**6*6*6*6*6**6*6*6*6*6***6*6*6*6*6**6*6*6*6*6**6*6*6*6*6**6*6*6*6*6
Последовательность 872.
12345612345162345126345123645132645136245136425136452136451234651234156234152634152364152346152341652341256341253641253461253416253412653412356412354612354162354126354123654132654312645316243516243156243165243162543162453164253146253142653142563142536142531645231465231456231452631452361452316453216453126435126431526431256432156423154623154263154236154231654231564213564215362415362145362154362153462135462134562134652134625134621536421563421653421635421634521634251634215643251643256143256413256431265432165432615342613542613452613425613426513426153246513246531246351246315246312546321546325146325416325461325463124563214563241563245163245613245631246532146532416532461532641532614532615432651436251436521435621435261435216435214635214365124361524361254361245361243561243651423561423516423514623514263514236514326541362541365241356241352641352461352416352413654213654123
В ней 147 последовательностей с повторами(*). При этом шестёрки разбиты на двойки тройки и четвёрки. Максимально две последовательности с повторами подряд и тех 3 штуки в начале. Похоже на ручное решение головоломки.
2 3 4 6
— Цифрами обозначено сколько идет подряд значений без повторов.
*
— Каждая звёздочка это последовательность в которой есть повтор минимум одной цифры.
6*6*6*4*6*6*6*6*2*6**6*6*6*6*6**6*6*6*6*6**6*6*6*6*4*4*3*3*2*6*6*6*6*4*4*6*6*6*6*2*3*6*6*6*6*3*6*3*6*6*4*4*3*6*6*6*6*3*6*2*6*6*6*4*6*6*6*6*2*4*4*6*6*6*6*2*2*6*6*6*2*3*6*2*4*6*6*6*6*2*2*6*4*6*6*4*6*6*6*6*2*3*6*6*6*6*3*2*6*6*4*6*6*4*3*6*4*6*6*6*6*2*4*6*6*6*6*2*2*6*6*6*6*4*3*2*6*4*6*6*6*6*2*6*2
Про интегралы Борвейна нашел даже на Хабре:
https://m.habr.com/post/146140/
А вот про те, что в статье, так и не нагуглилось.
Дело в том что выполнять классическую перестановку для целого числа на Си — не имеет смысла. Оно от этого деградирует!!!
Можно и даже иногда нужно выполнять перестановку в двоичном виде. В этом случае целое число перестаёт быть числом, и становится парой структур под объединением — над ними уже можно издеваться без деградации.
Если у кого есть примеры использования классической перестановки над десятичными числами в РЕАЛЬНОЙ жизни — то прошу поделиться.
Мне интересно!!!
Я как понимаю задача эквивалента какому-то классу задачи коммивояжера. А более важной задачи, полезной в бытовом практическом смысле, наверно и нет
Потому как в задаче коммивояжера имя объекта не модифицируется.
А в классическом варианте перестановки — имя объекта является десятичное число. Само число в видимом десятичном представлении — имя. Как так?
И математики на полном серьёзе этим оперируют, что-то складывают и умножают.
Я не понимаю смысла — кто сможет мне объяснить!??
Простой вопрос, а ответа нету.
И кругом одни верующие фанатики.
Не диапазон имён множества объектов (список), не вариантность состояния в списке, а смену имени объекта перестановки в десятичном представлении.
Например вот такая ахинея
9=6 потому что количество спичек для составления цифр одинаково
123=321 потому что количество цифр одинаково
Если объектом перестановки является постоянное статическое имя — его всегда можно идентифицировать, управлять свойствами, добавлять/удалять зависимости, и прочее прочее прочее. Это я и сам умею и с успехом применяю.
Но если имя объекта представлено как десятичное многозначное число — начинается полная ахинея, которое я просто не понимаю.
Какое имя объекта? Вы о чем?
Когда число является значением константы или переменной — то всё в норме.
Но как только начинаются математические фокусы с перестановкой, то десятичное число превращается в имя. То самое место где оно записано имеет имя в десятичном выражении. Тот самый бред.
Я-бы ещё смирился, если-б то самое число считалось адресом. Но математики с умным видом меняют в этом числе цифры местами.!!! И это всё называется классическая перестановка в математике.
Мы часто даже предположить не можем, какое приложение может иметь какая-то, казалось бы, оторванная от реальности задача.
upd похоже что нет
Ну или я что-то не так понял.
Если получается короче и со всеми вариантами то да. Собственно в статье Superpermutation есть этот вариант.
Для четырёх интереснее.
Загадочный математический гений и писатель продвигают решение задачи о перестановке