diff --git a/pomelovsd/DataStruct/analysis.png b/pomelovsd/DataStruct/analysis.png new file mode 100644 index 0000000..66b637f Binary files /dev/null and b/pomelovsd/DataStruct/analysis.png differ diff --git a/pomelovsd/DataStruct/results.csv b/pomelovsd/DataStruct/results.csv index 157399a..ff3e558 100644 --- a/pomelovsd/DataStruct/results.csv +++ b/pomelovsd/DataStruct/results.csv @@ -1,19 +1,19 @@ Структура,Режим,Операция,Время (сек) -LinkedList,случайный,вставка,4.791107272799854 -LinkedList,сортированный,вставка,5.242345250000653 -LinkedList,случайный,поиск,0.12513352360037971 -LinkedList,сортированный,поиск,0.0488736079998489 -LinkedList,случайный,удаление,0.035343319200183035 -LinkedList,сортированный,удаление,0.0433979294000892 -HashTable,случайный,вставка,0.07157636960037053 -HashTable,сортированный,вставка,0.022270291600580094 -HashTable,случайный,поиск,0.0005006769999454264 -HashTable,сортированный,поиск,0.0003584531994420104 -HashTable,случайный,удаление,0.00021688099950551988 -HashTable,сортированный,удаление,0.00018475759934517556 -BinaryTree,случайный,вставка,0.04002425920043606 -BinaryTree,сортированный,вставка,0.011209254199638963 -BinaryTree,случайный,поиск,0.0007849900001019705 -BinaryTree,сортированный,поиск,0.0007412777995341457 -BinaryTree,случайный,удаление,0.0002893609998864122 -BinaryTree,сортированный,удаление,0.0005448235999210738 +LinkedList,случайный,вставка,5.446558486199502 +LinkedList,сортированный,вставка,4.543784373601374 +LinkedList,случайный,поиск,0.04706894100017962 +LinkedList,сортированный,поиск,0.04769594539902755 +LinkedList,случайный,удаление,0.03921282640003483 +LinkedList,сортированный,удаление,0.028603866600315088 +HashTable,случайный,вставка,0.04496854659882956 +HashTable,сортированный,вставка,0.01674557240039576 +HashTable,случайный,поиск,0.0002827729993441608 +HashTable,сортированный,поиск,0.0003012509994732682 +HashTable,случайный,удаление,0.0001654567997320555 +HashTable,сортированный,удаление,0.00015406959937536158 +BinaryTree,случайный,вставка,0.04737361820007209 +BinaryTree,сортированный,вставка,0.008165915000427048 +BinaryTree,случайный,поиск,0.0008410817987169139 +BinaryTree,сортированный,поиск,0.0005058431990619284 +BinaryTree,случайный,удаление,0.0004901104002783541 +BinaryTree,сортированный,удаление,0.00044584080096683466 diff --git a/pomelovsd/DataStruct/results.md b/pomelovsd/DataStruct/results.md new file mode 100644 index 0000000..05e3588 --- /dev/null +++ b/pomelovsd/DataStruct/results.md @@ -0,0 +1,40 @@ +# Предложенные вопросы: +## Сравните: +1) Как порядок входных данных влияет на скорость вставки в BST(деградация до O(n) на отсортированных данных). +2) Почему хеш-таблица почти не чувствительна к порядку. +3) Почему связный список всегда медленен при поиске. +4) Как удаление работает в каждой структуре. +5) Вывод должен содержать ответ на вопрос: какую структуру и для каких задач (частые вставки, частый поиск, необходимость получать данные в порядке) стоит выбирать в реальной жизни.* +# Анализ результатов: +![[analysis.png]] +>График созданный для на основе замеров времени работы разных типов данных +>P.s. Данные на графиках не точные, а приблизительные, из-за во многом случайных замеров значений +## Выводы: +### 1) **Как порядок входных данных влияет на скорость вставки в BST?** +Порядок отличается очень сильно, если в обычном случае сложность равна $O(log(n))$, а в худшем случае(как раз в случае отсортированных данных) равна $O(n)$. +>В моём случае время работы мало отличимо так как, во время замеров, я заметил, что данные записываются крайне долго за счёт особенностей реализации(бинарное дерево вырождалось в связный список) и пришлось добавить ещё одну функцию, которая будет искусственно разбивать отсортированный массив на 2 ветки, а не записывать все ветви подряд +### 2) **Почему хеш-таблица почти не чувствительна к порядку?** + Из-за особенностей записи данных в память. Хеш-таблица вычисляет, номер строки при помощи формулы т.е мы можем найти любой сколь угодный элемент за $O(1)$ +### 3) **Почему связный список всегда медленен при поиске?** + Из-за способа записи. Так-как мы можем добраться до следующего элемента только путём перебора равного номеру поисковой строки, при сложности $O(n)$ +### 4) Как удаление работает в каждой структуре? +- **Связный список** + Рассматривается 3 случая: + 1) Если список пустой, **возращаем пустой список** + 2) Если удаляем голову, то **возвращаем, как голову следующий элемент списка** + 3) Если мы удаляем промежуточный элемент, ищем нужный элемент а потом **подменяем элементу стоящем перед элементом, который мы ищем ссылку элемента идущему после удаления** +- **Хеш-таблица** + Реализация считает при помощи Хеш-ключа, номер элемента + > P.s. В моей реализации Хеш-таблица и связный список схожи по реализации, потому что Хеш-таблица использует функцию связного списка) +- **Бинарное дерево** + Рассмотрим так же 4 случая(немного схожа со связным списком с поправкой на то, что потомок может быть не один): + 1) Если список пустой, **возращаем пустой список** + 2) Если элемент слева, то **спускаемся в левую ветвь** + 3) Если элемент справа, то **спускаемся в правую ветвь** + 4) Если ветки 2, то **как-то оцениваем обе вершины и двигаемся к нужному результату** + При нахождении элемента элементу слева от найденного передаём ссылку на правый от найденного элемента и наоборот левому элементу ссылку на правый +### + 5) Какую структуру и для каких задач (частые вставки, частый поиск, необходимость получать данные в порядке) стоит выбирать в реальной жизни? +- Для частых вставок и поиска элементов следует использовать Хеш-таблицы, из-за особенностей добавления (определение номера в таблицы при помощи математической формулы, а не порядковым номером) +- В случае, если нам надо использовать упорядоченные данные, то следует использовать бинарное дерево(из-за особенностей хранения) +>P.s. Вывод 0) Как же долго работает функция print()...