3 алгоритма перестановок (рекурсия и итерация)

  Рет қаралды 26,616

S0ER

S0ER

2 жыл бұрын

#soer #itubeteam
Основной канал для общения и публикации новых видео - Телегарм - t.me/softwareengineervlog
Спонсорство - donate.s0er.ru
Сайт платным контентом - soer.pro
Зеркало для видео Дзен Видео - zen.yandex.ru/id/5f578bdf22e2...
GitHub - github.com/soerdev
Чат для программистов - / discord
Группа ВК - codeartblog

Пікірлер: 43
@TwilightSun32
@TwilightSun32 2 жыл бұрын
В первом варианте наверное можно уточнить, что элементы массива подразумеваются различные, иначе будет работать странно. Остальные два работают как-то логично в этом случае. Ещё помню в детстве делал нумерацию перестановок, т.е. функцию которая возвращает перестановку по номеру. не помню для какой задачи нужно было ... но чтобы придумать как это сделать - пришлось подумать, это хорошо помню. идею "каунтдаун" отдельно делал в какой-то задачке на кодварсе для замены рекурсии. т.е. по сути эту идею можно ещё пояснить так: рекурсивные вызовы в цикле это по сути n вложенных циклов, а их можно заменить на один цикл по составному счетчику (т.е. массиву счетчиков) который дополнительно небольшим циклом ещё согласованно инкрементируется или декрементируется (по сути это как работа с числом поразрядно, ещё на это похоже). Это я к тому что все эти идеи они могут быть отдельно в разных комбинациях встречаться в других алгоритмах каких-то.
@user-cj6dc2bn1f
@user-cj6dc2bn1f 2 жыл бұрын
одно из самых полезных роликов по базовым алгоритмам на Ютубе, спасибо вам! хотелось бы узнать как вы изучали их, какие книги читали
@S0ERDEVS
@S0ERDEVS 2 жыл бұрын
Мне нравится Кормен, не сильно сложно, как у Кнута и не так поверхностно как у Скиены или Грокаем алгоритмы. Но читать я рекомендую все книги, они все таки немного разные и дают разные взгляды на алгоритмы. Какие-то вещи сначала "потрогать" в простом и слегка поверхностном варианте. а потом уже на этом понимании копнуть глубже.
@ostrov11
@ostrov11 2 жыл бұрын
Спасибо.
@shickulaairships
@shickulaairships 2 жыл бұрын
возможно там используются сведения из теории групп, в частности симметрической группы, + графы Кэли и тд, сам в этом не разбирался (теорию групп начинал изучать, но уже все забыл) там на вики, изображен граф Кэли для S4, и синие стрелочки это нечетные перестановки, красные - четные. мож алгоритм как-то обходит такой граф...
@keyjackei9581
@keyjackei9581 2 жыл бұрын
Спасибо за столь полезную информацию! Алгоритм с итеративным подходом крайне интересен. Не подскажете откуда алгоритм взяли? Хотелось бы побольше вникнуть
@alexandervolkov97
@alexandervolkov97 Жыл бұрын
Он сам придумал, очевидно.
@poetry4538
@poetry4538 2 жыл бұрын
Последний алгоритм (итеративный) генерирует не в лексикографическом порядке?
@bdick8136
@bdick8136 2 жыл бұрын
Это лойс!
@VERTinBY
@VERTinBY 2 жыл бұрын
при большом подмножестве элементов , алгоритму желательно уметь продолжить с места остановки , Комбинаторика она такая...
@albrehtdurer557
@albrehtdurer557 2 жыл бұрын
ну конечно, спасибо кэп)), если память кончилась?
@VERTinBY
@VERTinBY 2 жыл бұрын
@@albrehtdurer557 когда ищешь заветную комбинацию уже не первый месяц - есть посерьезнее страхи :)
@IvanGavr
@IvanGavr Ай бұрын
Алгоритм Нараяны такое может. По этой причине можно и распараллелить его явно. На разных терминалах задать начало и остановку (от сих и до сих). Вот только не могу понять одного, почему некоторые считают, что рекурсивные алгоитмы легче для понимания.
@TrevoZnaniy
@TrevoZnaniy Жыл бұрын
с конца обрабатывать элементы как-то по-арабски, не привычно. Вот с лева на право вариант: function perm(arr, n = 0) { if (n == arr.length - 1) { console.log(arr); } for (let i = n; i < arr.length; i++) { [arr[i], arr[n]] = [arr[n], arr[i]]; perm(arr, n + 1); [arr[i], arr[n]] = [arr[n], arr[i]]; } } perm(['0', '1', '2'])
@user-mm4wc5cm3x
@user-mm4wc5cm3x 9 ай бұрын
Ага. Офигенски. Только вот ваш кот не делает нифига никаких перестановок
@kookaburru
@kookaburru 2 жыл бұрын
А можно переставлять элементы по порядку пока не закончатся варианты и реализуется это простым вложенным циклом for :)
@shamilshiakhmetov6028
@shamilshiakhmetov6028 2 жыл бұрын
некоторые задачи с for просто нельзя сделать без рекурсии. Та же NP-полная задача про ферзей
@arisman20
@arisman20 Жыл бұрын
не читал все комментарии, поэтому извините, если дубль... "Легкое" объяснение смены, как мне кажется заключается в том, что если массив можно разделить на 2 равных подмассива, то замена будет заключаться в циклической (хочется написать рекурсивном) замене не элементов, а именно этих подмассивов, если же на каком то шаге заменить нельзя - то находится элемент поссеридине, который сам на себя не меняется, и меняются местами 2 подмассива - один слева, другой справа .... В письменном изложении, возможно не так понятно, если это все проговорить - то, как мне кажетсься, очень легко ...
@atom-kor
@atom-kor Жыл бұрын
Не хочу говорить громких слов, но ваше объяснение внесло ещё больше ясности в мою соломенную голову! 😅
@traxooza
@traxooza 2 жыл бұрын
js one love :3
@alekseytrump1586
@alekseytrump1586 2 жыл бұрын
Русский Том Харди. Ганстер среди программистов)))
@joker202
@joker202 2 жыл бұрын
Русский Линус Торвальдс))
@The_Mr_Professor
@The_Mr_Professor 2 жыл бұрын
@@joker202 кста чем-то внешностью похожи
@alicenNorwood
@alicenNorwood 2 жыл бұрын
мистер вульф
@user-il3xh5di2i
@user-il3xh5di2i 2 жыл бұрын
Это конечно интересно, но практическое применение, даже в тех же задачах, с ходу не понятно. Вернее, предположить задачу можно, а вот применить бы, уже другое дело
@alexandersmirnov4274
@alexandersmirnov4274 6 ай бұрын
а кто автор итеративного алгоритма?
@alexandervolkov97
@alexandervolkov97 Жыл бұрын
И вроде всё понятно, но мозг будто отказывается вникать) Видимо нужно больше времени уделять этому
@petr717.
@petr717. Жыл бұрын
Автор вы делаете программу на заказ?
@loh_ya
@loh_ya Жыл бұрын
у меня одного первый код вообще не работает?
@TwilightSun32
@TwilightSun32 2 жыл бұрын
по поводу %2 проверил, если убрать - для случая из трех элементов перестановки начинают повторяться. т.е. дело в том, что нам в позицию i надо поставить элемент которого ещё не было, и для случая когда у нас слева от i четное количество позиций - такой элемент взять можно из начала, а когда нечетное - то он то в конце то перед ним, то ещё на 1 раньше и т.п. а почему оно так - это прям сложно сообразить сходу. это может быть даже проще по индукции будет доказать чем объяснить почему...
@runrunning4359
@runrunning4359 Жыл бұрын
Для меня как для новичка ничего не понятно, так как в первом примере вы используете стрелочные функции😥
@plur_ndbn
@plur_ndbn 8 ай бұрын
Не переживай, для не новичков он тоже несёт околесицу вместо простого объяснения
@ivanmatew568
@ivanmatew568 2 жыл бұрын
Думаю, что многим новичкам было бы интересно, как последний алгоритм переписать с использованием классов. Так, как бы он мог попасть в прод. Причем, не сразу конечный вариант, а все этапы рефакторинга.
@ilyapro2815
@ilyapro2815 Жыл бұрын
Не очень понятно, зачем он на классах, тут, скорее всего, выигрыша никакого не будет. Оформите метод чистой функцией и используйте. Классы могут потребоваться, если у вас в самих исходных данных классы, либо критерий перестановки какой-то особенный, зависящий, например, можно ли экземпляры двух классов ставить вместе, либо один всегда должен быть впереди.
@user-oe2oq6gl8n
@user-oe2oq6gl8n 2 жыл бұрын
На каком языке примеры?
@keyjackei9581
@keyjackei9581 2 жыл бұрын
По моему JavaScript
@horhegarsia4221
@horhegarsia4221 2 жыл бұрын
Вызывать функцию, всё же, проще так: let lst = [0, 1, 2]; perm(lst, lst.length); Если я не прав - поправьте меня.
@user-il3xh5di2i
@user-il3xh5di2i 2 жыл бұрын
Разницы нет
@horhegarsia4221
@horhegarsia4221 2 жыл бұрын
@@user-il3xh5di2i Логически - да, визуально (по степени восприятия кода другим человеком) - огромная.
@fusted4630
@fusted4630 Жыл бұрын
еще проще в самой функции сделать perm(arr, n = arr.length) тогда у потребителя не будет никакой необходимости вникать в суть работы алгоритма
@alexfomin2703
@alexfomin2703 2 жыл бұрын
Хочется написать j = i&1 ? p[i] : 0
@TwilightSun32
@TwilightSun32 2 жыл бұрын
вот за эти сишные приколы жабаскрипт и не любят : )) (хотя для задач-однострочников на кодварсе полезно конечно)
@chinyass
@chinyass 2 жыл бұрын
дед не души
Китайка и Пчелка 4 серия😂😆
00:19
KITAYKA
Рет қаралды 2,5 МЛН
Кәріс өшін алды...| Synyptas 3 | 10 серия
24:51
kak budto
Рет қаралды 1,1 МЛН
Рекурсия. Репка и матрёшка
18:37
Тимофей Хирьянов
Рет қаралды 116 М.
5 Simple Steps for Solving Any Recursive Problem
21:03
Reducible
Рет қаралды 1,2 МЛН
Leetcode 46. Permutations : Introduction to backtracking
10:06
ComputerBread
Рет қаралды 84 М.
Backtracking: Permutations - Leetcode 46 - Python
9:43
NeetCode
Рет қаралды 322 М.
Задача из Собеседования на 160,000 Евро в Год
13:27
Саша Лукин
Рет қаралды 1,1 МЛН
Что такое рекурсия. Фундаментальный JavaScript
20:32
Михаил Непомнящий
Рет қаралды 21 М.
Генерация всех перестановок. Лекция 8
1:18:39
Обучающие курсы, обучающие видео
Рет қаралды 2,5 М.
6 важных структур данных
17:25
S0ER
Рет қаралды 89 М.
Рекурсия в JavaScript на простых примерах, хватит ее бояться!
37:38
WebDev с нуля. Канал Алекса Лущенко
Рет қаралды 50 М.