Кіріспе

Steinhaus–Johnson–Trotter алгоритмі немесе Johnson–Trotter алгоритмі, сондай-ақ қарапайым өзгерістер деп те аталады, – Хьюго Стейнхаус, Селмер М. Джонсон және Хейл Ф. Троттердің есімдерімен аталған, элементтердің барлық мүмкін орналасуларын (пермутацияларын) жасайтын алгоритм. Нәтижедегі тізбектегі екі жанындағы орналасулар (пермутациялар) екі жанындағы орналасқан элементтерді алмастыру арқылы ерекшеленеді. Басқаша айтқанда, бұл алгоритм пермутоэдрдағы Гамильтон циклін табады, яғни төбелері орналасуларды (пермутацияларды) білдіретін, ал қабырғалары алмастыруларды білдіретін көпбұрыш. Бұл әдіс 17 ғасырдағы ағылшын қоңыраушыларына белгілі болған, ал Роберт Седжвик оны «мүмкін, ең белгілі пермутация санау алгоритмі» деп атайды. Алгоритмнің бір нұсқасы орташа есептеу уақыты бір пермутация үшін тұрақты болатындай етіп жүзеге асырылуы мүмкін. Қарапайым және есептеу тиімділігімен қатар, бұл алгоритмнің артықшылығы – жасалған орналасулардың (пермутациялардың) келесі есептеулерін, тізбектелген орналасулардың ұқсастығын пайдаланып, жылдамдату мүмкіндігі болып табылады.

Алгоритм

Steinhaus–Johnson–Trotter алгоритмімен құрылған пермутациялар тізбегі табиғи рекурсивті құрылымға ие, оны рекурсивті алгоритм арқылы жасауға болады. Дегенмен, нақты Steinhaus–Johnson–Trotter алгоритмі рекурсия қолданбайды, оның орнына қарапайым итерациялық әдіспен сол пермутациялар тізбегін есептейді. Кейінірек жасалған жақсартулар, әрбір пермутацияға орташа есептеу уақытын тұрақты деңгейде ұстауға мүмкіндік береді.

Пермутоэдр

Бөлшектердің барлық пермутацияларының жиынтығы геометриялық түрде пермутоэдрмен бейнеленуі мүмкін, векторлардың дөңгелек қабығынан (convex hull) құралған политоп, вектордың пермутациялары. Егер бұл өлшемдік кеңістікте осылай анықталса да, ол шын мәнінде өлшемдік политоп болып табылады; мысалы, төрт элементтен тұратын пермутоэдр үш өлшемді полиэдр, яғни қысқартылған октаэдр. Егер пермутоэдрдың әрбір төбесі оның координаталарымен анықталған пермутацияға кері пермутациямен белгіленсе, нәтижедегі белгілеу элементтердегі пермутациялардың симметриялық тобының Кейли графигін сипаттайды, себебі ол элементтердің іргелес жұптарын ауыстыратын пермутациялар арқылы жасалады. Осылайша, Steinhaus–Johnson–Trotter алгоритмімен құрылған тізбектегі кез келген екі тікелей пермутация пермутоэдрдегі қабырғаның соңғы нүктелерін құрайтын екі төбеге сәйкес келеді, ал барлық пермутациялар тізбегі пермутоэдрдегі Гамильтон жолынан өтеді, яғни бұл жол әрбір төбеден дәл бір рет өтеді. Егер пермутациялар тізбесі соңғы пермутациядан бастапқысына қосымша бір қабырға қосу арқылы аяқталса, нәтиже Гамильтон циклі болады.

Сұр кодтар

Берілген радикстегі сандар үшін Грей коді – бұл белгілі бір шекке дейінгі әрбір санды дәл бір рет қамтитын тізбек, мұнда кез келген екі тікелей жапсарлас сан бір ғана цифрмен ерекшеленеді. 1-ден n-ге дейінгі сандардың пермутацияларын 0-ден (n-1)-ге дейінгі сандармен бір-бірге сәйкестікке келтіруге болады, әр пермутацияны пермутациядағы n-нен кіші мәннен оң жақта орналасқан сандардың санын есептейтін тізбектермен жұптастыру арқылы (яғни, екі инверсияланған санның үлкенірек саны), содан кейін осы тізбектерді факториалдық сандар жүйесіндегі сандар ретінде қарастыру, яғни радикстер тізбегімен аралас радикстік жүйе. Мысалы, пермутация мәндерін , , , және береді, ал осы мәндердің тізбегі , санын береді. Штайнхаус-Джонсон-Троттер алгоритмімен құрастырылған тізбектегі тікелей жапсарлас пермутациялардың инверсиялар саны бірге ерекшеленеді, бұл факториалдық сандар жүйесі үшін Грей кодын құрайды. Көбірек айтқанда, комбинаторлық алгоритмдерді зерттеушілер комбинаторлық объектілер жиыны үшін Грей кодын – объектілердің ретін, мұнда кез келген екі тікелей жапсарлас объектілер ең аз мүмкін болатын өзгерістермен ерекшеленеді деп анықтады. Осы жалпыланған мағынада, Штайнхаус-Джонсон-Троттер алгоритмі пермутациялардың өзі үшін Грей кодын жасайды.

Тарих

Бұл әдіс тарихының көп бөлігінде шіркеу қоңырауларын алмастыру әдісі ретінде белгілі болды: ол қоңыраулар жиынтығын барлық мүмкін пермутациялар арқылы қоңырау шалуға мүмкіндік беретін процедураны ұсынады, әр алмастыруда тек екі қоңыраудың орны ауысады. Бұл "жай алмастырулар" немесе "жай аңдау" деп аталатын әдіс шамамен 1621 жылы төрт қоңырау үшін белгілі болды, ал жалпы әдіс Питер Мандидің 1653 жылғы жарияланбаған қолжазбасына дейін жетеді. Фабиан Стетманның 1677 жылғы кітабында алты қоңырауға дейінгі шешімдер келтірілген. Соңғы уақыттарда қоңырау шалушылар бір қоңыраудың үш тізбекті пермутацияда бір орында қалуына жол бермейтін ережеге бағынады; бұл ереже жай алмастырулармен бұзылады, сондықтан бір алмастыруда бірнеше қоңырауларды ауыстыратын басқа стратегиялар жасалды. Алгоритм Хьюго Штайнхаус, Селмер М. Джонсон және Хейл Ф. Троттердің есімдерімен аталады. Джонсон мен Троттер алгоритмді 1960-шы жылдардың басында бір-бірінен тәуелсіз түрде қайта ашты. Штайнхаус жазған 1958 жылғы кітап 1964 жылы ағылшын тіліне аударылды. Онда әрқайсысы бір сызық бойымен тұрақты жылдамдықпен қозғалып, бір бөлшек екіншісін озатқанда орнын ауыстыратын бөлшектер жүйесі арқылы барлық пермутацияларды жасаудың мүмкін емес жұмбағы сипатталған. 1976 жылғы Ху мен Биеннің мақаласында Штайнхаусқа барлық пермутацияларды құрудың алгоритмдік мәселесін тұжырымдағаны айтылады, ал 1989 жылы оның кітабы алгоритмнің бастапқы жарияланымдарының бірі ретінде (бұрыс) есептелді.