What is algorithm and algorithm complexity?
Два основни типа сложност:
- Времева сложност: колко време отнема изпълнението на алгоритъма.
- Пространствена сложност (място в паметта): колко памет е нужна на алгоритъма.
Why is algorithm analysis important?
How do we measure algorithm complexity?
Which are the typical complexities and give example for each of them?
What is the difference between abstract data type and data structure?
What is a linear data type and give examples?
Линейни типове данни: структури, при които елементите са подредени последователно, и всеки елемент има точно един предходен и един следващ (с изключение на първия и последния елемент).
Примери:
- Масив (Array): последователно подредени елементи в паметта.
- Свързан списък (Linked List): елементи, които съдържат връзка към следващия елемент.
- Стек (Stack): LIFO (Last In, First Out) структура, при която последно добавеният елемент се извлича първи.
- Опашка (Queue): FIFO (First In, First Out) структура, при която първият добавен елемент се извлича пръв.
Тези типове данни запазват реда на елементите и позволяват последователен достъп.
What is a linked list?
What are the two major implementations of a linked list?
Двете основни имплементации на свързан списък са:
Разлики:
- Еднопосочен: по-малко памет, по-лесен за реализиране.
- Двупосочен: по-гъвкав за операции, които изискват достъп до предходния елемент.
What is the complexity of the linked list’s operations?
Сложността на операциите със свързан списък зависи от типа на списъка (еднопосочен или двупосочен) и от конкретната операция:
1. Singly Linked List Operations
- Add/remove/access head – O(1)
- Add/access tail
-> If we have reference to the tail (operation optimization) – O(1)
-> Otherwise, we need to traverse the list – O(n)
- Remove tail – O(n)
-> We need to find the second-last
- Access element by index – O(n)
-> We need to traverse all previous elements
- Search element by value – O(n)
-> We need to traverse the whole list
2. Doubly Linked List Operations
- Add/remove/access head – O(1)
- Add/remove/access tail – O(1)
- Access element by index – O(n)
- Search element by value – O(n)
What is stack and what is the complexity of the different implementations?
Стек (Stack): линейна структура от данни, която следва принципа LIFO (Last In, First Out). Това означава, че последният добавен елемент е първият, който се извлича.
Основни операции:
- Push: добавя елемент към стека.
- Pop: премахва и връща елемента от върха на стека.
- Peek/Top: връща елемента на върха на стека без да го премахва.
- isEmpty: проверява дали стекът е празен.
Имплементации на стека:
1. Масив (Array):
- Push: O(1) (добавяне на елемент на върха на стека); премества top надясно
- Pop: O(1) (премахване на елемент от върха на стека).;
премества top наляво
- Peek/Top: O(1) (достъп до елемента на върха на стека).
- isEmpty: O(1).
- има променлива, която следи за индекса на top елемента
What is a queue and what is the complexity of the different implementations?
Опашка (Queue): линейна структура от данни, която следва принципа FIFO (First In, First Out). Това означава, че първият добавен елемент е първият, който се извлича.
Основни операции:
- Enqueue: добавя елемент в края на опашката.
- Dequeue: премахва и връща елемента от началото на опашката.
- Peek/Front: връща елемента в началото на опашката без да го премахва.
- isEmpty: проверява дали опашката е празна.
Имплементации на опашка:
1.Масив (Array):
- Enqueue: O(1) (добавяне на елемент в края на опашката); измества tail надясно
-> O(n) при resize на масива.
- Dequeue: O(n) (премахване на елемент от началото на опашката, тъй като елементите трябва да бъдат преместени наляво (O(n))).
- Peek/Front: O(1) (достъп до елемента в началото на опашката).
- isEmpty: O(1).
- има променливи, които следят за индексите на head и tail елементите
Stack in Java
Queue in Java