#8. Односвязный список. Структура и основные операции | Структуры данных

แชร์
ฝัง
  • เผยแพร่เมื่อ 1 ธ.ค. 2024

ความคิดเห็น • 49

  • @siarheiulas6969
    @siarheiulas6969 ปีที่แล้ว +9

    Очень интересная тема. Большое спасибо за объяснение!

    • @mslq
      @mslq ปีที่แล้ว

      Однозначно.

  • @Максим-т5ш8и
    @Максим-т5ш8и 2 ปีที่แล้ว +18

    О, помню как я в курсе по ООП разбирался с односвязными и двусвязными списками. На всю жизнь запомнил))

    • @_mrmark
      @_mrmark ปีที่แล้ว +2

      Я сейчас разбираюсь. Уже голова кругом идет. Почти что-то доходит, но очень туго ))

    • @ИльяСевостьянов-э5т
      @ИльяСевостьянов-э5т ปีที่แล้ว

      такое не забудешь

  • @Artem-er3ie
    @Artem-er3ie ปีที่แล้ว +2

    Вы лучший

  • @ЕрвандАгаджанян-в3к
    @ЕрвандАгаджанян-в3к 2 ปีที่แล้ว +3

    Спасибо огромное! Очень круто!!!

  • @dshigh
    @dshigh ปีที่แล้ว +2

    Огромное спасибо!

  • @eltimccc
    @eltimccc ปีที่แล้ว +10

    Лучше чем эти уроки, я не видел!
    Но неплохо бы было пояснить, как перебрать элементы до того элемента, после которого планируется вставка еще одного...
    while node?

  • @kish_mish_haha8551
    @kish_mish_haha8551 9 หลายเดือนก่อน +4

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

  • @donfedor007
    @donfedor007 11 หลายเดือนก่อน +3

    очень полезный материал! Почему так мало лайков? Я вот смотря на степике перехожу на ютуб и лайкаю.

  • @СергейФролов-ъ5я
    @СергейФролов-ъ5я 2 ปีที่แล้ว +4

    Уточните, пожалуйста, а почему добавление в конец это не O(n)? Мы же должны вначале последовательно дойти до текущего конечного элемента, чтобы поменять у него ссылку. Точно так же как проходим до предпоследнего когда удаляем с конца

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +1

      мы когда добавляем, то на последний элемент есть указатель tail, поэтому новый элемент ptr просто цепляется к нему, то есть:
      tail.next = ptr
      ptr.prev = tail
      tail = ptr
      и все

    • @СергейФролов-ъ5я
      @СергейФролов-ъ5я 2 ปีที่แล้ว +1

      @@selfedu_rus спасибо, вопрос возник в связи с тем, что в языке скала list это односвязный список, но при этом в документации написано что добавление в конец занимает O(n). Скорее всего, потому что tail там ссылается не на последний элемент, а на список всех кроме первого. docs.scala-lang.org/overviews/collections/performance-characteristics.html

  • @АндрейДеревяшко-з4и
    @АндрейДеревяшко-з4и 11 หลายเดือนก่อน +1

    Удаление из конца тоже должно быть О(1) - у нас есть указатель на конец списка. Разве не так?

  • @wizardx_X
    @wizardx_X ปีที่แล้ว +2

    Немного не понятно, как реализовать этот список с начального состояния. То есть сначала у нас нет объектов, и head, tail node равный None. Потом мы создаем первый объект, на который указывает все 3 переменные. Дальше мы создаем второй объект, на который теперь указывает tail и node, потом третий также, четвертый и т.д. Я правильно понял?

  • @salten13
    @salten13 ปีที่แล้ว +1

    Почему говориться что в конец односвязного списка вставка О(1) ? Просто как я понял , чтобы присвоить предпоследний элемент в тейл, нам нужно будет этот предпоследний элемент найти, итерируя список с головы. так как привиос метки у нас нет.

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว

      У нас имеется указатель tail, который всегда ссылается на последний элемент. Он формируется при добавлении новых элементов (и их удалении).

    • @salten13
      @salten13 ปีที่แล้ว +1

      @@selfedu_rus ну, допустим. У нас есть сингл лл. У него есть тейл. У тейла есть поле некст привиос нету как в длл. Чтобы удалить тейл нам сначала же надо найти превиос. Тоесть элемент который стоит перед тейлом который и будет после удаления новым тейлом. Чтобы его найти нам надо по некстам нодов про итерировать с головы. Я об этом. Как бы удаление будет (1) но под капотом удаления ещё и итерация, а это уже О(N)

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว +1

      @@salten13 здесь речь о добавлении, удаление да, O(N)

    • @salten13
      @salten13 ปีที่แล้ว

      @@selfedu_rus Понял. В любом случае, спасибо за пояснения!

  • @ВячеславОсипов-ч2ь
    @ВячеславОсипов-ч2ь ปีที่แล้ว +1

    Вродебы понятно, но для чего это используется?)

  • @КонстантинАлексеев-ы9б
    @КонстантинАлексеев-ы9б 10 หลายเดือนก่อน +1

    В теории вск понятно, а вот как это в код перенести,вот в чем вопрос

  • @РоманМомотов-ш9й
    @РоманМомотов-ш9й 4 หลายเดือนก่อน

    Почему BigO вставки нового элемента в конец связного списка равна O(1)? Нам ведь нужно пробежаться по всем элементам уже входящим в этот список перепрыгивая с одного элемента на другой по ссылке и остановится, когда у последнего элемента не окажется ссылки, и только после этого, мы связываем наш новый элемент с последним т.е. производим операцию добавления в конец. Следовательно, если мы всё равно пробегаем по всем элементам перед вставкой нельзя считать что это O(1), это O(n). А в интернетах ваших тоже пишут O(1), объясните, почему я не прав?

    • @РоманМомотов-ш9й
      @РоманМомотов-ш9й 4 หลายเดือนก่อน

      Если бы мы всегда знали последний элемент списка (tail) то добавление к нему нового элемента было бы за время O(1), тут вопросов нет, всё понятно, но ведь что бы узнать этот последний элемент мы поэлементно обходим список до конца и нигде не храним адрес последнего элемента (tail) храним только начало списка (head)

  • @mslq
    @mslq ปีที่แล้ว +1

    А указатели должны быть в обе стороны списка у каждого объекта, тогда всё быстро, не надо с самого начала перебирать.

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว +1

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

    • @mslq
      @mslq ปีที่แล้ว

      @@selfedu_rus Есть ли готовый объект с двусторонним ходом? чтобы самому не городить.

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว

      @@mslq collections.deque

    • @mslq
      @mslq ปีที่แล้ว +1

      @@selfedu_rus Нашёл, спасибо.

  • @youtubeyoutube6205
    @youtubeyoutube6205 2 ปีที่แล้ว +1

    06:53
    а как на счёт добавить в каждый элемент ещё и ссылку на предыдущий? тогда доступ к произвольному элементу может быть осуществлен за O(n/2) 😁

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +8

      это уже будет двухсвязный список (о нем далее), а O(n/2) = O(n) - см. занятие по О большому

  • @ДенисАнциборов-б6т
    @ДенисАнциборов-б6т ปีที่แล้ว +2

    Ощущаю себя олигофреном... Вроде всё схематически понятно. Но как реализовать без понятия. Посмотрел реализацию односвязного списка и ничего не понял. Реально затуп. Сложно в голову укладывается... Уважуха и белая зависть тем кто всё улавливает на лету)

    • @mslq
      @mslq ปีที่แล้ว +4

      таких нет, мне например раза с третьего или с пятого просмотра заходит, зависит от сложности. )

  • @buzzerbeatz5927
    @buzzerbeatz5927 2 ปีที่แล้ว +1

    все, кроме команд iterator, может быть реализовано с временной сложностью O (1) :)

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +3

      произвольный доступ к элементу, в общем случае, не может, требует O(n) времени, иначе бы от массивов просто отказались бы ))

    • @mslq
      @mslq ปีที่แล้ว

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

  • @gpankov
    @gpankov ปีที่แล้ว +1

    О от единицы, что такое О? Что такое единица?

    • @gpankov
      @gpankov ปีที่แล้ว +2

      единица это количество элементов О(n). n - это количество элементов в списке.
      А что такое О? Время почему О?

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว +1

      @@gpankov см. первые два занятия