Ласкаво просимо!

Структури даних і алгоритми в Python

Miriam Antona

Software Engineer

Важливість алгоритмів і структур даних

  • Структури даних та алгоритми дають змогу
    • розв'язувати щоденні задачі
    • за допомогою ефективного коду
  • Курс можна викладати будь-якою мовою програмування
Структури даних і алгоритми в Python

Алгоритми та структури даних

  • Алгоритм: набір інструкцій для розв'язання задачі

    1. Проєктування

      Схематичне зображення проєктування алгоритму.

    2. Кодування

      Схематичне зображення коду алгоритму.

  • Структури даних: зберігають і опрацьовують дані під час виконання алгоритму
    • Складні структури даних: зв'язані списки, стеки, черги...
Структури даних і алгоритми в Python

Зв'язані списки

Візуальний приклад зв'язаного списку з кроками приготування хліба.

  • Послідовність даних, з'єднаних посиланнями
Структури даних і алгоритми в Python

Зв'язані списки — структура

Подання вузла у зв'язаному списку.

Структури даних і алгоритми в Python

Зв'язані списки — структура

Подання вузла у зв'язаному списку зі словом "DATA" у першій частині.

Структури даних і алгоритми в Python

Зв'язані списки — структура

Подання вузла у зв'язаному списку зі словами "DATA" у першій частині та "NEXT" з вказівником у другій.

Структури даних і алгоритми в Python

Зв'язані списки — структура

Подання двох вузлів зв'язаного списку, з'єднаних посиланням.

Структури даних і алгоритми в Python

Зв'язані списки — структура

Подання кількох вузлів зв'язаного списку, з'єднаних посиланнями.

Структури даних і алгоритми в Python

Зв'язані списки — структура

Подання зв'язаного списку, де останній вузол вказує на null.

Структури даних і алгоритми в Python

Зв'язані списки — структура

Подання зв'язаного списку зі словом "HEAD" у першому вузлі.

Структури даних і алгоритми в Python

Зв'язані списки — структура

Подання зв'язаного списку зі словом "TAIL" в останньому вузлі.

  • Дані не обов'язково зберігати в суміжних блоках пам'яті
  • Дані можуть бути в будь-якій доступній адресі пам'яті
Структури даних і алгоритми в Python

Односпрямовані зв'язані списки

Подання односпрямованого зв'язаного списку.

  • Одне посилання: односпрямований зв'язаний список
Структури даних і алгоритми в Python

Двоспрямовані зв'язані списки

Подання двоспрямованого зв'язаного списку.

  • Два посилання в обох напрямках: двоспрямований зв'язаний список
Структури даних і алгоритми в Python

Зв'язані списки — практичні застосування

  • Реалізують інші структури даних:
    • стеки
    • черги
    • графи
  • Доступ до інформації шляхом переходів назад і вперед
    • веббраузер
    • музичний плейлист
Структури даних і алгоритми в Python

Зв'язані списки — клас Node

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None
Структури даних і алгоритми в Python

Зв'язані списки — клас LinkedList

class LinkedList:
  def __init__(self):
    self.head = None
    self.tail = None
Структури даних і алгоритми в Python

Зв'язані списки — методи

  • insert_at_beginning()
  • remove_at_beginning()
  • insert_at_end()
  • remove_at_end()
  • insert_at()
  • remove_at()
  • search()
  • ...
Структури даних і алгоритми в Python

Зв'язані списки — insert_at_beginning

Подання односпрямованого зв'язаного списку.

Структури даних і алгоритми в Python

Зв'язані списки — insert_at_beginning

Подання односпрямованого зв'язаного списку та нового вузла,

 def insert_at_beginning(self, data):
    new_node = Node(data)

if self.head:
Структури даних і алгоритми в Python

Зв'язані списки — insert_at_beginning

Подання односпрямованого зв'язаного списку з підключеним новим вузлом.

 def insert_at_beginning(self, data):
    new_node = Node(data)
    if self.head:
      new_node.next = self.head

Структури даних і алгоритми в Python

Зв'язані списки — insert_at_beginning

Подання односпрямованого зв'язаного списку з підключеним новим вузлом і словом "HEAD" у цьому вузлі.

 def insert_at_beginning(self, data):
    new_node = Node(data)
    if self.head:
      new_node.next = self.head
      self.head = new_node

Структури даних і алгоритми в Python

Зв'язані списки — insert_at_beginning

Подання нового вузла в порожньому зв'язаному списку.

 def insert_at_beginning(self, data):
    new_node = Node(data)
    if self.head:
      new_node.next = self.head
      self.head = new_node
    else:

self.tail = new_node self.head = new_node
Структури даних і алгоритми в Python

Зв'язані списки — insert_at_end

  def insert_at_end(self, data):
    new_node = Node(data)
    if self.head:  

self.tail.next = new_node
self.tail = new_node
else:
self.head = new_node self.tail = new_node
Структури даних і алгоритми в Python

Зв'язані списки — search

def search(self, data):

current_node = self.head
while current_node:
if current_node.data == data:
return True

Подання односпрямованого зв'язаного списку зі словом "current_node", що вказує на перший вузол.

Структури даних і алгоритми в Python

Зв'язані списки — search

def search(self, data):
  current_node = self.head
  while current_node:
    if current_node.data == data:
      return True
    else:
      current_node = current_node.next

Подання односпрямованого зв'язаного списку зі словом "current_node", що вказує на другий вузол.

Структури даних і алгоритми в Python

Зв'язані списки — search

def search(self, data):
  current_node = self.head
  while current_node:
    if current_node.data == data:
      return True
    else:
      current_node = current_node.next

return False

Подання односпрямованого зв'язаного списку зі словом "current_node", що вказує на третій вузол.

Структури даних і алгоритми в Python

Зв'язані списки — приклад

Подання нового вузла в порожньому зв'язаному списку.

sushi_preparation = LinkedList()

sushi_preparation.insert_at_end("prepare")
Структури даних і алгоритми в Python

Зв'язані списки — приклад

Подання нового вузла, доданого в кінець зв'язаного списку.

sushi_preparation = LinkedList()  
sushi_preparation.insert_at_end("prepare")
sushi_preparation.insert_at_end("roll") 

Структури даних і алгоритми в Python

Зв'язані списки — приклад

Подання нового вузла, доданого на початок зв'язаного списку.

sushi_preparation = LinkedList()  
sushi_preparation.insert_at_end("prepare")
sushi_preparation.insert_at_end("roll") 
sushi_preparation.insert_at_beginning("assemble")
Структури даних і алгоритми в Python

Зв'язані списки — приклад

Подання зв'язаного списку.

sushi_preparation.search("roll")
True
sushi_preparation.search("mixing")
False
Структури даних і алгоритми в Python

Давайте потренуємось!

Структури даних і алгоритми в Python

Preparing Video For Download...