CSCS Visual Lab
Модул: Структури от данни

Основни структури от данни

Изследвайте поведението на масиви, свързани списъци, стекове и опашки. Контролирайте всяка операция и наблюдавайте как състоянието се променя стъпка по стъпка.

Масиви

Масивът е последователна структура от данни, достъпна чрез индекс и подходяща за линейно пресичане.

Цели: Достъп до елементи по индекс • Търсене в масив (линейно и двоично) • Добавяне и премахване на елементи
Среден случайO(n)
Най-лошO(n)
ПаметO(n)

Манипулация на масив и търсене

Сравнете линейното и двоичното търсене. Въведете стойности, изберете алгоритъм и проследете стъпките.

#02
#14
#27
#311
#415
#520

Последна стъпка:

Псевдокод

  1. #compare

    обход за i от 0 до n

  2. #found

    връщане на индекса при съвпадение

  3. #not-found

    върни -1 при липса

Приложете показаните операции в реална C# имплементация.

Работа с масив (C#)

Достъп по индекс

Управление на последователни данни.

Достъпът по индекс в масива е операция с константна сложност O(1), тъй като адресът се изчислява директно.

Линейно срещу двоично търсене

Избор на подходящ алгоритъм за търсене.

Линейното търсене проверява всеки елемент последователно, докато двоичното изисква сортиран масив и разделя диапазона наполовина.

Вмъкване и изтриване

Оценка на цената на модификациите.

Добавянето в края е O(1) (амортизирано), а в началото – O(n), защото елементите се преместват.

Кратък куиз

Тествайте знанията си по темата. Отговорете на всички въпроси и натиснете „Провери“.

Въпрос 1: Каква е сложността на линейното търсене в масив?

Въпрос 2: Какво изисква двоичното търсене?

Въпрос 3: Коя операция е O(1) при масив?

Въпрос 4: Какво представлява амортизирана сложност?

Въпрос 5: Кога изтриването в масив е най-скъпо?

Свързан списък

Свързаният списък съхранява елементи чрез възли с препратки към следващия (и предишния) елемент.

Цели: Създаване на единично свързан списък • Вмъкване в начало, край и среда • Премахване и обход на списъка
Среден случайO(n)
Най-лошO(n)
ПаметO(n)

Свързан списък

Вижте как се вмъкват и премахват възли, като следите връзките между тях.

Index 0

3

Index 1

7

Index 2

11

null

Изходно състояние на списъка.

Псевдокод

  1. #node

    нов възел = { стойност, next }

  2. #link

    нов възел.next = текущ head

  3. #update

    head = нов възел

  4. #remove

    прескачане на възел за изтриване

Приложете показаните операции в реална C# имплементация.

Свързан списък (C#)

Структура на възела

Разбиране на референтната структура.

Всеки възел съдържа стойност и указател към следващия възел. Паметта не е последователна.

Операции

Управление на указатели за манипулация на възлите.

Вмъкването в началото и изтриването са O(1), а намирането на елемент е O(n), тъй като се обхожда списъкът.

Предимства и недостатъци

Избор между масив и списък спрямо контекста.

Свързаните списъци са динамични и пестят преместването на елементи, но имат по-голям разход на памет.

Кратък куиз

Тествайте знанията си по темата. Отговорете на всички въпроси и натиснете „Провери“.

Въпрос 1: Каква е сложността за добавяне на нов възел в началото?

Въпрос 2: Как се намира елемент със стойност X?

Въпрос 3: Какво става при липса на актуализиране на указателите при изтриване?

Въпрос 4: Какъв е разходът на памет на възел?

Въпрос 5: Кое е предимство на двусвързания списък?

Стек

Стекът работи по принципа последен влязъл – първи излязъл (LIFO) и се използва за управление на извикванията на функции.

Цели: push/pop операции • Следене на капацитет • Детекция на под- и преливане
Среден случайO(1)
Най-лошO(1)
ПаметO(n)

Стек (LIFO)

Наблюдавайте добавянето и премахването на елементи от върха и какво се случва при пъл/празен стек.

5top
2
Размер: 2 / 6

Демонстрация на push и pop операции.

Псевдокод

  1. #push

    push(x): ако има място → постави елемента на върха

  2. #overflow

    ако стекът е пълен → overflow

  3. #pop

    pop(): премахни върха и върни стойността

  4. #underflow

    ако стекът е празен → underflow

Приложете показаните операции в реална C# имплементация.

Стек операции (C#)

Приложения

Създаване на практически асоциации.

Стекът се използва за рекурсивни извиквания, отмяна на операции и парсинг на изрази.

Имплементация

Избор на подходяща базова структура.

Може да се реализира върху масив или списък. Капацитетът се проверява за да се избегне overflow.

Кратък куиз

Тествайте знанията си по темата. Отговорете на всички въпроси и натиснете „Провери“.

Въпрос 1: Как се нарича премахването на елемент от стека?

Въпрос 2: Каква е сложността на push?

Въпрос 3: Какво е overflow?

Въпрос 4: Как се проверява дали стекът е празен?

Въпрос 5: Кое е пример за използване на стек?

Опашка

Опашката работи по принципа първи влязъл – първи излязъл (FIFO) и се прилага при управление на задачи.

Цели: enqueue/dequeue операции • Кръгова опашка • Детекция на underflow
Среден случайO(1)
Най-лошO(1)
ПаметO(n)

Опашка (FIFO)

Вижте как опашката обслужва елементите в реда на постъпване.

1front
2
3rear
front: 0 | rear: 2размер: 3 / 6

FIFO обработка на елементи.

Псевдокод

  1. #enqueue

    enqueue(x): добави елемент в края

  2. #dequeue

    dequeue(): премахни елемент от началото

  3. #overflow

    ако queue е пълна → overflow

  4. #underflow

    ако queue е празна → underflow

Приложете показаните операции в реална C# имплементация.

Опашка операции (C#)

Кръгова опашка

Оптимизиране на използваната памет.

Кръговата опашка използва масив и два индекса (front и rear), които се въртят при достигане на края.

Приложения

Свързване с реални сценарии.

Опашките са основа за BFS, управление на заявки до сървъри и буфериране.

Кратък куиз

Тествайте знанията си по темата. Отговорете на всички въпроси и натиснете „Провери“.

Въпрос 1: Каква е сложността на dequeue?

Въпрос 2: Какво е underflow?

Въпрос 3: Кой алгоритъм използва опашка?

Въпрос 4: Как се отбелязва празна кръгова опашка?

Въпрос 5: Какво е предимство на опашката пред стека?

Предстоящи теми

TODO: Хеш таблици – допълнителни визуализации, дървета, графи, BFS/DFS.