Найти тему

Грокаем алгоритмы. Массивы и связанные списки. Часть 3.

Заметки:

  1. Память компьютера — это как большой шкаф с ящичками и у каждого есть адрес.
  2. Когда мы используем массив, то все элементы хранятся в шкафчике в соседних ящичках. Но тут есть проблема, если захотим новый предмет положить в середину: придется искать новый кусочек шкафа, где все поместятся, и размещать заново. Это очень медленно.
  3. Можно заранее в шкафу забронировать место для 10 предметов на всякий случай, но и тут есть проблемы: место может не понадобиться и память будет зарезервирована просто так. Плюс, если захотим сохранить 11-й предмет, то все равно придется перемещать.
  4. В связанном списке предметы размещаются в рандомных ящичках. Каждый предмет знает, в каком ящичке лежит следующий предмет. Таким образом образуется цепочка. И тут ничего никогда не надо перемещать, потому что место всегда найдется.
  5. Проблема связанного списка: мы не можем просто так взять и узнать, в каком ящике у нас хранится последний предмет. Тут придется сначала открыть первый ящик, там узнать где второй и т.д., пока не дойдём до последнего. Отсюда делаем вывод: связанные списки подходят, чтобы читать данные последовательно, но если хотим прыгать с ящика на ящик, то выбираем массив. В массиве мы всегда знаем где что лежит.
  6. Элементы массива нумеруются с 0.
  7. Чтение у массивов — О(1). У списков — О(n).
  8. Вставка у массивов — O(n). У списков — O(1). Помним, что сложность считает самый плохой вариант.
  9. Удаление у массивов — O(n). У списков — O(1).
  10. Вставка в середину лучше у списков. Тут придется просто у предыдущего элемента поменяется указатель. Он запомнит, что после него идет теперь какой-то новый элемент и всё. А в массиве придётся сдвигать все элементы, которые должны идти после вставленного.
  11. При удалении всё аналогично.