Алгоритмы на Python 3. Лекция №8

Поделиться
HTML-код
  • Опубликовано: 20 дек 2024

Комментарии • 297

  • @predatel_rodini
    @predatel_rodini 6 лет назад +248

    Спасибо за лекцию. Эх, вернуть бы те времена, когда я мог учиться и не работать, я бы не одной лекции не пропустил. Сейчас приходиться и работать и учиться и на работе учиться. Но с такими преподавателями у меня есть шанс.

    • @ЮстасПельмень
      @ЮстасПельмень 5 лет назад

      так рил топчик

    • @gerhardshreder2391
      @gerhardshreder2391 5 лет назад +8

      подача у препода хорошая, но этот тупняк при объяснении просто всё ломает. Лучше бы остановился и всё продумал на перёд, чем эти вечные "а, нет, извините, ой, подождите" и т.д.

    • @Самисвоимируками-я4ь
      @Самисвоимируками-я4ь 5 лет назад +27

      @@gerhardshreder2391 да иди ты в баню. Всегда бесят такие критики, которые сами хер чего сделали. Тот кто пробовал что-то сделать сам, будет с уважением относится к труду другого.

    • @gerhardshreder2391
      @gerhardshreder2391 5 лет назад +26

      @@Самисвоимируками-я4ь боже мой, без недели 2020ый год на дворе, а в мире оказывается всё еще живут люди с таким ограниченным мышлением. Ты, я надеюсь, никогда в жизни не критиковал власть, футбол, кино, книги? А то я сильно сомневаюсь, что ты великий реформатор, игрок года FIFA, гениальный режиссер и писатель в одном лице. Что касается лекции - у препода есть конкретные косяки и я имею полное право о них здесь высказываться. Если тебя это бесит - это исключительно твои проблемы.

    • @Самисвоимируками-я4ь
      @Самисвоимируками-я4ь 5 лет назад +5

      @@gerhardshreder2391 Да ты прав мне как-то пофиг на твой высер, просто считаю что ты нихера не сделал, а мычишь вот и все.

  • @iritaka
    @iritaka 4 года назад +136

    Тайм-коды: генерация всех перестановок
    0:49 генерация комбинаторных объектов
    5:25 упрощенная задача - все числа от 00...0 до N-1 N-1...N-1. Перебор всевозможных состояний у каждой ячейки
    7:00 рекурсивная генерация всех чисел длины М # def generate_numbers(N:int, M:int, prefix = None)
    14:48 prefix = prefix or [] # если не первое и не второе, то значение второго
    16:15 в and и or ленивое выполнение (может проверять Только первое значение)
    23:08 рекурсивный вызов в цикле
    27:14 алгоритм генерации всех чисел для N-ричной системы счисления
    29:50 в Питоне можно создавать пустые списки и конкатенировать списки
    32:17 алгоритм генерации всех чисел без цикла для двоичной системы счисления
    36:33 алгоритм генерации всех чисел в цикле для двоичной системы счисления
    39:19 алгоритм генерации всех перестановок (рекурсивная) # def generate_permutations(N:int, M:int, prefix = None)
    46:29 continue
    49:01 однопроходный алгоритм
    53:11 *prefix # раскрытие элементов списка в параметр функции не в список со скобками, а через пробел
    58:32 рекурсивные сортировки (быстрые сортировки): сортировка Тони Хоара и сортировка слиянием
    59:47 их характеристики
    1:04:05 иллюстрация сортировка Хоара
    1:11:00 иллюстрация сортировка слиянием. Деление напополам и слияние уже отсортированных половинок

    • @Andri-f3s
      @Andri-f3s 4 года назад +2

      Красава

    • @VladK181
      @VladK181 5 месяцев назад

      .rmrr. r.rmnrmr.n...n6rmmmrmmmnmb..n,mmnon
      .?
      Krn
      Nm..rr.nm.!rn.nmn
      Rmrmrr,Rmrmrr m.rm nrmnr.n?,rmr.rm..r.rm..m,r nnnnnmmnn r.
      Nr
      Mrm.nmrrmrn.n
      Rmrrmrnmn
      .r
      .m
      R.nrnmhmn.rn.mrn.r
      Mrmrmn.rmrn...nr.nmmr,.nmm
      M.,r.
      M..m.rm.nm.rm.m..nmm,rm,r..r.rmnrmnrmmrm.n
      R,.nn
      Mmmbrnr.n.mr

  • @leya_lutik9601
    @leya_lutik9601 4 года назад +17

    я как те студенты, не сразу врубилась в фунццию перебора, но я-то могу остановить видео. Му-Ха-Ха!!!
    Спасибо за лекцию!

  • @predatel_rodini
    @predatel_rodini 6 лет назад +24

    Хорошо, что в 2к18 к таким преподавателям есть доступ у всех. Когда я учился в универе, youtube не существовал, а дипломы сдавали на дискетках, а до МФТИ было 10000 км от моего универа. Слава Гуглу, слава RUclips, слава Питону, Гвидо и Тимофею)))).

    • @eugenedukatta9355
      @eugenedukatta9355 Год назад

      "дипломы сдавали на дискетках"... охххх... были времена когда дипломы сдавали написанными рукой на бумаге!

  • @everythingiskubernetes8331
    @everythingiskubernetes8331 2 года назад +14

    выдающийся базовый курс Python! профессор очень увлечен и занят. Самая сложная часть цикла лекций в том, что они на русском языке. Я не говорю по-русски - я учусь. Спасибо, профессор, и спасибо Google Translate!

    • @nicholasspezza9449
      @nicholasspezza9449 2 года назад +3

      Чушь написал недалекий иностранец. Это не базовый курс по Python, тут уже его надо знать, т.к. здесь учат алгоритмам.

    • @konstantin7821
      @konstantin7821 Год назад +5

      @@nicholasspezza9449 Вообще-то этот курс лекций рассчитан так же и на тех, кто не знаком с Python, поэтому с первых лекций постепенно рассказывается и про простейший синтаксис.

    • @SHRTST
      @SHRTST Год назад

      wow, you’re good, good luck

  • @МаркГубин-к6е
    @МаркГубин-к6е 2 года назад +3

    Тимофей Федорович, спасибо за Ваш труд!
    Принцип работы генератора чисел очень напомнил механизм работы одометра.

  • @maratgabitov
    @maratgabitov 3 года назад +32

    Удивительно, что на Ваши лекции студенты не ходят. Когда учился в СПбГТИ(ТУ), у нас в принципе таких преподавателей (которые любят свой предмет и умеют супер качественно его преподнести) не было, к сожалению. Сейчас мне 31, учусь заново)
    Спасибо Вам за труды!

    • @ВасилийВишневский-н2ф
      @ВасилийВишневский-н2ф 2 года назад +5

      Колоссальная учебная нагрузка на студентов физтеха приводит к соблазну проспать те предметы, которые можно выучить самостоятельно. Но я думаю, что посещаемость у Тимофея Фёдоровича всё равно очень хорошая.

  • @andreykelip5631
    @andreykelip5631 2 месяца назад +1

    моё почтение студентам МФТИ если они это понимают. Я весь день потратил разобраться в материале и дошёл только до середины лекции...

  • @maximsatskevich3043
    @maximsatskevich3043 4 года назад +6

    Тимофей, спасибо Вам огромное! Вы великолепный преподаватель.

  • @klopus
    @klopus 6 лет назад +26

    Попробуйте посмотреть с 5:50 на скорости воспроизведения 0,5 забавно :)

    • @ivan.peshkov
      @ivan.peshkov 5 лет назад +4

      И правда забавно, алгоритмы заиграли новыми красками)

    • @evgenymarshin
      @evgenymarshin 4 года назад

      😂😂😂😂😂

    • @maiorchiks3107
      @maiorchiks3107 3 года назад

      😀😀мажет люто 😁

    • @sanjarkenjayev7368
      @sanjarkenjayev7368 3 года назад

      неполенился попробовал да это ж мы как раз после 0.5 ти

  • @DimonRonD
    @DimonRonD 5 лет назад +23

    От лекции к лекции число зрителей убывает. И прямо в начале этой лекции Тимофей то же самое говорит о студентах

  • @Alex-hh5oe
    @Alex-hh5oe 4 года назад +24

    Чет на этом уроке я поплыл, как-то сложновато стало.
    Нужно еще раз пересмотреть с паузами.
    Теория понятна, а вот как код работает....

  • @LSE13
    @LSE13 6 лет назад +14

    Крутая лекция! Посмотрел на скорости 1.5, всё понятно. Спасибо

    • @Inco80Rus
      @Inco80Rus 2 года назад

      А я на 47:55 "Ай-яй-яй" три раза слушал)) пока не врубился наконец...

  • @dushirak
    @dushirak 4 года назад +4

    Рекурсию для N=2, M=2 понял, только когда нарисовал стек вызовов, и бегал глазами по стеку с этими 0 и 1. Потому что продолжать не понимая рекурсию невозможно. Можно не понять формулу которая будет в рекурсии, но визуализировать стек вызовов, отработать условие ретурна в голове надо обязательно, иначе не понять что куда ушло, что кого вызвал и как это работает. На примере генерации всех числе N=2, M=2 можно понять, ведь математической сложности там нет, а рекурсивная витиеватость там есть, по стеку вызов за вызовом, ретурн. Уже не помню, что тут про стек рассказывали, я немного в другом месте смотрел. Однако поверить просто мало, а понять уже пришлось зарисовывать древовидную последовательную схему вызовов, которая являлась стеком.

  • @tirludjin1048
    @tirludjin1048 Год назад

    28:30 можно поменять умолчание у prefix=[] generation_number(N:int, M:int, prefix=[]) и не делать проверку на каждой итерации.

  • @istra3265
    @istra3265 3 года назад +1

    Только ваши лекции спасают меня от мыслей бросить программирование

  • @ВладимирЕрмолов-б4ш
    @ВладимирЕрмолов-б4ш 2 года назад +1

    Спасибо Вам огромное! Задумался, чтобы сына готовить к поступлению в МФТИ после просмотра ваших роликов!

    • @prototyperail-gun5589
      @prototyperail-gun5589 Год назад

      А сын сам хочет в МФТИ?

    • @antioch44channel
      @antioch44channel Год назад

      @@prototyperail-gun5589 он, видимо, просто не знает. В этом и есть одна из ролей родителя по отношению к детям, в случае обдуманной подготовки-воспитания отпрыска.

  • @eugenedukatta9355
    @eugenedukatta9355 5 лет назад +13

    Как-то замудрено реализовано генерация чисел. prefix=None - лишнее, prefix = prefix or [] - лишнее, прилеплять к концу списка значение а потом отлеплять - лишнее. Во-первых это лишнее, во-вторых - это "программистские хитрости" которые сломали мозг бедным студентам. Вот просто и понятно, результат такой-же:
    def generate_numbers(N:int, M:int, prefix = []):
    if M==0:
    print(prefix)
    return
    for digit in range(N):
    generate_numbers(N, M-1, prefix + [digit])
    не надо использовать .append который "портит" исходный список, надо использовать конкатенацию списков, что и показано в реализации выше.
    Кроме того - не рассказано "на пальцах" принцип алгоритма, а сразу началась реализация в коде. Я несколько раз отматывал назад на пересмотр чтобы понять принцип алгоритма, а у студентов все в реальном времени идет.

    • @danxai
      @danxai 5 лет назад

      я вот тоже не понял, зачем отдельно добавлять окончание, запускать рекурсию и тут же убирать digit , если можно запустить рекурсию с нужным окончанием, после выпадения из рекурсии окончания уже не будет. Разве что специально для студентов это сделано, чтобы те поняли, как это работает. Хотя ваш вариант проще для понимания, на мой взгляд.

    • @eugenedukatta9355
      @eugenedukatta9355 5 лет назад +3

      @@danxai На самом деле, в варианте с использованием методов .append и .pop (то есть прилепливание и отлепливание окончания списка) мы гоняем по дереву рекурсии один и тот же объект - список, только меняем его длину. А в предложенном варианте (конкатенация списка и последнего элемента в вызове рекурсии) в каждом вызове рекурсии создается новый список(который уничтожается при возврате из рекурсии), что увеличивает время и забивает память (стек). Но про эти ограничения ничего не сказано в постановке задачи. И по скорости я разницы не заметил. А вот использование None вместо [ ] вообще непонятно зачем.

    • @АркадийПаравозов-р4ф
      @АркадийПаравозов-р4ф 4 года назад

      @@eugenedukatta9355 Подскажите пожалуйста, а как в этом алгоритме получаемые числа не выводить на экран, а запоминать в списке? Пробовал добавить первой строкой в функции создание пустого массива
      result = []
      if M == 0:
      result.append(prefix)
      return.
      Так не получается.

    • @АркадийПаравозов-р4ф
      @АркадийПаравозов-р4ф 4 года назад

      Разобрался.
      def generate_numbers(N:int, M:int, prefix = [],result=[]):
      if M==0:
      result.append(prefix)
      return
      for digit in range(N):
      generate_numbers(N, M-1, prefix + [digit])
      return result

    • @andreykuznetsov7442
      @andreykuznetsov7442 4 года назад

      Спасибо. Ваш коммент помог понять алгоритм и двинуться дальше.

  • @IndexSteadFast
    @IndexSteadFast 5 лет назад +85

    Что-то с этой лекции стало реально сложно

    • @savel2work
      @savel2work 5 лет назад +28

      Да просто это как c уроком по рисованию совы, если вы понимаете, о чём я.

    • @karbafozaga2174
      @karbafozaga2174 5 лет назад +40

      чтобы понять рекурсию надо понять рекурсию

    • @ISUZU2012
      @ISUZU2012 5 лет назад +1

      не то слова как сложно я в шоке

    • @AntonZubkov
      @AntonZubkov 5 лет назад +16

      Как говорят философы, сложное - это сложенное из простого.
      Пока есть только знание о простом, но нет умения (а тем более навыка) оперировать этим простым, то восприятие сложного - трудно (то есть трудозатратно, напрягаться надо).
      Надо после (а иногда лучше и до) прослушивания лекции поразбираться с каждым из её элементов:
      - постановкой задачи;
      - алгоритмом;
      - синтаксисом языка;
      - реализацией алгоритма на языке;
      - графическими представлениями задач;
      - графическими пошаговым представлениями действий программы.
      Если сознательно формировать навык понимания, то со временем станет легче.

    • @НиктоНиктоев-щ7ю
      @НиктоНиктоев-щ7ю 4 года назад

      @@karbafozaga2174 только чуть-чуть поменьше))

  • @iEfimoff
    @iEfimoff 6 лет назад +6

    В моем маленьком городе лекции классные были и преподы выходцы из МГУ, а универ на 300 месте по стране :)

  • @konstantin7821
    @konstantin7821 Год назад

    Генерация перестановок в лексикографическом порядке с помощью ЦИКЛОВ:
    def f(n): # n - натуральное число, где n>1 обозначающее количество элементов в массиве
    A=list(range(n))
    while True:
    print(A)
    i=n-2
    while A[i]>=A[i+1]:
    i=i-1
    if i==-1: return
    j=n-1
    while A[j]

  • @zion4d
    @zion4d 2 года назад

    49:06
    вместо написания функции find в строке #FIXME пишем:
    if number in prefix:
    continue

  • @ИльяМалыгин-е6х
    @ИльяМалыгин-е6х Год назад

    25:50 по такому "дереву" понятно становится как работает алгоритм, но как до этого додумались, вот что самое удивительное😃

  • @sergiozaichenko3485
    @sergiozaichenko3485 9 месяцев назад

    сортировка пузырька и грузила (модифицированная пузырьковая сортировка)
    в цикле ищется минимальный и максимальный элемент массива
    после чего они обмениваются (при необходимости) с крайними элементами (минимальный в начало, максимальный - в конец)
    после чего область обработки (срез массива) уменьшается на 1 с краев, т.к. элементы там уже отсортированные.
    количество итераций повторять до числа, равного половине длинны массива.
    сортировка массива упорядоченного по убыванию требует всего N//2 обменов
    # =========================================================
    def my_sort(arr):
    for j in range(0,len(arr)//2):
    min=j # minimal index
    max=len(arr)-j-1 # maximal index
    for i in range(j,len(arr)-j):
    if arr[min] > arr[i]:
    min = i
    if arr[max] < arr[i]:
    max = i
    if min==i and max==j:#ловушка двойного обмена, в сумме не дающая перестановки
    arr[min], arr[max]=arr[max],arr[min]
    else:
    if max==j:#ловушка обмена затрагивающая перестановку минимального элемента, в которую входит максимальный
    max=(min)
    if min!=j: #не переставлять если элемент на месте
    arr[j], arr[min] = arr[min], arr[j]
    if max!=len(arr)-j-1: #не переставлять если элемент на месте
    arr[len(arr)-j-1], arr[max] = arr[max], arr[len(arr)-j-1]
    return(arr)
    import random
    print("\033[H\033[J", end="")
    # проверка работоспособности алгоритма
    switch=True
    while switch:
    print("
    =Start=
    ")
    unsort = [random.randint(10,99) for x in range (random.randint(30,50))]
    print(unsort)
    check=my_sort(unsort)
    print(check)
    for i in range(len(check)-1):
    if (check[i] - check[i+1]) > 0:
    print("error! len: ",len(check)," pos: ",i," " ,check[i],">" ,check[i+1])
    switch=False

  • @Quickpass-mu2xg
    @Quickpass-mu2xg 4 года назад +1

    45:00
    Заменить на
    M= M or N
    А в вызове функции поставить M=None

    • @vp_arth
      @vp_arth 4 года назад

      Проблема в том, что M=0 необходимое значение

    • @Quickpass-mu2xg
      @Quickpass-mu2xg 4 года назад

      @@vp_arth так всмысле необходимое, я говорю как убрать лишнее и сделать более понятный код. Вместо выражение if в строчке присвоения просто проверять на существование переменной M

    • @АлексейМалышев-ц4ъ
      @АлексейМалышев-ц4ъ 3 года назад

      @@Quickpass-mu2xg тогда до print-а не дойдет ни разу, т.к. при M=0 M станет снова N

    • @АлексейМалышев-ц4ъ
      @АлексейМалышев-ц4ъ 3 года назад

      @@Quickpass-mu2xg если только строку M = M or N поставить после if

  • @xrollup
    @xrollup 4 года назад +2

    Начиная с этой приходится пересматривать по несколько раз.

  • @wonder_go
    @wonder_go 2 года назад

    Мне казалось, что до prefix.pop не дойдёт никогда, попробовал убрать строчку- понял, попробовал вернуть и добавить перед этим строчку print( 'I am here ") - понял всё)
    Строчку prefix = prefix or [ ] можно вообще убрать, а в аргументы функции поставить по умолчанию prefix = [ ]. Работает без ущерба.

  • @AndreiSokolov-k7j
    @AndreiSokolov-k7j 10 месяцев назад

    ето же условие фано как в игэ) эх вспоминаю 2023 когда егэ сдавал и готовился, прикольно было, впервые узнал о сс, рекурсии и т.д.

  • @rurybug4125
    @rurybug4125 5 лет назад

    Жлобьё считет себя гени... альным-->АРМИЯ
    Эпически излагает, "не ,не будем вдавться в синтаксис", но заковырки излагает (!) прям на доске!! РЕСПЕКТ !!! Благодарю

  • @lz7dplzham862
    @lz7dplzham862 4 года назад

    54:35 in def generate_permutations: # print(prefix)
    for i in range(0, N):
    print(prefix[i], end="")
    return

    • @lz7dplzham862
      @lz7dplzham862 4 года назад

      def find(number, A):
      """ search for number in A return True if found
      False if not found
      """
      flag = False
      for x in A:
      if number == x:
      flag = True
      break
      return flag
      def generate_permutations(N:int, M:int=-1, prefix=None):
      """ generation all with N digits in M positions
      with prefix = prefix
      """
      M = N if M == -1 else M
      prefix = prefix or []
      if M == 0:
      # print(prefix)
      # print(*prefix)
      print("")
      for i in range(0, N):
      print(prefix[i], end="")
      return
      for number in range(1, N+1):
      if find(number, prefix):
      continue
      prefix.append(number)
      generate_permutations(N, M-1, prefix)
      prefix.pop()
      generate_permutations(3, 3)

  • @Gerotero-r1o
    @Gerotero-r1o 5 лет назад +1

    Отличные лекции. Благодарю вас.

  • @Roiser101
    @Roiser101 4 года назад +11

    Что-то как-то мудрено объясняется принцип перестановки. Не проще провести аналогию с кодовым замком TSA (на чемоданах такой ставят)? А вывод - это все возможные комбинации. Соответственно, N = 10 - цифры от 0 - 9 на каждом цилиндре, M - это количество цилиндров с цифрами, ну а префикс - это наш счетчик, который мы выводим на каждой итерации - печатаем комбинацию (список).
    Для лучшей визуализации, можно бы было запускать отладку и показывать выполнение кода и значения переменных по шагам.
    А алгоритм хитро написан - полезно знать, спасибо.

    • @MaxPV1981
      @MaxPV1981 4 года назад

      Вообще-то тема про рекурсию. И это пример задачи, которую МОЖНО свести к рекурсивному решению.
      Естественно, у более опытных "алгоритмщиков" появляется желание всю эту возню с префиксом и рекурсией "упростить" - но лекцию-то читают не для них, а для тех, кому нужно понять, что такое рекурсия :)

  • @NethronCoru
    @NethronCoru 6 лет назад +3

    Спасибо.
    Смотрю на x2.75 скорости. Пришлось несколько раз пересматривать 22:05 до 22:10, все время слышал "Я должен единичку туда за'append'ить" на русском, почему-то.

    • @th3754
      @th3754 6 лет назад +1

      Как ты на такой скорости смотришь если у Ютуба Макс х2

    • @Ktykhy
      @Ktykhy 6 лет назад +6

      @@th3754
      Бан в гугле? =)
      javascript:document.getElementsByClassName("video-stream html5-main-video")[0].playbackRate = 2.75

    • @danalexpiano
      @danalexpiano 6 лет назад

      Ktykhy Telepuzik уделал ))))

    • @danalexpiano
      @danalexpiano 6 лет назад

      Денис Головкин ага, ещё и «д» там плохо слышится )))

    • @winandfx
      @winandfx 5 лет назад

      А он говорит не это?

  • @AndreiSokolov-k7j
    @AndreiSokolov-k7j 10 месяцев назад

    в принципе можно с f форматированиемм и со строкой сделать)
    def gen_number(n, m, prefix=""):
    if m == 0:
    print(prefix)
    return
    for i in range(n):
    gen_number(n, m-1, f"{prefix}{i}")

  • @titovcg
    @titovcg 4 года назад +3

    как хорошо, что видео можно отмотать назад)))

  • @mikhailkalashnikov4771
    @mikhailkalashnikov4771 4 года назад +1

    Спасибо! Очень доходчиво объяснили

  • @bektursun
    @bektursun 5 лет назад +28

    В 31:48 чуть не спалился ))

    • @olegvolkov8006
      @olegvolkov8006 4 года назад +9

      Отодрать эту последнею цифру :-D

    • @husanturdiev
      @husanturdiev 4 года назад

      😂

    • @husanturdiev
      @husanturdiev 4 года назад

      Это не могло быть случайностью, ведь буквы находятся далеко не рядом))

  • @ИльяМалыгин-е6х
    @ИльяМалыгин-е6х Год назад

    57:10 Чет у меня пока естественно это не получается это осознать😄. Сложно в голове отслеживать все эти погружения, хочется узнать, что код внутри делает, даже по дебагу сложновато

  • @BoldBass24
    @BoldBass24 4 года назад +2

    Спасибо за контент!

  • @maiorchiks3107
    @maiorchiks3107 3 года назад

    до этой лекции кое-как понимал, в этой 15 минут и поплыл ( буду пока другое учить. сюда позже вернусь...

  • @i7ion
    @i7ion 6 лет назад +45

    На самом деле этот желаемый код:
    if number in prefix:
    continue
    действительно бы сработал.

    • @ТайлерДерден-ю2у
      @ТайлерДерден-ю2у 4 года назад +5

      Я тоже удивился, нафига преподавателю было делать вид, что так нельзя

    • @lebfrspb
      @lebfrspb 4 года назад +7

      @@ТайлерДерден-ю2у проходные алгоритмы ещё раз показать. Он же вроде говорил.

  • @denisbel9740
    @denisbel9740 6 лет назад +1

    Шикарные лекции!

  • @8888UNIVERSE8888
    @8888UNIVERSE8888 6 лет назад

    Это и правда отличные лекции.

  • @Gerotero-r1o
    @Gerotero-r1o 4 года назад

    мне начинают алгоритмы радовать)

  • @Pixel_Magic
    @Pixel_Magic 3 года назад +1

    Я во сне: *бормочу* итак... мы с вами... мыы с вамиии... с вами мы...
    Спасибо за лекцию)

  • @leolis3851
    @leolis3851 5 лет назад +1

    спасибо за лекцию, очень доступно и понятно !

  • @СергейБыковский-ъ1ъ

    В Гарварде есть такой курс под названием CS50. Его так же смотрят и онлайн. Так вот русские там часто пишут - вот это преподаватель, не то что наши... И наши есть такие же ))

    • @ISUZU2012
      @ISUZU2012 5 лет назад +2

      согласен

  • @kresh6187
    @kresh6187 3 года назад

    55:00 Где поиск числа в списке для его дальнейшего исключения. Что если в списке будет 2 одинаковых числа? Как это можно исправить грамотно

  • @okyskaa
    @okyskaa 4 года назад +7

    На восьмой лекции уже деревья и рекурсия, в которой я сижу два года и только после этой лекции начинаю понимать. Что же будет на двадцатой лекции?

  • @borodatsik
    @borodatsik 5 лет назад +4

    Всё время представлял, как мышка на принтере распечатывает префикс :)

  • @AlxAtv76
    @AlxAtv76 6 лет назад

    Отличный курс!!!

  • @Pixel_Magic
    @Pixel_Magic 3 года назад +1

    Генерация всех перестановок: "существует"
    Я: ща взламаю пентагон!

  • @banaaboy6504
    @banaaboy6504 6 лет назад +8

    Как можно такие лекции пропускать?

  • @Luka-se7sl
    @Luka-se7sl 4 года назад

    47:03 Не понял почему надо было создать функцию find() когда можно было написать просто if (number in prefix):

    • @sanakro5492
      @sanakro5492 4 года назад +1

      Чтобы попрактиковаться в написании однопроходных алгоритмов, чисто в образовательных целях. Лектор об этом говорил. Конечно, и лучше, и проще, было бы сделать так, как вы написали.
      Получили бы тот же результат, только без написания велосипедов.

  • @dianaoryol3014
    @dianaoryol3014 2 года назад +1

    Почему нельзя в вызов рекуррентной функции сразу передать prefix.append(digit). Проверяла, не работает. Не пойму, почему?

    • @eugenedukatta9355
      @eugenedukatta9355 2 года назад

      prefix.append(digit) это метод. Он берет список (в данном случае prefix), лепит к нему новый элемент в хвост (в данном случае digit) при этом список становится измененным, и еще(!) возвращает(внимание!!!) результат None. Когда вы передаете в функцию prefix.append(digit), на самом деле передается None, хотя и сам список prefix при этом увеличивается на элемент digit.

  • @victorkrupeichenko8028
    @victorkrupeichenko8028 4 года назад +1

    Здраствуйте, скажите пожалуйста в функции генерации всех перестановок (def generate_permutations), вместо дополнительной функции (def find) можно воспользоваться оператором in ?

  • @willgoonandon3050
    @willgoonandon3050 Год назад

    Ни-я не понятно, но очень интересно!

  • @weightkiller3976
    @weightkiller3976 5 лет назад +3

    Интересно как можно понять работу например gen_bin не вдаваясь в стек вызовов, и пространство имён...

    • @salovafidi8913
      @salovafidi8913 4 года назад

      дерево нарисуй в паинте

    • @weightkiller3976
      @weightkiller3976 4 года назад

      Salova Fidi это не буквальный вопрос, а скорее риторический, понятия стек вызовов и пространство имён должны быть расписаны на соседней доске!

    • @salovafidi8913
      @salovafidi8913 4 года назад

      @@weightkiller3976 про стек вызовов говорилось в первой лекции про рекурсию

    • @weightkiller3976
      @weightkiller3976 4 года назад +1

      Salova Fidi я смотрел все лекции до этой, маловато было сказано по этим темам на мой взгляд, а темы одни из самых важных

    • @salovafidi8913
      @salovafidi8913 4 года назад

      @@weightkiller3976ну мало было, да

  • @Andrei-de6mf
    @Andrei-de6mf 3 года назад +7

    Ладно пацаны, я на месяц отлучусь. Дискретную математику подтяну и инглиш)

  • @НиктоНиктоев-щ7ю
    @НиктоНиктоев-щ7ю 4 года назад +2

    48:00 чет я затупел, а что просто if number in prefix: нельзя было написать? я проверил, так можно))

    • @GeorgiiIurcenco
      @GeorgiiIurcenco 4 года назад

      Просто учителю необходимо было показать однопроходный алгоритм поиска, который он не успел реализовать в прошлых лекциях,
      на таком примере

  • @istra3265
    @istra3265 3 года назад +1

    Help! Параметр (префикс) передан как None, при рекурсии он меняет свое значение как глобальная переменная или при каждом вызове сбрасывается в None?

    • @ПавелМаксимов-н6о
      @ПавелМаксимов-н6о 3 года назад

      При рекурсии в функцию передаётся значение prefix, поэтому значение по умолчанию (=None) уже не применяется.

  • @predatel_rodini
    @predatel_rodini 6 лет назад +5

    я ещё нуб в питоне, но что-то я не понял, зачем была нужна это котовасия с написанием функции find на 52:00, если было достаточно написать в функции generate_permitations:
    if number in prefix: continue # это выражением само по себе бы выдало True или False.
    Может это было в целях обучения?

    • @alexeygumenyuk8510
      @alexeygumenyuk8510 5 лет назад

      Да. Он потом об этом сказал)

    • @_ArPTech_
      @_ArPTech_ 5 лет назад

      ради однопроходных алгоритмов

  • @halloweex
    @halloweex 3 года назад +1

    Почему то не удалось воспроизвести алгоритм перестановки, повторил все в точности, проверял много раз, и все равно не хочет перебирать у меня.

  • @shtern_of_kruzenshtern
    @shtern_of_kruzenshtern 9 месяцев назад

    Единственное, что не понятно, а что если барьерным элементом будет выбран наименьший?

  • @clinteastwood957
    @clinteastwood957 5 лет назад +2

    Prefix = Prefix or [ ]. Кто нибудь, объясните, почему он не может присвоить None? Ведь по умолчанию это и есть None? Не понял логику

    • @stanislavch5323
      @stanislavch5323 5 лет назад

      В шапке у него присваевается Prefix = None, чтобы переменная была объявлена. Он не может в шапке сделать Prefix = [], потому что поведение функции будет совсем другим. А в части Prefix = Prefix or [] ему уже нужно, чтобы префикс или сохранил свое значение или стал пустым массивом.

    • @eugenedukatta9355
      @eugenedukatta9355 5 лет назад +3

      Операция or (а также and) - это логическая операция, и вообще она должна работать с логическими значениями (типа True и False) и возвращать логическое значение тоже. Но язык так реализован, что каждое значение логической операции неявно преобразуется к логическому типу с помощью функции bool(). То есть выражение Prefix = Prefix or [ ] - реализуется как Prefix = bool(Prefix) or bool([ ]). А все "пустые" значения преобразуются в False: bool(None), bool(False), bool(0), bool([ ]), bool(), bool(''), bool(""), bool({}), bool(()) - это все False. Второй факт - если в операции or первый (левый) операнд равен False то он вычисляет следующий операнд и даже не вникая в его логическое значение - возвращает его целиком в том виде в каком он представлен. Так как bool(None)==False то он его пропускает, далее вычисляет и возвращает второй операнд [ ]. То же самое для if () и while().

    • @eugenedukatta9355
      @eugenedukatta9355 5 лет назад +5

      @@stanislavch5323 это все лишнее. В шапке надо сделать prefix = [ ], а в рекурсивный вызов функции передавать prefix + [digit] И все прекрасно работает - проверено.

    • @istra3265
      @istra3265 3 года назад

      @@eugenedukatta9355 Help! Параметр (префикс) передан как None, при рекурсии он меняет свое значение как глобальная переменная или при каждом вызове сбрасывается в None?

    • @eugenedukatta9355
      @eugenedukatta9355 3 года назад

      @@istra3265 В видео, функция выглядит так:
      def generate_numbers(N:int, M:int, prefix = None):
      здесь параметр prefix не передается как None. prefix = None означает значение по умолчанию, которое принимает параметр, если параметр не передается явно. В примере, (первый) раз функция вызывается без параметра prefix и он в первом вызове принудительно принимает значение по умолчанию = None. В первом вызове срабатывает строка "prefix = prefix or []" и значение prefix становится [] то есть пустым списком.
      В следующих (рекурсивных) вызовах , строка "prefix = prefix or []" не меняет значения prefix
      В последующие (рекурсивные) вызовы параметр prefix передается явно, его новое значение вычисляется до рекурсивного вызова в строке "prefix.append(digit)" - список prefix удлиняется новым числом в конце списка и передается далее по рекурсии.
      prefix в каждом вызове это разные переменные (локальная переменная)

  • @незнайкалунный-ю9ж
    @незнайкалунный-ю9ж 5 лет назад +4

    мне, по словам лектора, "не вошло". если кто-то выпадает вначале, то лучше просмотр начинать с 32минуты.

  • @ИльяПудов-в5г
    @ИльяПудов-в5г 7 месяцев назад

    А зачем переопределять переменную списка вот этим prefix = prefix or [ ] ? Я сразу в переменную поставил дефолтное значение prefix=[ ] и всё работает точно также

  • @freelife1000
    @freelife1000 5 лет назад +1

    Можешь построить функцию просмотров видео от номера лекции

  • @farshman57
    @farshman57 2 года назад

    Шеня цитирует! Класс!

    • @konstantin7821
      @konstantin7821 Год назад

      У Шеня описание алгоритма перестановок для меня было не понятным, пришлось на просторах интернета искать более доходчивое описание

  • @radunov.a
    @radunov.a 10 месяцев назад

    все поняли эту функцию generate_numbers? Я пересмотрел пару раз, не понял. Понял что делает, но как работает и как к такому приити не понял

  • @IlyaZherebtsov
    @IlyaZherebtsov Год назад

    интересно, почему сами написали функцию find, а не воспользовались готовой prefix.__contains__(number)

    • @mr.angrom
      @mr.angrom Год назад

      if number in prefix:
      continue

  • @nikichpyk
    @nikichpyk 6 лет назад +1

    Офигенно!!

  • @ПетяШумский-л1ж
    @ПетяШумский-л1ж 5 лет назад +1

    from itertools import permutations
    работает значительно быстрее, значительно)

    • @MrPemmmz
      @MrPemmmz 4 года назад +1

      дружище, конечно так можно, но смысл то в том что бы понять алгоритм и то как это работает.

  • @maxviewtoday
    @maxviewtoday 4 года назад +1

    Очень не легко стало... Понять трудно

  • @TyTaHXaMoH23
    @TyTaHXaMoH23 4 года назад +1

    у меня почему- то не запускается программа. нажимаю ран(F5), она сейвает и дальше пишет >>> и все.. в чем проблема?

  • @Efimov1982
    @Efimov1982 4 года назад

    После этой лекции, смог решить задачу
    DONALD
    +
    GERALD
    __________
    ROBERT
    Где D=5, с помощью грубой силы.

    • @Efimov1982
      @Efimov1982 4 года назад

      def subs_char(Names:list, letter:str, num:int):
      for name in Names:
      for idx, char in enumerate(name):
      if type(char) == str and char == letter:
      name[idx] = num
      def check_ford_task(prefix):
      Names=[['g','e','r','a','l','d'],['d','o','n','a','l','d'],['r','o','b','e','r','t']]
      table = ['t', 'd', 'e', 'g', 'l', 'n', 'o', 'r','a', 'b']
      for idx, char in enumerate(table):
      subs_char(Names, char,prefix[idx])
      for idx, name in enumerate(Names):
      Names[idx] = int("".join(str(num) for num in name))
      if Names[0] + Names[1] == Names[2]:
      print('gerald = {}'.format(Names[0]))
      print('donald = {}'.format(Names[1]))
      print('robert = {}'.format(Names[2]))
      return True
      return False
      def generate_permutation(N:int, M:int=-1, prefix=None):
      M=N if M == -1 else M
      prefix = prefix or []
      if M == 0:
      if check_ford_task(prefix):
      import sys
      sys.exit()
      return
      for number in range(0, N):
      if number in prefix:
      continue
      prefix.append(number)
      generate_permutation(N, M-1, prefix)
      prefix.pop()
      map = [0, 5] # d =5, t = 0
      generate_permutation(10,8,map)

    • @konstantin7821
      @konstantin7821 Год назад

      Непонятна суть задачи, даже после просмотра результата выполнения.... код читать лень.

  • @user-serji0
    @user-serji0 3 года назад

    либо я не догоняю, либо алгоритм перестановок возможных чисел не верный. На каждой итерации алгоритм проходится по ВСЕМ числам из системы счисления, благодаря чему 1) числа повторяются (противоречит 2:28), 2) количество перестановок из трех чисел должно быть: 1х2х3 = 6, алгоритм же выдает 27 вариантов (3 варианта на 1ой позиции Х 3 варианта на 2ой позиции Х 3 варианта на 3ей позиции)

  • @ПлатонТрипуть
    @ПлатонТрипуть Год назад

    я в 9 классе учусь , хочу в МФТИ , надеюсь что вы будете преподавать, если поступлю)

  • @maksim4334
    @maksim4334 4 года назад +1

    Можно лекции где он все успел? 😒

  • @hellocode_dev
    @hellocode_dev 2 года назад

    Нее, рекурсия, не просто зашла ((
    Ну не то чтобы принцип сложный, нет здесь все понятно, но когда дело доходить до вызова в цикле, не сразу в голове сложилось, лично мне не хватило детального разбора в какой момент какой рекурентный случай в какой ячейке будет генерировать какое число.
    P.S. лекции слушаю в дороге, нет возможности тут же экспериментировать, это конечно, Очень сильно усложняет процесс обучения, но что имеем (((..
    Короче пока спокойно не сел и не переслушал еще как минимум дважды не разобрался
    За лекции низкий поклон!

    • @nikus20111111
      @nikus20111111 2 года назад

      самое забавное что нам преподавали все что в лекциях больше 20 лет назад (первый выпуск по ИТ специальности одного института). с годами все забылось, в сейчас зато вспоминается и легко понимаешь про что речь.

  • @Santiago21_RU
    @Santiago21_RU 4 года назад

    Как сделать чтобы prefix не печатался а ретурнился (извиняюсь)? Просто return prefix не работает, дает None. Другими словами, как результаты загнать в переменную?

  • @kartushinav
    @kartushinav 4 года назад

    все круто и понятно!
    только не понял зачем find() надо было писать. можно было отсечь одним if number not in prefix, но это мелочь в целом

  • @Dimas-Dubna
    @Dimas-Dubna 7 месяцев назад

    Что такое prefix?

  • @oanovitskij
    @oanovitskij 3 года назад

    Что значит перестановки в m позициях?

  • @ChuvakSurala
    @ChuvakSurala 4 года назад

    Объясните, пожалуйста, по поводу момента где, лектор говорит, что в аргумент функции нельзя передать пустой список, потому что в таком случае "он сгенерится один раз" и останется одним и тем тем же.
    ruclips.net/video/2XFaK3bgT7w/видео.html
    Попробовал передать в prefix=[ ] - результат выполнения функции не изменился

  • @АндрейЗорин-с4э
    @АндрейЗорин-с4э 6 лет назад

    def permutations(lst):
    return [lst] if len(lst) == 1 else \
    [[el]+p for el in lst
    for p in permutations(list(filter(lambda x: x != el, lst)))]
    print(permutations([1, 2, 3]))

    • @glebpyzhov540
      @glebpyzhov540 4 года назад

      оно будет на каждой рекурсии по списку на стек лОжить ?

  • @MaxPV1981
    @MaxPV1981 4 года назад

    Поставил на паузу на 19:08, записал. Пытаюсь включить несколько раз - ничего. Потом замечаю, что что-то не так. Глаза у Тимофея двигаются. Стало страшно.

  • @limirikys
    @limirikys 4 года назад

    def generate_number(N: int, M: int, prefix=None):
    prefix = prefix or []
    if M == 0:
    print(prefix)
    return
    for digit in range(N):
    prefix.append(digit)
    generate_number(N, M - 1, prefix)
    prefix.pop()
    generate_number(3, 3)
    Не могу въехать, почему в то время когда
    M>0
    не срабатывает prefix.pop()
    но проход по prefix.pop() происходит при М==0

    • @absent6322
      @absent6322 4 года назад

      потому что pop() работает только после выхода из функции generate_number(а выход происходит при М == 0)

  • @Berseny
    @Berseny 4 года назад

    Не буду утверждать ничего об ожидаемых прорывах отечественной школы программирования, хотя лекции качественные. А вот в обороноспособности нашей страны нет решительно никаких сомнений! С такими солдатиками для опытов по сортировкам нам ничего не страшно! Ура, товарищи! (если что, это легкая ирония, не отражающая реального положения дел в ВПК)

  • @denisporubov
    @denisporubov 4 года назад

    Вот реально с этим prefix.pop() было сложно. Пришлось тормознуть видео, и тупо вручную накидать алгоритм, чтобы понять зачем выкидывать последний элемент из массива. Думаю, у студентов на лекции те же проблемы.

    • @pyJlb
      @pyJlb 3 года назад

      ну дак и в чем же? накидываю от руки, накидываю, а в голову пока не приходит понимание 😬

    • @pyJlb
      @pyJlb 3 года назад

      а, уже понял 😂

  • @Gemini1988I
    @Gemini1988I 5 лет назад +1

    можно строить функцию и по количеству просмотров от номера лекции

    • @mr.angrom
      @mr.angrom Год назад

      И даже эта функция не объективна, потому что чем дальше - сложнее тема. Из-за этого оставшиеся начинают пересматривают видео. То есть фактически оставшихся даже ещё меньше, чем просмотров))

  • @dznshfvt
    @dznshfvt 3 года назад

    А почему не написать в функции generate_permutations(N:int, M:int, prefix=None):
    M = M or N

    • @SemyonKalyakulin
      @SemyonKalyakulin 2 года назад

      в этом случае, если m = -1, то m примет значение самого себя, т.к. оператор or возвращает первый же "истинаподобный" элемент (если таковой имеется)

  • @_Limay_
    @_Limay_ 6 лет назад +1

    Может кто объяснить, зачем так вводить prefix в первой функции? Почему просто не написать, что он равен пустому списку, ведь результат тот же?

    • @romanivanov9266
      @romanivanov9266 6 лет назад +2

      Если написать пустой список среди списка переменных, то он создается только один раз, и для всех вызовов он будет общим, и туда будут попадать элементы от всех вызовов.

    • @EtsuNDmA
      @EtsuNDmA 6 лет назад

      Нельзя передавать в качестве аргументов по умолчанию изменяемые объекты! Причина написана в комментарии выше

    • @rusnickk
      @rusnickk 6 лет назад +1

      Все верно, строка prefix=prefix or [] здесь лишняя можно было обойтись значением по умолчанию. Объект prefix ссылочного типа и в каждом вызове функции мы ссылаемся на один и тот же список, поэтому необходимо удалять после вызова функции добавленный элемент. Можно тело цикла реализовать иначе: gen_nums(n, m - 1, [*prefix, i]) тогда на каждый вызов функции будет создаваться новый список с копированием текущего содержимого списка prefix и добавлением в конец следующего числа.

    • @rusnickk
      @rusnickk 6 лет назад +1

      В данной реализации в prefix и так храниться один общий для всех рекуррентных вызовов функции список, так как строка prefix=prefix or [] отработает ровно один раз, что эквивалентно параметру по умолчанию

    • @Віталій
      @Віталій 6 лет назад

      Это ведёт преподаватель, а не программист. Боюсь у него это просчитано уже много-много раз (аж надоело) и он тупо думает над тем как нас заинтриговать(потому и так внимательно в зал поглядывает(жертву ищет)) чтобы думали. Как идеально решается эта задача см. в методичке (у старших курсов).
      Не удивлюсь когда узнаю, что есть ещё пара возможно скрытых видеокамер, которые снимают аудиторию.

  • @ФедякинРоман
    @ФедякинРоман 3 года назад

    Есть знающие люди в комментах? Как реализовать этот рекурсивный код в виде генератора чисел, так чтобы это был генератор, а не просто печаталка? Т.е. чтобы функция что-то возвращала и я мог перебирать эти значение.
    Пыжился, пытался использовать yield prefix в базовом случае и yield from gen_bin(length, prefix + f'{i}'), но ничего не работает.
    Можно конечно вместо принта все в глобальный список складывать, но это вроде как бэд практис, есть ли более элегантное решение?

    • @prototyperail-gun5589
      @prototyperail-gun5589 Год назад

      Тут нужно переходить от рекурсии к итеративному алгоритму со стеком

  • @zerocool4eg
    @zerocool4eg 6 лет назад

    Сортировка Хоара - лучший случай n log^2 n
    Сортировка слиянием - n log n
    Сортировка Хоара же быстрее выходить должна, почему здесь на доске одинаковые значения

    • @romanivanov9266
      @romanivanov9266 6 лет назад

      Вы ошиблись, сортировка Хоара (она же быстрая) имеет сложность n*log(n) в среднем.

    • @nihonam
      @nihonam 6 лет назад +1

      год назад умеренно вникал в сортировки и их сравнение. Хоар хорошо работает на больших массивах, на мелких (меньше 20-30 элементов) может проигрывать.

  • @AndreiSokolov-k7j
    @AndreiSokolov-k7j 10 месяцев назад

    47:47 что это было

  • @AlexanderTvorogov
    @AlexanderTvorogov 5 лет назад

    Рекуррентный и рекурсивный синонимы в английском и соответственно в русском.

  • @sinoikromov7322
    @sinoikromov7322 2 года назад

    Одну минуточку was in есть в пайтоне 😉

  • @barkas2589
    @barkas2589 3 года назад

    Спасибо

  • @Pixel_Magic
    @Pixel_Magic 3 года назад

    Я 13-летний школьник. Ты топ