From c88ee1f6f99c2a4677257c6487c50c39f366fbe2 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 15:59:46 +0200 Subject: Update README.md --- Sem. 10/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sem. 10/README.md b/Sem. 10/README.md index 213fb84..bcd343a 100644 --- a/Sem. 10/README.md +++ b/Sem. 10/README.md @@ -89,6 +89,8 @@ void f() - Да се напише функция, която приема такъв стринг и връща нов стринг с ТОЧНА ГОЛЕМИНА, в който всички цифри са цензурирани. (Всяко число е заменено с '*') - Да се напише функция, която приема стринг и връща два стринга с ТОЧНА големина. Първият да бъде съставен само от малките букви, а другият да бъде съставен само от главните букви. - Да се напише функция, която приема два сортирани масива от цели числа и поставя в първия масив елементите от двата масива, но в сортиран вид (приемаме, че в първия има достатъчно място). - + - Напишете програма, която приема от стандартния вход число N. След това се прочитат N реда и всеки ред започва с число M, което е дължината на реда. + - Да се напие функция, която обработва подадената матрица по следния начин: +Връща се нова матрица, за което е заделена точна големина. Първият ред е конкатенацията на последния ред с първия ред на подадената матрица. Вторият ред е конкатенацията на предпоследния ред с втория ред на подадената матрица.

Задачи

-- cgit v1.3.1-23-gd82d From 6542a8fcc86c671659510caeaccd6de673e9d560 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 16:00:03 +0200 Subject: Update README.md --- Sem. 10/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sem. 10/README.md b/Sem. 10/README.md index bcd343a..d40f4b6 100644 --- a/Sem. 10/README.md +++ b/Sem. 10/README.md @@ -91,6 +91,6 @@ void f() - Да се напише функция, която приема два сортирани масива от цели числа и поставя в първия масив елементите от двата масива, но в сортиран вид (приемаме, че в първия има достатъчно място). - Напишете програма, която приема от стандартния вход число N. След това се прочитат N реда и всеки ред започва с число M, което е дължината на реда. - Да се напие функция, която обработва подадената матрица по следния начин: -Връща се нова матрица, за което е заделена точна големина. Първият ред е конкатенацията на последния ред с първия ред на подадената матрица. Вторият ред е конкатенацията на предпоследния ред с втория ред на подадената матрица. +Връща се нова матрица, за което е заделена точна големина. Първият ред е конкатенацията на последния ред с първия ред на подадената матрица. Вторият ред е конкатенацията на предпоследния ред с втория ред на подадената матрица и тн.

Задачи

-- cgit v1.3.1-23-gd82d From e2ea0c1c97ed0c74024135df6f94656e77e0a399 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 16:00:23 +0200 Subject: Update README.md --- Sem. 10/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Sem. 10/README.md b/Sem. 10/README.md index d40f4b6..0edc4ce 100644 --- a/Sem. 10/README.md +++ b/Sem. 10/README.md @@ -89,8 +89,7 @@ void f() - Да се напише функция, която приема такъв стринг и връща нов стринг с ТОЧНА ГОЛЕМИНА, в който всички цифри са цензурирани. (Всяко число е заменено с '*') - Да се напише функция, която приема стринг и връща два стринга с ТОЧНА големина. Първият да бъде съставен само от малките букви, а другият да бъде съставен само от главните букви. - Да се напише функция, която приема два сортирани масива от цели числа и поставя в първия масив елементите от двата масива, но в сортиран вид (приемаме, че в първия има достатъчно място). - - Напишете програма, която приема от стандартния вход число N. След това се прочитат N реда и всеки ред започва с число M, което е дължината на реда. - - Да се напие функция, която обработва подадената матрица по следния начин: + - Напишете програма, която приема от стандартния вход число N. След това се прочитат N реда и всеки ред започва с число M, което е дължината на реда. Да се напие функция, която обработва подадената матрица по следния начин: Връща се нова матрица, за което е заделена точна големина. Първият ред е конкатенацията на последния ред с първия ред на подадената матрица. Вторият ред е конкатенацията на предпоследния ред с втория ред на подадената матрица и тн.

Задачи

