DSA Flashcards

1
Q

Какво е алгоритъм?

A

Последователност от инструкции, използвани за разрешаване на даден проблем.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Какво е алгоритмична сложност?

A

Колко време и памет са нужни за определяне на сложността на алгоритъма и неговото приключване.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какво е евристика (heuristic)? *bonus

A

Евристиката е подход за решаване на проблем, който не ни гарантира правилен отговор, но близък.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Как се прогнозира ефикасността на алгоритъм, когато данните нарастват? Какво е Big O Notation?

A

Класифицираме проблема спрямо ресурсите, които използва, а сложността му е количеството ресурси нужни за изпълнението му (време, памет). Измерваме я чрез Big O Notation.

Big O Notation - класифицира алгоритъма според времето и паметта използвани за изпълнение. Показва как растат броя операции при нарастане на инпута.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Какво е масив и как се съхраняват елементи? Какви са сложностите на обичайните операции?

A

Линейна структура от данни, която съхранява всякакъв тип данни, има нулева индексация, елементите се съхраняват последователно в паметта, има вградени функции.

Сложности:
.add(item): O(1) -> добавя елемент в края
.get(index): O(1) -> взима и връща елемент от подаден индекс
.insert(index, item): O(n) -> добавяне на елемент на индекс
.remove(index): O(n) -> ппремахва елемент на индекс
.size() : O(1) -> връща броя елементи в масива

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Какво са Linked Lists и Doubly Linked Lists и как се съхраняват елементи? Какви са сложностите на обичайните операции на Linked List?

A

Linked Lists - линейна структура от данни, елементите се съхраняват под формата на нодове. Едната част държи value, другата държи връзка към следважия node - next / null (ако е последен); Не се съхраняват поседователно в паметта.

Сложности:
.addFirst(value): O(1) -> създава node в началото;
.removeFirst(): O(1) -> маха пъривя node;
.insertAfter(node, item): O(1) -> създава нов node след подаден node;
.removeAfter(node): O(1) -> премахва node след подадения node;
.find(value): O(n) -> връща node с неговия value;

Doubly Linked Lists - същото като LL, имаме допълнителен поделемент, който сочи към предишния node.
DLL е верига от нодове, където всеки сочи към предишния и следважия нод.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Какво е dynamic array?

A

В JS всички масиви са динамични.
Автоматично си променя размера, създаваме го по 3 начина:

literal - const array = [];
default constructor = const array = new Array();
default + parameters = const array = new Array(‘Hi’, ‘1’, 3);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Какво е ‘stack’ и за какво се използва? Какви сложности имат базовите операции?

A

Линейна структура от данни, First-In/Last-Out (FILO). Нов елемент се добавя само в единия край и премахването е от същия край. Реализира се с масив или LL. Пример за това е купчина чинии, само която е най-отгоре, можем да махнем нея.
Прилага се в backtracking, memory management, expression conversion (DFS Trees - pre-; post-; in-order);

Сложности:
.push(value): O(1) -> добавя най-отгоре на стака
.pop(): O(1) -> връща стойност и я премахва от топа на стака
.peek(): O(1) - връща стойноста на топа без да го премахва

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Какво е ‘queue’ и за какво се използва? Какви сложности имат базовите операции?

A

Линейна структура от данни, First-In/First-Out (FIFO). Който е влязъл първи, излиза първи, реализира се с масив или LL.
Прилага се в BFS обхождане на дървета, рутери, музикални плейлисти, управление на заявки към общ ресурс (CPU, HDD).

Сложности:
.enqueue(value): O(1) -> добавя елемент в края queue
.dequeue(): O(1) -> връща стойност и премахва в началото
.peek(): O(1) -> връща стойност на първия елемент без да го премахва.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Какво е Hash Table и как съхранява елементи? Каква е сложността на обичайните операции в хаш таблицата?

A

Структура от данни, съхранява елементи по асоциативен начин (ключ/стойност) във форма на масив, като генерира уникален индекс чрез хеш функция.

Сложности:
add();
remove();
get();
update();
За всички се прилага амортизирана константна сложност (O(1)), без значение размера на таблицата.
Амортизирана О(1) е когато средната сложност е константна, но някои елементи задействат повторно хеширане.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Какво е хеширащ алгоритъм?

A

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

hash = hashFunc(key);
index = hash % arraySize;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Какво са колизиите и как да се справим с тях?

A

Колизиите се получават, когато два или повече елемента имат еднаква хеш стойност. Някои оттехниките за справяне с тях са:
1. Separate Chaining - създаваме LL и при поява на колизия, колизиращите елементи ги вкарваме в този списък. Може да съхранява много колизии в един списък.
2. Linear Probing - линейно обхождаме в цикличен ред и търсим свободен слот. Хеш функцията се променя (H(x, i) = (H(x) + i) % table.length). Лесна за изчисление, но намаля ефективността при търсене на свободен слот.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Кои са важните характеристики на Set? Кои алгоритми могат да се подобрят със Set?

A

Сетът може да съдържа всякакъв тип данни, не поддържа ред и може да има само уникални стойности. Има константсна сложност за базовите операции:
.add(element)
.remove(element)
.contains(element
Ползваме го, когато ни трябват уникално стойности.
НЕ го ползваме, ако подредбата е от значение и ни трябват дубликати.

Алгоритми:
-махане на дубликати от iterable колекции;
-проверка дали всички елементи са уникални в iterable колекции;
-intersection;
-union;
-symmetric difference;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Кои са важните характеристики на Map? Кои алгоритми могат да се подобрят с Map?

A

Мапът поддържа ключ/стойност, приема всякакъв тип данни, помни редът и ключът е уникален. Има константна сложност за базовите операции:
add(key, value) - set(key, value)
remove(key) - delete(key)
update(key, newValue) - set(key, newValue)
get(key)
Използваме го за групиране. Може да презаписва елементи в себе си.

Алгоритми:
counting occurrences;
grouping by key;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Какво е рекурсия?

A

Процес, в който функцията се извиква сама докато не спре. Вика копие на себе си и разбива големи проблеми на по-малки. Важно да предоставим base case, който да прекрати рекурсията.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Какво е base case/bottom в рекурсията?

A

Base Case - определя крайната точка на рекурсията и спира безкрайното повторение.
Bottom - това е най-ниската точка или най-простата задача на рекурсията, от тук изчисленията започват наобратно нагоре.
Exit criteria - предотвратява безкраен цикъл, казва кога рекурсията да спре и да се излезе от нея.

17
Q

Какви проблеми решава рекурсията?

A

Проставя чист и прост начин за писане на код.
Преидмства:
-сложни цикли се създават с по-прост код;
-създава разклонения (дървета) и ползволява работа върху тях;
-използва се във важни алгоритми (Mergesort, Quicksort, Binary Search);
Недостатъци:
-може да усложни някои проблеми;
-може да препълне стека;
Да не я използваме ако:
-съществува по-лесен начин за решение;
-инпутът е неизвестен;

18
Q

Какво е backtracking? Какви проблеми могат да се срещнат при работа с него?

A

Обратно проследяване, алгоритмична техника, която разглежда всички възможни коминации с цел решение. Пробва едно решение, ако не стане се връща назад и пробва друго.

Проблеми:
-експоненциален брой комбинации;
-неефективно търсене;
-ограничаване на пространството за търсене;

19
Q

Какво е мемоизация?

A

Мемоизацията е техника, в която резултатите от извикванията на функцията се кешират, за да се избегнат повторни изчисления за същите входни данни.
Кеш - временно хранилище.

20
Q

Какво е tail recursion?

A

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