-- cgit v1.3.1-23-gd82d From b2830c398f2d3fa5ee189ca50399818b60cc7152 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 18:51:10 +0200 Subject: Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 01c0806..93968d1 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ - **Тема 8:** Въведение в указателите. Символни низове(стрингове). Основни операции с низове. - **Тема 9:** Многомерни масиви. Работа с масиви от масиви. - **Тема 10:** Предговор за указатели и референции. Заделяне на динамична памет. Оператори new и delete. + - **Тема 11:** Анализ на Алгоритми. Алгоритми за търсене и сортиране. -- cgit v1.3.1-23-gd82d From b568c81a0f82fd9050c67e997bcf1d568158aa28 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 18:51:19 +0200 Subject: Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 93968d1..06210b3 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ - **Тема 8:** Въведение в указателите. Символни низове(стрингове). Основни операции с низове. - **Тема 9:** Многомерни масиви. Работа с масиви от масиви. - **Тема 10:** Предговор за указатели и референции. Заделяне на динамична памет. Оператори new и delete. - - **Тема 11:** Анализ на Алгоритми. Алгоритми за търсене и сортиране. + - **Тема 11:** Анализ на алгоритми. Алгоритми за търсене и сортиране. -- cgit v1.3.1-23-gd82d From 5bb68053ebcb5eae7f756b11672326e601c59da6 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 18:52:10 +0200 Subject: Create example4.cpp --- Sem. 10/example4.cpp | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 Sem. 10/example4.cpp diff --git a/Sem. 10/example4.cpp b/Sem. 10/example4.cpp new file mode 100644 index 0000000..8d2105e --- /dev/null +++ b/Sem. 10/example4.cpp @@ -0,0 +1,85 @@ +#include +using namespace std; + + +unsigned input(int**& matrix, int*& sizes) +{ + unsigned N; + cin >> N; + + matrix = new int*[N]; + sizes = new int[N]; + + for (unsigned i = 0; i < N; i++) + { + unsigned currentRowSize; + cin >> currentRowSize; + + matrix[i] = new int[currentRowSize]; + sizes[i] = currentRowSize; + + for (unsigned j = 0; j < currentRowSize; j++) + cin >> matrix[i][j]; + } + + return N; +} + + +int* concat(const int* row1, unsigned row1Size, const int* row2, unsigned row2Size) +{ + int* result = new int[row1Size + row2Size]; + + for (unsigned i = 0; i < row2Size; i++) + result[i] = row2[i]; + + for (unsigned i = 0; i < row1Size; i++) + result[row2Size + i] = row1[i]; + + return result; +} + +void freeMatrix(int** matrix, unsigned rowsSize) +{ + for (int i = 0; i < rowsSize; i++) + delete[] matrix[i]; + delete[] matrix; +} + +void task(int** matrix, unsigned N, int* sizes) +{ + unsigned resultRowsCount = (N + 1) / 2; + int** resultMatrix = new int*[resultRowsCount]; + + int* resultSizes = new int[resultRowsCount]; + + for (unsigned i = 0; i < resultRowsCount; i++) + { + resultSizes[i] = sizes[i] + sizes[N - i - 1]; + resultMatrix[i] = concat(matrix[i], sizes[i], matrix[N - i - 1], sizes[N - i - 1]); + } + + //print + for (unsigned i = 0; i < resultRowsCount; i++) + { + for (unsigned j = 0; j < resultSizes[i]; j++) + cout << resultMatrix[i][j] << " "; + cout << endl; + } + + delete[] resultSizes; + freeMatrix(resultMatrix, resultRowsCount); + + delete[] sizes; + freeMatrix(matrix, N); +} + +int main() +{ + int** matrix; + int* sizes; + + unsigned N = input(matrix, sizes); //not sure if I need this func + + task(matrix, N, sizes); +} -- cgit v1.3.1-23-gd82d From f4922d0d2b761f502a004b2b69b8b9dc2fba574d Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 18:59:42 +0200 Subject: Update README.md --- Sem. 10/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Sem. 10/README.md b/Sem. 10/README.md index 0edc4ce..85eb93a 100644 --- a/Sem. 10/README.md +++ b/Sem. 10/README.md @@ -93,3 +93,13 @@ void f() Връща се нова матрица, за което е заделена точна големина. Първият ред е конкатенацията на последния ред с първия ред на подадената матрица. Вторият ред е конкатенацията на предпоследния ред с втория ред на подадената матрица и тн.

Задачи

+ +**Задача 1:** Решете 4-та задача от примерните, но приемете, че числата в масивите са в интервала [-100, 100]. + +**Задача 2:** Напишете функция, която приема масив от цели числа и цяло число и елемент на масива. Функцията да преподрежда елементите, така че всички по-малки елементи от подадения да са в ляво от него, а всички по-големи - в дясно. (Забележка: Задачата да се реши с помощта на допълнителен масив - същестува и решение без допълнителна памет (Hoare's partition, Lomuto partition и други), но то не се изисква) + +*Вход: [1, 5, 6, 3, 0, -1, 2, 9, 7] ,3* *Изход: [1, 0, 2, ,-1, 3, 6, 5, 9, 7]* + + +**Задача 3:** Напишете функция, която приема масив и връща масив от масиви, на който елементите му са всички непразни подмасиви на дадения. +*Вход: [1, 2, 3]* *Изход: [1], [2], [3], [1, 2], [2, 3], [1, 3], [1, 2, 3] * -- cgit v1.3.1-23-gd82d From 6e29f95290072a75b6884a74f30d09449ef9b085 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:00:03 +0200 Subject: Update README.md --- Sem. 10/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sem. 10/README.md b/Sem. 10/README.md index 85eb93a..02c0d07 100644 --- a/Sem. 10/README.md +++ b/Sem. 10/README.md @@ -102,4 +102,6 @@ void f() **Задача 3:** Напишете функция, която приема масив и връща масив от масиви, на който елементите му са всички непразни подмасиви на дадения. -*Вход: [1, 2, 3]* *Изход: [1], [2], [3], [1, 2], [2, 3], [1, 3], [1, 2, 3] * +*Вход: [1, 2, 3] * + +* Изход: [1], [2], [3], [1, 2], [2, 3], [1, 3], [1, 2, 3] * -- cgit v1.3.1-23-gd82d From 5681131005fb10782ff6326328cc5e4697e10162 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:00:17 +0200 Subject: Update README.md --- Sem. 10/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sem. 10/README.md b/Sem. 10/README.md index 02c0d07..3f2a5a1 100644 --- a/Sem. 10/README.md +++ b/Sem. 10/README.md @@ -102,6 +102,7 @@ void f() **Задача 3:** Напишете функция, която приема масив и връща масив от масиви, на който елементите му са всички непразни подмасиви на дадения. + *Вход: [1, 2, 3] * -* Изход: [1], [2], [3], [1, 2], [2, 3], [1, 3], [1, 2, 3] * +*Изход: [1], [2], [3], [1, 2], [2, 3], [1, 3], [1, 2, 3] * -- cgit v1.3.1-23-gd82d From 26416c0e9bd8705b1a1fba8b19ee0633b60ba305 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:00:30 +0200 Subject: Update README.md --- Sem. 10/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sem. 10/README.md b/Sem. 10/README.md index 3f2a5a1..7a0b14e 100644 --- a/Sem. 10/README.md +++ b/Sem. 10/README.md @@ -103,6 +103,6 @@ void f() **Задача 3:** Напишете функция, която приема масив и връща масив от масиви, на който елементите му са всички непразни подмасиви на дадения. -*Вход: [1, 2, 3] * +*Вход: [1, 2, 3]* -*Изход: [1], [2], [3], [1, 2], [2, 3], [1, 3], [1, 2, 3] * +*Изход: [1], [2], [3], [1, 2], [2, 3], [1, 3], [1, 2, 3]* -- cgit v1.3.1-23-gd82d From 9e38cd273d422e5eb7def2a51065960020717d81 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:01:57 +0200 Subject: Create SelectionSort.cpp --- Sem. 11/SelectionSort.cpp | 85 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 Sem. 11/SelectionSort.cpp diff --git a/Sem. 11/SelectionSort.cpp b/Sem. 11/SelectionSort.cpp new file mode 100644 index 0000000..053ff0a --- /dev/null +++ b/Sem. 11/SelectionSort.cpp @@ -0,0 +1,85 @@ +#include +using namespace std; + + +void swap(int& a, int& b) +{ + int temp = a; + a = b; + b = temp; +} +void bubbleSort(int* arr, unsigned size) +{ + for (unsigned j = 0; j < size - 1; j++) + { + bool isSwapped = false; + + for (unsigned i = 0; i < size - 1 - j; i++) + { + if (arr[i] > arr[i + 1]) + { + swap(arr[i], arr[i + 1]); + isSwapped = true; + } + } + + if (!isSwapped) + return; + } +} + + + +// Инверсия: i < j arr[i] > arr[j] +// Масив е сортиран, когато в него няма инверсии. + +//bubbleSort на една стъпка чупи една инверсия. + +// В масив средно колко инверсии? + +//Колко най-много инверсии може да имаме ? binom(n,2) = n * (n-1)/ 2 + +// Каква е вероятността два конкретни елемента да са в инвесия. + +// Сортираме числата {1...n} + +// Вероятност да са в инвесия = всички перм. на {1...n}, в които i е в инверсия в j n!/2 + /всички пермутации = n! + +// Вероятност два индекса да са в инверсия: 1 / 2 + + +//Средно колко инверсии имаме в масив: Възможности за инверсия * вероятност да се случи тази инверсия +// n * (n - 1) / 2 * 1/2 = + +// Среден брой инверсии: n * (n-1)/ 4 +// Бъбъл сорт на една стъпка чупи най-много една инвесия. +// => средните стъпки на бъбълсорт >= n * (n-1)/ 4 = О(n^2) + + +[][][][][][][][] + +void selectionSort(int* arr, unsigned size) +{ + for (unsigned i = 0; i < size - 1; i++) + { + //findMin + int minElementIndex = i; + for (unsigned j = i + 1; j < size; j++) + { + if (arr[j] < arr[minElementIndex]) + minElementIndex = j; + } + if (minElementIndex != i) + swap(arr[i], arr[minElementIndex]); + } +} + +int main() +{ + int arr[] = { 1,2,2,1, 1 }; + selectionSort(arr, 5); + + for (int i = 0; i < 5; i++) + cout << arr[i] << " "; +} -- cgit v1.3.1-23-gd82d From 598f0b3df2ff3b94d65d38db750906d3cd76ff1e Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:02:15 +0200 Subject: Update SelectionSort.cpp --- Sem. 11/SelectionSort.cpp | 51 ----------------------------------------------- 1 file changed, 51 deletions(-) diff --git a/Sem. 11/SelectionSort.cpp b/Sem. 11/SelectionSort.cpp index 053ff0a..87cc6eb 100644 --- a/Sem. 11/SelectionSort.cpp +++ b/Sem. 11/SelectionSort.cpp @@ -1,63 +1,12 @@ #include using namespace std; - void swap(int& a, int& b) { int temp = a; a = b; b = temp; } -void bubbleSort(int* arr, unsigned size) -{ - for (unsigned j = 0; j < size - 1; j++) - { - bool isSwapped = false; - - for (unsigned i = 0; i < size - 1 - j; i++) - { - if (arr[i] > arr[i + 1]) - { - swap(arr[i], arr[i + 1]); - isSwapped = true; - } - } - - if (!isSwapped) - return; - } -} - - - -// Инверсия: i < j arr[i] > arr[j] -// Масив е сортиран, когато в него няма инверсии. - -//bubbleSort на една стъпка чупи една инверсия. - -// В масив средно колко инверсии? - -//Колко най-много инверсии може да имаме ? binom(n,2) = n * (n-1)/ 2 - -// Каква е вероятността два конкретни елемента да са в инвесия. - -// Сортираме числата {1...n} - -// Вероятност да са в инвесия = всички перм. на {1...n}, в които i е в инверсия в j n!/2 - /всички пермутации = n! - -// Вероятност два индекса да са в инверсия: 1 / 2 - - -//Средно колко инверсии имаме в масив: Възможности за инверсия * вероятност да се случи тази инверсия -// n * (n - 1) / 2 * 1/2 = - -// Среден брой инверсии: n * (n-1)/ 4 -// Бъбъл сорт на една стъпка чупи най-много една инвесия. -// => средните стъпки на бъбълсорт >= n * (n-1)/ 4 = О(n^2) - - -[][][][][][][][] void selectionSort(int* arr, unsigned size) { -- cgit v1.3.1-23-gd82d From f44b351868261219d95f634bca33230e7a6f6d03 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:03:16 +0200 Subject: Create BubbleSort.cpp --- Sem. 11/BubbleSort.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Sem. 11/BubbleSort.cpp diff --git a/Sem. 11/BubbleSort.cpp b/Sem. 11/BubbleSort.cpp new file mode 100644 index 0000000..217bf32 --- /dev/null +++ b/Sem. 11/BubbleSort.cpp @@ -0,0 +1,39 @@ +#include +using namespace std; + + +void swap(int& a, int& b) +{ + int temp = a; + a = b; + b = temp; +} + +void bubbleSort(int* arr, unsigned size) +{ + for (unsigned j = 0; j < size - 1; j++) + { + bool isSwapped = false; + + for (unsigned i = 0; i < size - 1 - j; i++) + { + if (arr[i] > arr[i + 1]) + { + swap(arr[i], arr[i + 1]); + isSwapped = true; + } + } + + if (!isSwapped) + return; + } +} + +int main() +{ + int arr[] = { 1,2,2,1, 1 }; + selectionSort(arr, 5); + + for (int i = 0; i < 5; i++) + cout << arr[i] << " "; +} -- cgit v1.3.1-23-gd82d From f45802125a7cd05d10a17368e015111281863af9 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:05:47 +0200 Subject: Create README.md --- Sem. 11/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 Sem. 11/README.md diff --git a/Sem. 11/README.md b/Sem. 11/README.md new file mode 100644 index 0000000..f46c895 --- /dev/null +++ b/Sem. 11/README.md @@ -0,0 +1,18 @@ + + +# Анализ на алгоритми. Алгоритми за търсене и сортиране. + +#### Алгоритми за търсене. + + - Linear search + - Binary search +#### Алгоритми за сортиране. + - Bubble sort + - Selection sort + + + + +

Задачи

+ +**Задача 1:** -- cgit v1.3.1-23-gd82d From 9002b71f11507389e83248517a10e7851d44f075 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:06:32 +0200 Subject: Create binarySearch.cpp --- Sem. 11/binarySearch.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Sem. 11/binarySearch.cpp diff --git a/Sem. 11/binarySearch.cpp b/Sem. 11/binarySearch.cpp new file mode 100644 index 0000000..df678ce --- /dev/null +++ b/Sem. 11/binarySearch.cpp @@ -0,0 +1,44 @@ +#include +#include +using namespace std; + + +bool linearSearch(const int arr[], unsigned size, int el) +{ + for (unsigned i = 0; i < size; i++) + { + if (arr[i] == el) + return true; + } + return false; +} + +bool binarySearch(const int* arr, unsigned size, int searched) +{ + unsigned fromIndex = 0; + unsigned toIndex = size - 1; + + while (fromIndex <= toIndex) + { + unsigned midIndex = fromIndex + (toIndex - fromIndex) / 2; + + if (arr[midIndex] == searched) + return true; + + if (arr[midIndex] < searched) + fromIndex = midIndex + 1; + else + toIndex = midIndex - 1; + } + + return false; +} + + + +int main() +{ + const unsigned SIZE = 8; + int arr[] { 1, 12, 33, 14,35,4,17,38}; + cout << linearSearch(arr, SIZE, 14); +} -- cgit v1.3.1-23-gd82d From 745733dd452b7632a1968b97603b83a868b71854 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:06:42 +0200 Subject: Rename binarySearch.cpp to BinarySearch.cpp --- Sem. 11/BinarySearch.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ Sem. 11/binarySearch.cpp | 44 -------------------------------------------- 2 files changed, 44 insertions(+), 44 deletions(-) create mode 100644 Sem. 11/BinarySearch.cpp delete mode 100644 Sem. 11/binarySearch.cpp diff --git a/Sem. 11/BinarySearch.cpp b/Sem. 11/BinarySearch.cpp new file mode 100644 index 0000000..df678ce --- /dev/null +++ b/Sem. 11/BinarySearch.cpp @@ -0,0 +1,44 @@ +#include +#include +using namespace std; + + +bool linearSearch(const int arr[], unsigned size, int el) +{ + for (unsigned i = 0; i < size; i++) + { + if (arr[i] == el) + return true; + } + return false; +} + +bool binarySearch(const int* arr, unsigned size, int searched) +{ + unsigned fromIndex = 0; + unsigned toIndex = size - 1; + + while (fromIndex <= toIndex) + { + unsigned midIndex = fromIndex + (toIndex - fromIndex) / 2; + + if (arr[midIndex] == searched) + return true; + + if (arr[midIndex] < searched) + fromIndex = midIndex + 1; + else + toIndex = midIndex - 1; + } + + return false; +} + + + +int main() +{ + const unsigned SIZE = 8; + int arr[] { 1, 12, 33, 14,35,4,17,38}; + cout << linearSearch(arr, SIZE, 14); +} diff --git a/Sem. 11/binarySearch.cpp b/Sem. 11/binarySearch.cpp deleted file mode 100644 index df678ce..0000000 --- a/Sem. 11/binarySearch.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include -using namespace std; - - -bool linearSearch(const int arr[], unsigned size, int el) -{ - for (unsigned i = 0; i < size; i++) - { - if (arr[i] == el) - return true; - } - return false; -} - -bool binarySearch(const int* arr, unsigned size, int searched) -{ - unsigned fromIndex = 0; - unsigned toIndex = size - 1; - - while (fromIndex <= toIndex) - { - unsigned midIndex = fromIndex + (toIndex - fromIndex) / 2; - - if (arr[midIndex] == searched) - return true; - - if (arr[midIndex] < searched) - fromIndex = midIndex + 1; - else - toIndex = midIndex - 1; - } - - return false; -} - - - -int main() -{ - const unsigned SIZE = 8; - int arr[] { 1, 12, 33, 14,35,4,17,38}; - cout << linearSearch(arr, SIZE, 14); -} -- cgit v1.3.1-23-gd82d From a4a29efa276a13233489f1445c01652024a247ce Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:07:07 +0200 Subject: Create LinearSearch.cpp --- Sem. 11/LinearSearch.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Sem. 11/LinearSearch.cpp diff --git a/Sem. 11/LinearSearch.cpp b/Sem. 11/LinearSearch.cpp new file mode 100644 index 0000000..b0446e1 --- /dev/null +++ b/Sem. 11/LinearSearch.cpp @@ -0,0 +1,45 @@ +#include +#include +using namespace std; + + +bool linearSearch(const int arr[], unsigned size, int el) +{ + for (unsigned i = 0; i < size; i++) + { + if (arr[i] == el) + return true; + } + return false; +} + +bool binarySearch(const int arr[], unsigned size, int searched) +{ + unsigned fromIndex = 0; + unsigned toIndex = size - 1; + + while (fromIndex <= toIndex) + { + unsigned midIndex = fromIndex + (toIndex - fromIndex) / 2; + + if (arr[midIndex] == searched) + return true; + + if (arr[midIndex] < searched) + fromIndex = midIndex + 1; + else + toIndex = midIndex - 1; + } + + return false; +} + + + +int main() +{ + const unsigned SIZE = 8; + int arr[] { 1, 12, 33, 14,35,4,17,38}; + cout << linearSearch(arr, SIZE, 14); +} + -- cgit v1.3.1-23-gd82d From 9579ce0302f18663bb0bd34d3f659636183852f5 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:16:59 +0200 Subject: Update README.md --- Sem. 11/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Sem. 11/README.md b/Sem. 11/README.md index f46c895..df52ca9 100644 --- a/Sem. 11/README.md +++ b/Sem. 11/README.md @@ -1,6 +1,20 @@ # Анализ на алгоритми. Алгоритми за търсене и сортиране. +Сложност: Функция по големината на входа (N) + +**Пример**: + + - При търсене в масив - големината на входа е големината на масива + - При проверка число дали е просто - големината на входа е числото. + +При анализа на алгоритми НЕ се интересуваме от точната функция! +Интересуваме се само то асимптотиката на функцията. +Колко бързо расте функцията при n->безкрайност. + +![enter image description here](https://i.ibb.co/TP0Xrz4/ff.png) +Тук релциите за по-малко и по-равно не са тези, които познаваме. +Тук визираме скоростта на растежа на функцията. #### Алгоритми за търсене. -- cgit v1.3.1-23-gd82d From 789688fb010a6b2575229df12ec4566996a859cd Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Wed, 22 Dec 2021 19:19:44 +0200 Subject: Update README.md --- Sem. 11/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Sem. 11/README.md b/Sem. 11/README.md index df52ca9..8f6d197 100644 --- a/Sem. 11/README.md +++ b/Sem. 11/README.md @@ -13,6 +13,7 @@ Колко бързо расте функцията при n->безкрайност. ![enter image description here](https://i.ibb.co/TP0Xrz4/ff.png) + Тук релциите за по-малко и по-равно не са тези, които познаваме. Тук визираме скоростта на растежа на функцията. -- cgit v1.3.1-23-gd82d From b3e29bba94da067984c841d7904887a4bd5995ea Mon Sep 17 00:00:00 2001 From: Stoycho Kyosev <68247567+stoychoX@users.noreply.github.com> Date: Fri, 24 Dec 2021 14:35:42 +0200 Subject: add pract 10 and 11 --- pract_KN/Pract 10/solutions.cpp | 191 +++++++++++++++++++++ ...74\320\265\321\202\320\270\320\272\320\260.pdf" | Bin 0 -> 68330 bytes pract_KN/Pract 11/solutions.cpp | 183 ++++++++++++++++++++ ... \320\277\320\260\320\274\320\265\321\202..pdf" | Bin 0 -> 57974 bytes 4 files changed, 374 insertions(+) create mode 100644 pract_KN/Pract 10/solutions.cpp create mode 100644 "pract_KN/Pract 10/\320\274\320\275\320\276\320\263\320\276\320\274\320\265\321\200\320\275\320\270-\320\274\320\260\321\201\320\270\320\262\320\270.-\320\243\320\272\320\260\320\267\320\260\321\202\320\265\320\273\320\275\320\260-\320\260\321\200\320\270\321\202\320\274\320\265\321\202\320\270\320\272\320\260.pdf" create mode 100644 pract_KN/Pract 11/solutions.cpp create mode 100644 "pract_KN/Pract 11/\320\243\320\272\320\260\320\267\320\260\321\202\320\265\320\273\320\270 \320\270 \321\200\320\265\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\270. \320\224\320\270\320\275\320\260\320\274\320\270\321\207\320\275\320\260 \320\277\320\260\320\274\320\265\321\202..pdf" diff --git a/pract_KN/Pract 10/solutions.cpp b/pract_KN/Pract 10/solutions.cpp new file mode 100644 index 0000000..7ba42bd --- /dev/null +++ b/pract_KN/Pract 10/solutions.cpp @@ -0,0 +1,191 @@ +#include +#include +#include + +const int N = 30; //game of life grid +const int RFIRST = 4; //rows first +const int RSEC = 4; //rows second +const int CFIRST = 4; //cols first +const int CSEC = 4; //cols second +const int DIM = 4; //used for three dimentional array +//First-> +void plusFive(int* a) { + *a += 10; +} + +//Second-> +void iterateOverMatrix(int matrix[RFIRST][CFIRST]) { + for (int i = 0; i < RFIRST; i++) + for (int j = 0; j < CFIRST; j++) + *(*(matrix + i) + j) = rand() % 100 + 1; +} + +//Third-> +void iterateOverThreeDimentionalArray(int matrix[DIM][DIM][DIM]) { + for (int i = 0; i < DIM; i++) { + for (int j = 0; j < DIM; j++) { + for (int k = 0; k < DIM; k++) { + *(*(*(matrix + i) + j) + k) = rand() % 100 + 1; + } + } + } +} + +//Fourth -> +//Assume that we have correct first and second matrix +void sumMatrices(const int first[RFIRST][RSEC], const int second[CFIRST][CSEC], int result[RFIRST][CSEC]) { + for (int i = 0; i < RFIRST; i++) { + for (int j = 0; j < CFIRST; j++) { + result[i][j] = first[i][j] + second[i][j]; + } + } +} + +//Fifth -> +void multiplyMatrices(const int first[RFIRST][CFIRST], const int second[RSEC][CSEC], int result[RFIRST][CSEC]) { + for (int i = 0; i < RFIRST; i++) { + for (int j = 0; j < CSEC; j++) { + for (int k = 0; k < RSEC; k++) { + result[i][j] += first[i][k] * second[k][j]; + } + } + } +} + +//Sixth -> +void evolveCell(const int matrix[N][N], int matrixCopy[N][N], int i, int j) { + int cnt = -matrix[i][j]; //because we add matrix [i][j] as well + + bool iStartingPosAtZero = (i == 0); //Fix start point corner case for (i == 0) + bool jStartingPosAtZero = (j == 0); //Fix start point corner case for (j == 0) + bool iEndingPosAtLimit = (i == N - 1); //Fix end point corner case for (i == N-1) + bool jEndingPosAtLimit = (j == N - 1); //Fix end point corner case for (j == N-1) + + //Iterate among the neighbours: + for (int x = -1 + iStartingPosAtZero; x < 2 - iEndingPosAtLimit; x++) + for (int y = -1 + jStartingPosAtZero; y < 2 - jEndingPosAtLimit; y++) + cnt += matrix[i + x][j + y]; + + //evolve: + if (matrix[i][j] && cnt != 2 && cnt != 3) { + matrixCopy[i][j] = 0; + } + else if (!matrix[i][j] && cnt == 3) { + matrixCopy[i][j] = 1; + } + else { + matrixCopy[i][j] = matrix[i][j]; + } +} + +void evolve(int matrix[N][N]) { + int copyMatrix[N][N] = { 0 }; + for (int i = 0; i < N; i++) + for (int j = 0; j < N; j++) + evolveCell(matrix, copyMatrix, i, j); + + for (int i = 0; i < N; i++) + for (int j = 0; j < N; j++) + matrix[i][j] = copyMatrix[i][j]; +} + +void printMatrix(const int matrix[N][N]) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + std::cout.width(2); + if (matrix[i][j]) + std::cout << "*" << " "; + else + std::cout << " " << " "; + } + std::cout << std::endl; + } +} + +void start(int matrix[N][N]) { + //moving pattern: + //matrix[1][1] = 1; + //matrix[2][2] = 1; + //matrix[3][0] = 1; + //matrix[3][1] = 1; + //matrix[3][2] = 1; + + //flipping ones: + //matrix[2][1] = matrix[2][2] = matrix[2][3] = 1; + + //pattern: + /*matrix[10][10] = matrix[10][14] = 1; + matrix[11][12] = 1; + matrix[12][11] = matrix[12][13] = 1; + matrix[13][12] = 1; + matrix[14][10] = matrix[14][14] = 1;*/ + + + //random pattern: + /*matrix[10][10] = matrix[10][14] = 1; + matrix[11][12] = 1; + matrix[12][11] = matrix[12][13] = 1; + matrix[13][13] = 1; + matrix[14][10] = matrix[14][14] = 1;*/ +} + +void gameOfLife() { + int matrix[N][N] = { 0 }; + start(matrix); //-> Remove comments on the patterd you'd like to run, or make one yourself! + while (true) { + system("cls"); + printMatrix(matrix); + evolve(matrix); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); //Making the terminal sleep for 300 mseconds + } +} + +void testsOnFirst() { + int a = 5; + plusFive(&a); + std::cout << a; +} + +void testsOnSecond() { + int matrix[RFIRST][CFIRST] = { 0 }; + iterateOverMatrix(matrix); + for (int i = 0; i < RFIRST; i++) { + for (int j = 0; j < RSEC; j++) + std::cout << matrix[i][j] << " "; + std::cout << std::endl; + } +} + +void testsOnThird() { + int matrix3d[DIM][DIM][DIM] = { 0 }; + iterateOverThreeDimentionalArray(matrix3d); + for (int i = 0; i < DIM; i++) { + for (int j = 0; j < DIM; j++) { + for (int k = 0; k < DIM; k++) + std::cout << matrix3d[i][j][k] << " "; + std::cout << std::endl; + } + std::cout << std::endl; + } +} + +void testsOnFourth() { + int firstMatrix[RFIRST][CSEC] = { {1, 2, 3, 0}, {4, 5, 6, 1}, {7, 8, 9, 2}, {7, 6, 39, 5} }; + int secondMatrix[RFIRST][CSEC] = { {10, 11, 12, 1}, {13, 14, 15, 3}, {0, 21, 22, 23}, {7, 8, 9, 2} }; + int result[RFIRST][CFIRST] = { 0 }; + sumMatrices(firstMatrix, secondMatrix, result); + multiplyMatrices(firstMatrix, secondMatrix, result); + for (int i = 0; i < RFIRST; i++) { + for (int j = 0; j < CFIRST; j++) + std::cout << result[i][j] << " "; + std::cout << std::endl; + } +} + +int main() { + //testsOnFirst(); + //testsOnSecond(); + //testsOnThird(); + //testsOnFourth(); + //gameOfLife(); +} \ No newline at end of file diff --git "a/pract_KN/Pract 10/\320\274\320\275\320\276\320\263\320\276\320\274\320\265\321\200\320\275\320\270-\320\274\320\260\321\201\320\270\320\262\320\270.-\320\243\320\272\320\260\320\267\320\260\321\202\320\265\320\273\320\275\320\260-\320\260\321\200\320\270\321\202\320\274\320\265\321\202\320\270\320\272\320\260.pdf" "b/pract_KN/Pract 10/\320\274\320\275\320\276\320\263\320\276\320\274\320\265\321\200\320\275\320\270-\320\274\320\260\321\201\320\270\320\262\320\270.-\320\243\320\272\320\260\320\267\320\260\321\202\320\265\320\273\320\275\320\260-\320\260\321\200\320\270\321\202\320\274\320\265\321\202\320\270\320\272\320\260.pdf" new file mode 100644 index 0000000..2b8223b Binary files /dev/null and "b/pract_KN/Pract 10/\320\274\320\275\320\276\320\263\320\276\320\274\320\265\321\200\320\275\320\270-\320\274\320\260\321\201\320\270\320\262\320\270.-\320\243\320\272\320\260\320\267\320\260\321\202\320\265\320\273\320\275\320\260-\320\260\321\200\320\270\321\202\320\274\320\265\321\202\320\270\320\272\320\260.pdf" differ diff --git a/pract_KN/Pract 11/solutions.cpp b/pract_KN/Pract 11/solutions.cpp new file mode 100644 index 0000000..d6d4d0a --- /dev/null +++ b/pract_KN/Pract 11/solutions.cpp @@ -0,0 +1,183 @@ +#include + +//helpers: +void initMatrix(int** matrix, int n, int m) { + for (int i = 0; i < n; i++) + for (int j = 0; j < m; j++) + matrix[i][j] = (i + j) * (i + j + 1) / 2 + j; +} + +void initArray(int* arr, int length) { + for (int i = 0; i < length; i++) + arr[i] = rand() % 100; +} + +void printArray(const int* arr, int length) { + for (int i = 0; i < length; i++) + std::cout << arr[i] << " "; +} + +void printMatrix(int** matrix, int n, int m) { + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) + std::cout << matrix[i][j] << " "; + std::cout << std::endl; + } +} + +void freeMatrix(int** arr, int n, int m) { + for (int i = 0; i < n; i++) + delete[] arr[i]; + delete[] arr; +} + +void freeArray(int* arr) { + delete[] arr; +} + +//Task 1 +void deleteElementAtIndex(int* arr, int index, int& length) { + for (int i = index; i < length - 1; i++) + arr[i] = arr[i + 1]; + arr[length - 1] = -1; + --length; +} + +//Task 2: +int findSum(int* row, int length) { + int res = 0; + for (int i = 0; i < length; i++) + res += row[i]; + return res; +} + +int rowWithBiggestSum(int** arr, int n, int m) { + int biggestSum = findSum(arr[0], m); + int row = 0; + for (int i = 1; i < n; i++) { + int currentSum = findSum(arr[i], m); + if (biggestSum < currentSum) { + biggestSum = currentSum; + row = i; + } + } + return row; +} + +//Task 3: +void removeRow(int** arr, int k, int& n) { + delete[] arr[k]; + for (int i = k; i < n - 1; i++) + arr[i] = arr[i + 1]; + --n; +} + +//Task 4: +void cycle(int* arr, int n, int k) { + int* copyArr = new int[n]; + for (int i = 0; i < n; i++) + copyArr[i] = arr[(i + k) % n]; + memcpy(arr, copyArr, n * sizeof(int)); + delete[] copyArr; +} + +//Task 5: +void removeElements(int* arr, int& length) { + for (int i = 1; i < length - 1;) { + if (arr[i] < arr[i - 1] && arr[i] < arr[i + 1]) { + deleteElementAtIndex(arr, i, length); + i--; + if(i == 0) { //We don't want to deal with i == 0 case. Its always true in our solution. + i = 1; + } + } + else { + ++i; + } + } +} + +void testsOnTaskOne() { + int length = 0; + std::cin >> length; + int* arr = new int[length]; + initArray(arr, length); + printArray(arr, length); + std::cout << std::endl; + deleteElementAtIndex(arr, 5, length); + printArray(arr, length); + freeArray(arr); +} + +void testsOnTaskTwo() { + int n = 0; + int m = 0; + std::cin >> n >> m; + //Create dynamic array: + int** darray = new int* [n]; + for (int i = 0; i < n; i++) + darray[i] = new int[m]; + + //Initialize: + initMatrix(darray, n, m); + + int biggestSum = rowWithBiggestSum(darray, n, m); + + printArray(darray[biggestSum], m); + + freeMatrix(darray, n, m); +} + +void testsOnTaskThree() { + int n = 0; + int m = 0; + std::cin >> n >> m; + //Create dynamic array: + int** darray = new int* [n]; + + for (int i = 0; i < n; i++) + darray[i] = new int[m]; + + //Initialize: + initMatrix(darray, n, m); + + printMatrix(darray, n, m); + removeRow(darray, 0, n); + removeRow(darray, 3, n); + std::cout << std::endl; + printMatrix(darray, n, m); + + freeMatrix(darray, n, m); +} + +void testsOnTaskFour() { + int length = 0; + std::cin >> length; + int* arr = new int[length]; + initArray(arr, length); + printArray(arr, length); + std::cout << std::endl; + cycle(arr, length, 1); + printArray(arr, length); + freeArray(arr); +} + +void testsOnTaskFive() { + int length = 0; + std::cin >> length; + int* arr = new int[length]; + initArray(arr, length); + printArray(arr, length); + std::cout << std::endl; + removeElements(arr, length); + printArray(arr, length); + freeArray(arr); +} + +int main() { + //testsOnTaskOne(); + //testsOnTaskTwo(); + //testsOnTaskThree(); + //testsOnTaskFour(); + //testsOnTaskFive(); +} diff --git "a/pract_KN/Pract 11/\320\243\320\272\320\260\320\267\320\260\321\202\320\265\320\273\320\270 \320\270 \321\200\320\265\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\270. \320\224\320\270\320\275\320\260\320\274\320\270\321\207\320\275\320\260 \320\277\320\260\320\274\320\265\321\202..pdf" "b/pract_KN/Pract 11/\320\243\320\272\320\260\320\267\320\260\321\202\320\265\320\273\320\270 \320\270 \321\200\320\265\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\270. \320\224\320\270\320\275\320\260\320\274\320\270\321\207\320\275\320\260 \320\277\320\260\320\274\320\265\321\202..pdf" new file mode 100644 index 0000000..aede287 Binary files /dev/null and "b/pract_KN/Pract 11/\320\243\320\272\320\260\320\267\320\260\321\202\320\265\320\273\320\270 \320\270 \321\200\320\265\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\270. \320\224\320\270\320\275\320\260\320\274\320\270\321\207\320\275\320\260 \320\277\320\260\320\274\320\265\321\202..pdf" differ -- cgit v1.3.1-23-gd82d