Compare commits

...

23 Commits
main ... lab1

Author SHA1 Message Date
845db5b195 Написан отчёт по лабораторной работе 2026-05-14 14:51:03 +03:00
a939b76273 Увеличение выборки, исправление сортировки и работы дерева 2026-05-14 02:10:03 +03:00
6554e2ada1 оформление графиков, по полученным данным 2026-05-14 01:16:37 +03:00
62795e88ba Обновление csvwriter
- Функция создания пустого файла
- Разобрался с директорией для сохранения файла
2026-05-13 22:51:35 +03:00
6e259a4770 Исправленны ошибки и написаны мини тесты для всех структур 2026-05-13 22:03:54 +03:00
b3688d3ed9 Изменил работу со структурами, чтобы они походили под интерфейсы 2026-05-13 21:25:29 +03:00
bc6ece83d0 Начало написания тестов 2026-05-10 19:16:18 +03:00
b9c4421127 удаление сортировки для хештаблицы (реализована в MyData) 2026-05-10 12:33:22 +03:00
4a214a2843 Изменение иерархии
- добавеление в отлсеживание go.mod
 - перенос хеш таблицы на общий формат хранения данных
 - удаление лишних
2026-05-10 12:30:21 +03:00
1b21f97e28 Изменение иерархии проекта
- test/ -- папка с файлами для тестов каждой структуры
- pkg/ -- папка с реализациями и вспомогательными модулями
2026-05-09 22:34:03 +03:00
7e045c71e0 Переписан LinkedLIst на Go 2026-05-09 21:11:45 +03:00
9b92dcc206 Переписан тест для BST с C на Go 2026-05-09 20:02:11 +03:00
d616bfe1fb Реализация bst переписана на Go 2026-05-09 19:27:57 +03:00
14e6c71416 Merge branch 'lab1' of http://31.128.43.79:3000/stepushovgs/2026-rff_mp into lab1 2026-05-07 14:28:09 +03:00
0e7a03e784 Обновление
- Изменение структуры лабораторной работы
- Завершение библитеки для Бинарного дерева поиска
2026-05-07 14:28:06 +03:00
b638d6c169 update bin tree 2026-04-30 16:11:36 +03:00
62e1b34fd0 Setup gitignore for data-structure 2026-04-20 11:03:49 +03:00
10f35b3ac3 update gitignore for c 2026-04-19 00:33:46 +03:00
d9d935c0bf implementing a linked list
- insert
- delete
- find
- listAll
2026-04-19 00:31:51 +03:00
c9947a713f move gitignore 2026-04-16 22:27:29 +03:00
10445d4940 add gitignore 2026-04-16 22:23:45 +03:00
5e85fa060b init lab1 2026-04-16 22:21:02 +03:00
7fec6872a1 [0] initial commit 2026-02-14 11:41:46 +03:00
31 changed files with 3441 additions and 0 deletions

View File

@ -160,3 +160,103 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf
# debug information files
*.dwo
#################################
############## Go ###############
#################################
# If you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
#
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Code coverage profiles and other test artifacts
*.out
coverage.*
*.coverprofile
profile.cov
# Dependency directories (remove the comment below to include it)
# vendor/
# Go workspace file
go.work
go.work.sum
# env file
.env
# Editor/IDE
# .idea/
.vscode/
!go.mod
#################################
########### Obsidian ############
#################################
.obsidian/

1
stepushovgs/427 Normal file
View File

@ -0,0 +1 @@
427

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,122 @@
## Практические графики
### Информация о тестировании
- Общее число записей: 20000
- Каждый замер повторялся: 20 раз
- Количество существующих записей для случайного поиска: 1000
- Количество несуществующих записей для поиска: 500
- Количество элементов для удаления: 1000
![[insert.pdf]]
**Тестирование вставки (рис. 1)**
![[search.pdf]]
**Тестирование поиска (рис. 2)**
![[delete.pdf]]
**Тестирование удаления (рис. 3)**
## Анализ результатов
### Как порядок входных данных влияет на скорость вставки в BST (деградация до O(n) на отсортированных данных)?
По определению, при вставке отсортированных данных, структура бинарного дерева поиска вырождается в связный список.
Для визуализации этого в тесте выводятся высота и количество элементов в дереве:
Для случайных данных вывод выглядит примерно так:
```
Высота дерева: 28, элементов: 8634
```
Для сортированных данных же:
```
Высота дерева: 8634, элементов: 8634
```
Заметим, что при случайных данных скорость вставки в бинарное дерево почти лишь немного уступает по скорости хеш-таблице. При сортированных данных из-за рекурсивной реализации вставки бинарное дерево проигрывает связному списку(который имеет линейную сложность вставки)
### Почему хеш-таблица почти не чувствительна к порядку.
Хеш-таблица не чувствительна к порядку данных, так как использует для распределения элементов хеш значения данных (сложность операции одинакова для любых однотипных данных) и после производит вставку в связный список(в моей реализации проходит по списку и вставляет данные в конец). Поэтому хеш-таблица ни на одном из этапов не сравнивает данные, следовательно их порядок не влияет на скорость.
### Почему связный список всегда медленен при поиске.
Операция поиска в связном списке имеет линейную сложность $O(n)$ не зависимо от порядка данных, что можно видеть на графике (см. рис. 2). Для бинарного дерева поиска эта сложность в лучшем случае $O(\log(N))$, а в худшем $O(N)$. Для хеш-таблицы сложность вставки $O(1)$, с хорошей хеш-функцией и низким заполнением.
### Как удаление работает в каждой структуре.
#### Связный список
Находим элемент перед удаляем элементом, и заменяем его поле `next` на `next.next`, то есть теперь он указывает на элемент, который идёт после удаляемого элемента
``` Go
current := ll.head
for current.next != nil {
if current.next.data.Name == targetName {
current.next = current.next.next
return true
}
current = current.next
}
```
#### Бинарное дерево поиска
После того, как мы нашли узел, который необходимо удалить, у нас возможны три случая.
Случай 1: У удаляемого узла нет правого ребенка.
В этом случае мы просто перемещаем левого ребенка (3) на место удаляемого узла(5). В результате дерево будет выглядеть так:
```
Удаляем элемент со значением 5
ДО УДАЛЕНИЯ: ПОСЛЕ УДАЛЕНИЯ:
[8] [8]
/ \ / \
[5] [10] [3] [10]
/ / \
[3] [1] [4]
/ \
[1] [4]
```
Случай 2: У удаляемого узла есть только правый ребенок, у которого, в свою очередь нет левого ребенка.
В этом случае нам надо переместить правого ребенка(8) удаляемого узла (5) на его место.
```
Удаляем элемент со значением 5
До удаления: После удаления:
[10] [10]
/ \ / \
[5] [12] [8] [12]
/ \ / \
[1] [8] [1] [9]
\
[9]
```
Случай 3: У удаляемого узла есть первый ребенок, у которого есть левый ребенок.
В этом случае место удаляемого узла занимает крайний левый ребенок правого ребенка удаляемого узла.
Давайте посмотрим, почему это так. Мы знаем о поддереве, начинающемся с удаляемого узла следующее:
- Все значения справа от него больше или равны значению самого узла.
- Наименьшее значение правого поддерева — крайнее левое.
Мы должны поместить на место удаляемого узел со значением, меньшим или равным любому узлу справа от него. Для этого нам необходимо найти наименьшее значение в правом поддереве. Поэтому мы берем крайний левый узел правого поддерева.
```
Удаляем элемент со значением 5
До удаления: После удаления:
[10] [10]
/ \ / \
[5] [12] [7] [12]
/ \ / \
[1] [9] [1] [9]
/ /
[7] [8]
\
[8]
```
#### Хеш-таблица
Находим индекс элемента в таблица, далее производим удаление элемента в связном списке, который соответствует этому индексу.
# Вывод
Мы реализовали и протестировали три различные структуры хранения данных: связный список, бинарное дерево поиска и хеш-таблица. Сравнили скорость операций вставки, удаления и поиска для каждой структуры.
Если не важен порядок хранения и извлечения данных, то хеш-таблица лучший выбор для быстрых вставки, удаления и поиска.
Если нужно хранить данные с возможностью быстрого отсортированного обхода, то стоит выбрать бинарное дерево поиска.
Если нужно хранить данные в порядке поступления(например очередь), то стоит выбрать связный список.

View File

@ -0,0 +1,208 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bst.h"
#include "queue.h"
/*
3. Двоичное дерево поиска
Узел словарь: `{'val': '123', 'left': None, 'right': None}.`
Функции:
def bst_insert(root, name, phone) рекурсивно или итеративно вставляет, возвращает новый корень (если корень меняется).
def bst_find(root, name) поиск.
def bst_delete(root, name) удаление, возвращает новый корень.
def bst_list_all(root) центрированный обход (рекурсивно собирает записи в отсортированном порядке).
*/
bst_node* create_bst_node(char name[NAME_LEN], char phone[PHONE_LEN])
{
bst_node* node = (bst_node*)malloc(sizeof(bst_node));
strcpy(node->name, name);
strcpy(node->phone, phone);
node->left = NULL;
node->right = NULL;
return node;
}
bst_node* bst_minimum(bst_node* node)
{
if (node->left == NULL)
return node;
return bst_minimum(node->left);
}
bst_node* bst_maximum(bst_node* node)
{
if (node->right == NULL)
return node;
return bst_maximum(node->right);
}
void print_bst(bst_node node)
{
//printf("value: %d\n", node.value);
printf("name: %s, phone: %s\n", node.name, node.phone);
}
void bst_inorder_traversal(bst_node* HEAD)
{
if (HEAD != NULL)
{
bst_inorder_traversal(HEAD->left);
print_bst(*HEAD);
bst_inorder_traversal(HEAD->right);
}
}
void bst_preorder_traversal(bst_node* HEAD)
{
if (HEAD != NULL)
{
print_bst(*HEAD);
bst_preorder_traversal(HEAD->left);
bst_preorder_traversal(HEAD->right);
}
}
bst_node* bst_search(bst_node* HEAD, char target_name[NAME_LEN])
{
/*
Node search(x : Node, k : T):
if x == null or k == x.key
return x
if k < x.key
return search(x.left, k)
else
return search(x.right, k)
*/
if ((HEAD == NULL) || strcmp(HEAD->name, target_name) == 0)
{
return HEAD;
}
if (strcmp(target_name, HEAD->name) < 0)
{
return bst_search(HEAD->left, target_name);
}
else
{
return bst_search(HEAD->right, target_name);
}
}
bst_node* bst_insert(bst_node* HEAD, char name[NAME_LEN], char phone[PHONE_LEN])
{
/*
Node insert(x : Node, z : T): // x — корень поддерева, z — вставляемый ключ
if x == null
return Node(z) // подвесим Node с key = z
else if z < x.key
x.left = insert(x.left, z)
else if z > x.key
x.right = insert(x.right, z)
return x
*/
if (HEAD == NULL)
{
return create_bst_node(name, phone);
}
else if (strcmp(name, HEAD->name) < 0)
{
HEAD->left = bst_insert(HEAD->left, name, phone);
}
else if (strcmp(name, HEAD->name) > 0)
{
HEAD->right = bst_insert(HEAD->right, name, phone);
}
return HEAD;
}
bst_node* bst_delete(bst_node* root, char target_name[NAME_LEN])
{ // корень поддерева, удаляемый ключ
if (root == NULL)
return root;
if (strcmp(target_name, root->name) < 0)
root->left = bst_delete(root->left, target_name);
else if (strcmp(target_name, root->name) > 0)
root->right = bst_delete(root->right, target_name);
else {
if (root->left != NULL && root->right != NULL)
{
strcpy(root->name, bst_minimum(root->right)->name);
strcpy(root->phone, bst_minimum(root->right)->phone);
root->right = bst_delete(root->right, root->name);
}
else
{
bst_node* temp = root;
if (root->left != NULL)
root = root->left;
else
root = root->right;
free(temp);
}
}
return root;
}
void delete_bst(bst_node* root)
{
if (root == NULL)
return;
else
{
delete_bst(root->left);
delete_bst(root->right);
free(root);
}
}
void printTree(bst_node* node, int depth) {
if (node == NULL) return;
printTree(node->right, depth + 1);
for (int i = 0; i < depth; i++)
printf("\t");
//printf("%d\n", node->value);
print_bst(*node);
printTree(node->left, depth + 1);
}
void treeLevelTraversal(bst_node* node) {
if (!node) return;
Queue q;
Queue* hq = &q;
queueInit(hq);
queuePush(hq, node);
while(!queueEmpty(hq))
{
bst_node* hn = queuePop(hq);
//printf("%d\n", hn->value);
print_bst(*hn);
if(hn->left)
queuePush(hq, hn->left);
if(hn->right)
queuePush(hq, hn->right);
};
};

View File

@ -0,0 +1,37 @@
#define NAME_LEN 20
#define PHONE_LEN 20
typedef struct bst_node
{
//int value;
char name[NAME_LEN];
char phone[PHONE_LEN];
struct bst_node* right;
struct bst_node* left;
}bst_node;
bst_node* create_bst_node(char name[NAME_LEN], char phone[PHONE_LEN]);
bst_node* bst_minimum(bst_node* node);
bst_node* bst_maximum(bst_node* node);
void print_bst(bst_node node);
void bst_inorder_traversal(bst_node* HEAD);
void bst_preorder_traversal(bst_node* HEAD);
bst_node* bst_search(bst_node* HEAD, char target_name[NAME_LEN]);
bst_node* bst_insert(bst_node* HEAD, char name[NAME_LEN], char phone[PHONE_LEN]);
bst_node* bst_delete(bst_node* root, char target_name[NAME_LEN]);
void treeLevelTraversal(bst_node* node);
void printTree(bst_node* node, int depth);
void delete_bst(bst_node* root);

View File

@ -0,0 +1,42 @@
#include <stdlib.h>
#include "queue.h"
int queueEmpty(Queue* q)
{
return (q->head == q->tail);
}
int size(Queue* q)
{
if (q->head > q->tail)
return QUEUE_MAX_LENGTH - q->head + q->tail;
else
return q->tail - q->head;
}
void queuePush(Queue* q, void* ptr)
{
if (size(q) != QUEUE_MAX_LENGTH)
{
q->p[q->tail] = ptr;
q->tail = (q->tail + 1) % QUEUE_MAX_LENGTH;
}
};
void queueInit(Queue* q)
{
q->head = 0;
q->tail = 0;
}
void* queuePop(Queue* q)
{
if (queueEmpty(q))
return NULL;
void* x = q->p[q->head];
q->head = (q->head + 1) % QUEUE_MAX_LENGTH;
return x;
};

View File

@ -0,0 +1,17 @@
#define QUEUE_MAX_LENGTH 100
typedef struct Queue {
void* p[QUEUE_MAX_LENGTH];
unsigned int head;
unsigned int tail;
} Queue;
int queueEmpty(Queue* q);
void queuePush(Queue* q, void* p);
void* queuePop(Queue* q);
void queueInit(Queue* q);
int size(Queue* q);

View File

@ -0,0 +1,3 @@
module source
go 1.26.3

View File

@ -0,0 +1,166 @@
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "linked_list.h"
/*
Связный список (LinkedListPhoneBook)
Узел представляется словарём: `{'name': 'Имя', 'phone': '123', 'next': None}.`
Функции:
def ll_insert(head, name, phone) проходит до конца (или сразу добавляет в конец) и возвращает новую голову (если вставка в начало) или изменяет список по ссылке. Удобнее возвращать новую голову, если вставка может быть в начало.
def ll_find(head, name) ищет узел, возвращает телефон или None.
def ll_delete(head, name) удаляет узел, возвращает новую голову.
def ll_list_all(head) собирает все записи в список и сортирует (сортировка вынесена отдельно).
*/
int getListNodeLength(Node* HEAD)
{
int len = 0;
Node* current = HEAD;
while (current != NULL)
{
len++;
current = current->next;
}
return len;
}
// Добавление в конец
Node* insert(Node* head, char name[NAME_BUFF_SIZE], char phone[PHONE_BUFF_SIZE], int show)
{
Node* newNode = (Node*)malloc(sizeof(Node));
strcpy_s(newNode->name_, NAME_BUFF_SIZE, name);
strcpy_s(newNode->phone_, PHONE_BUFF_SIZE, phone);
newNode->next = NULL;
printf("Data: %s %s\n", name, phone);
printf("New Data: %s %s\n", newNode->name_, newNode->phone_);
if (head == NULL)
{
printf("\nNew list\n");
head = newNode;
return newNode;
}
Node* last = head;
int ind = 0;
while (last->next != NULL)
{
if (show == 1)
printf("%d \n", ind++);
last = last->next;
}
last->next = newNode;
return head;
}
char* find(Node* HEAD, char target_name[NAME_BUFF_SIZE])
{
Node* current = HEAD;
while (current != NULL)
{
if (strcmp(target_name, current->name_) == 0)
{
return current->phone_;
}
current = current->next;
}
return NULL;
}
// Вывод всех элементов
void printAllNodes(Node* head)
{
Node* current = head;
int ind = 0;
while (current != NULL)
{
printf("Ind: %d\nName: %s\nPhone: %s\n", ind++, current->name_, current->phone_);
current = current->next;
}
}
Node* deleteNode(Node* HEAD, char target_name[NAME_BUFF_SIZE])
{
Node* previous = NULL;
Node* current = HEAD;
if (current != NULL && strcmp(target_name, current->name_) == 0)
{
HEAD = current->next;
free(current);
return HEAD;
}
while (current != NULL && strcmp(target_name, current->name_) == 0)
{
previous = current;
current = current->next;
}
if (current == NULL) return HEAD;
previous->next = current->next;
free(current);
return HEAD;
}
Node* listAll(Node* HEAD)
{
if (HEAD == NULL)
{
return NULL;
}
int len = getListNodeLength(HEAD);
Node* current = HEAD;
Node* list = (Node*)malloc(len * sizeof(Node));
int ind = 0;
while (current != NULL)
{
list[ind++] = *current;
current = current->next;
}
return list;
}
void printNode(Node node)
{
printf("%s ", node.name_);
printf("%s\n", node.phone_);
}
void printListNode(Node* list, int length)
{
printf("\n\n%d\n", length);
for (int i = 0; i < length; i++)
{
printNode(list[i]);
}
}

View File

@ -0,0 +1,29 @@
#define NAME_BUFF_SIZE 50
#define PHONE_BUFF_SIZE 12+1 // +1 for end symbol
typedef struct Node
{
char name_[NAME_BUFF_SIZE];
char phone_[PHONE_BUFF_SIZE];
struct Node* next;
} Node;
typedef struct LinkedListPhoneNumbers {
Node* HEAD;
} LinkedListPhoneNumbers;
Node* insert(Node* head, char name[NAME_BUFF_SIZE], char phone[PHONE_BUFF_SIZE], int show);
void printAllNodes(Node* head);
void printNode(Node node);
char* find(Node* HEAD, char target_name[NAME_BUFF_SIZE]);
Node* deleteNode(Node* HEAD, char target_name[NAME_BUFF_SIZE]);
Node* listAll(Node* HEAD);
void printListNode(Node list[], int length);
int getListNodeLength(Node* HEAD);

View File

@ -0,0 +1,44 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "linked_list/linked_list.h"
#define NAME_BUFF_SIZE 50
#define PHONE_BUFF_SIZE 12+1 // +1 for end symbol
int main()
{
Node* list = NULL;
char phone[] = "1234";
for (int i = 0; i < 12; i++)
{
char num[3];
sprintf_s(num, 3, "%d", i);
char name[] = "name ";
strcat_s(name, 9, num);
printf("%d %s %s\n", i, name, phone);
list = insert(list, name, phone, 0);
}
char test_name[] = "name 20";
char test_phone[] = "phone 343";
list = insert(list, test_name, test_phone, 1);
printAllNodes(list);
printf("\n%s\n", find(list, test_name));
strcpy_s(test_name, NAME_BUFF_SIZE, "name 10");
list = deleteNode(list, test_name);
printAllNodes(list);
Node* listNodes = listAll(list);
printListNode(listNodes, getListNodeLength(list));
free(listNodes);
return 0;
}

View File

@ -0,0 +1,86 @@
#include <stdio.h>
#include <stdlib.h>
#include "bin_search_tree/bst.h"
#define COUNT_NUMBERS 64
int isInArr(int arr[], int len, int target)
{
for (int i = 0; i < len; i++)
{
if (arr[i] == target) return 1;
}
return 0;
}
char get_dozen(int number)
{
return (char)'0' + number % 10;
}
char get_units(int number)
{
return (char)'0' + number / 10;
}
int main()
{
printf("hello world!\n");
//bst_node* head = create_bst_node("name", "phone");
bst_node* head = NULL;
int arr[COUNT_NUMBERS] = {0};
char name[NAME_LEN] = "name_xx";
char phone[PHONE_LEN] = "phone_xx";
int temp = 0;
for (int i = 0; i < COUNT_NUMBERS; i++)
{
do
{
temp = rand() % 100;
}
while (isInArr(arr, i - 1, temp));
arr[i] = temp;
name[5] = get_dozen(temp);
name[6] = get_units(temp);
phone[6] = get_dozen(temp);
phone[7] = get_units(temp);
head = bst_insert(head, name, phone);
printf("%d ", arr[i]);
}
printf("\n\ninorder traversal: \n");
bst_inorder_traversal(head);
printf("\n\npreorder traversal: \n");
bst_preorder_traversal(head);
char tar_name[NAME_LEN] = "name_44";
printf("\n\nУдаляем элемент с значением %s:\n", tar_name);
head = bst_delete(head, tar_name);
bst_inorder_traversal(head);
printf("\n\nВывод дерева:\n");
printTree(head, 0);
printf("\n\nОбход в ширину:\n");
treeLevelTraversal(head);
delete_bst(head);
return 0;
}

View File

@ -0,0 +1,40 @@
#include <stdio.h>
int Partition_Hoa(int arr[], int l, int r)
{
int p = arr[(l + r) / 2];
int i = l;
int j = r;
while (1)
{
// #print(p)
while (arr[i] <= p) i++;
while (arr[j] > p) j--;
if (i >= j) return j;
swap(arr[i], arr[j]);
i++;
j--;
}
}
void QuickSort(int arr[], int l, int r)
{
if (l < r):
{
int s = Partition_Hoa(arr, l, r);
QuickSort(arr, l, s-1);
QuickSort(arr, s+1, r);
}
}
int main()
{
int arr[] = {2, 56, 10, 5, 2, 6, 9, 6, 3, 923, 3, 2, 1};
return 0;
}

View File

@ -0,0 +1,81 @@
package csvwriter
import (
"encoding/csv"
"fmt"
"os"
"path/filepath"
)
type BenchmarkResult struct {
Structure string
Mode string
Operation string
Time float64
}
func (b *BenchmarkResult) ToString() string {
return fmt.Sprintf("%s %s %s %f", b.Structure, b.Mode, b.Operation, b.Time)
}
func (b *BenchmarkResult) ToStrings() []string {
return []string{b.Structure, b.Mode, b.Operation, fmt.Sprintf("%f", b.Time)}
}
// Создаём пустой csv файл с заголовками
func CreateEmptyCSV(dir, name string) error {
filename := filepath.Join(dir, name)
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
header := []string{"Structure", "Mode", "Operation", "Time"}
writer.Write(header)
return writer.Error()
}
// AppendRaw дописывает произвольные строки в CSV
func AppendRaw(results []BenchmarkResult) error {
filename := filepath.Join("results", "benchmarks.csv")
fileExists := true
isEmpty := true
if info, err := os.Stat(filename); err == nil {
isEmpty = info.Size() == 0
} else if os.IsNotExist(err) {
fileExists = false
}
file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return err
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
// Если файл новый или пустой, записываем заголовки
if !fileExists || isEmpty {
header := []string{"Structure", "Mode", "Operation", "Time"}
if err := writer.Write(header); err != nil {
return fmt.Errorf("не удалось записать заголовки: %w", err)
}
}
rows := make([][]string, len(results))
for i, res := range results {
rows[i] = res.ToStrings()
// fmt.Println(res.ToStrings())
}
return writer.WriteAll(rows) // WriteAll пишет всё сразу
}

View File

@ -0,0 +1,25 @@
package data_struct
import "fmt"
type MyData struct {
Name string
Phone string
}
func NewData(name, phone string) *MyData {
return &MyData{
Name: name,
Phone: phone,
}
}
func (d *MyData) ToString() string {
return fmt.Sprintf("Имя: %s, Телефон: %s", d.Name, d.Phone)
}
func PrintList(list []MyData) {
for _, el := range list {
fmt.Printf("%s\n", el.ToString())
}
}

View File

@ -0,0 +1,44 @@
package data_struct
func QSort(arr []MyData, l, r int) []MyData {
result := make([]MyData, len(arr))
copy(result, arr)
qSort(result, l, r)
return result
}
func qSort(arr []MyData, l, r int) []MyData {
if l < r {
s := Partition_Hoa(arr, l, r)
arr = qSort(arr, l, s)
arr = qSort(arr, s+1, r)
}
return arr
}
func Partition_Hoa(arr []MyData, l, r int) int {
p := arr[(l+r)/2].Name
i := l - 1
j := r + 1
for {
for {
i++
if arr[i].Name >= p {
break
}
}
for {
j--
if arr[j].Name <= p {
break
}
}
if i >= j {
return j
}
arr[i], arr[j] = arr[j], arr[i]
}
}

View File

@ -0,0 +1,47 @@
package gen_data
import (
"fmt"
"math/rand"
ds "source/pkg/data_struct"
)
const (
MAX_USER_IND = 10000
PHONE_LEN = 11
)
func genRandomPhone() string {
phone := ""
for i := 0; i < PHONE_LEN; i++ {
phone += fmt.Sprintf("%d", rand.Intn(10))
}
return phone
}
func RecordsShuffled(count int) []ds.MyData {
data := make([]ds.MyData, count)
number := 0
for i := 0; i < count; i++ {
number = rand.Intn(MAX_USER_IND)
data[i].Name = fmt.Sprintf("User_%05d", number)
data[i].Phone = genRandomPhone()
}
// Перемешиваем (Fisher-Yates shuffle)
for i := len(data) - 1; i > 0; i-- {
j := rand.Intn(i + 1)
data[i], data[j] = data[j], data[i]
}
return data
}
func RecordsSorted(count int) []ds.MyData {
data := RecordsShuffled(count)
data = ds.QSort(data, 0, len(data)-1)
return data
}

View File

@ -0,0 +1,287 @@
package bin_search_tree
import (
"fmt"
ds "source/pkg/data_struct"
)
type BinSearchTree struct {
root *BSTree
}
type BSTree struct {
data ds.MyData
left *BSTree
right *BSTree
}
func NewBinSearchTree() *BinSearchTree {
return &BinSearchTree{}
}
func newBinSearchTree(data ds.MyData) *BSTree {
return &BSTree{
data: data,
left: nil,
right: nil,
}
}
func (bst *BinSearchTree) Len() int {
return bst.root.Len()
}
func (bst *BSTree) Len() int {
if bst == nil {
return 0
}
return 1 + bst.left.Len() + bst.right.Len()
}
func (bst *BinSearchTree) Minimum() *BSTree {
return bst.root.Minimum()
}
func (root *BSTree) Minimum() *BSTree {
if root == nil {
return nil
}
if root.left == nil {
return root
}
return root.left.Minimum()
}
func (bst *BinSearchTree) Maximum() *BSTree {
return bst.root.Maximum()
}
func (root *BSTree) Maximum() *BSTree {
if root == nil {
return nil
}
if root.right == nil {
return root
}
return root.right.Maximum()
}
func (node *BSTree) PrintNode() {
fmt.Print(node.data.ToString())
}
func (node *BSTree) ToString() string {
if node == nil {
return "nil"
}
return node.data.ToString()
}
func (bst *BinSearchTree) BstInorderTraversal() {
bst.root.BstInorderTraversal()
}
func (root *BSTree) BstInorderTraversal() {
if root != nil {
root.left.BstInorderTraversal()
root.PrintNode()
fmt.Println()
root.right.BstInorderTraversal()
}
}
func (bst *BinSearchTree) BstPreorderTraversal() {
bst.root.BstPreorderTraversal()
}
func (root *BSTree) BstPreorderTraversal() {
if root != nil {
root.PrintNode()
fmt.Println()
root.left.BstPreorderTraversal()
root.right.BstPreorderTraversal()
}
}
// Search
// Возвращает номер телефона по имени
func (bst *BinSearchTree) Search(targetName string) (string, bool) {
node, ok := bst.root.search(targetName)
if ok {
return node.data.Phone, true
}
return "", false
}
/*
Node search(x : Node, k : T):
if x == null or k == x.key
return x
if k < x.key
return search(x.left, k)
else
return search(x.right, k)
*/
// Приватная вспомогательная функция поиска
func (node *BSTree) search(targetName string) (*BSTree, bool) {
if node == nil {
return nil, false
}
if node.data.Name == targetName {
return node, true
}
if targetName < node.data.Name {
return node.left.search(targetName)
}
return node.right.search(targetName)
}
// func (node *BinSearchTree) Insert(data ds.MyData) *BinSearchTree {
// if node == nil {
// return NewBinSearchTree(data)
// } else if data.Name < node.data.Name {
// node.left = node.left.Insert(data)
// } else if data.Name > node.data.Name {
// node.right = node.right.Insert(data)
// } else {
// node.data.Phone = data.Phone // Заменяем существующее значение
// }
// return node
// }
func (bst *BinSearchTree) Insert(data ds.MyData) {
bst.root = bst.root.insert(data)
}
func (root *BSTree) insert(data ds.MyData) *BSTree {
if root == nil {
return &BSTree{
data: data,
}
}
if data.Name < root.data.Name {
root.left = root.left.insert(data)
} else if data.Name > root.data.Name {
root.right = root.right.insert(data)
} else {
root.data.Phone = data.Phone
}
return root
}
func (bst *BinSearchTree) InsertAll(data []ds.MyData) {
for _, el := range data {
bst.Insert(el)
}
}
// Delete удаляет узел по имени.
// Возвращает нового потомка для родительского узла.
/*
Node delete(root : Node, z : T): // корень поддерева, удаляемый ключ
if root == null
return root
if z < root.key
root.left = delete(root.left, z)
else if z > root.key
root.right = delete(root.right, z)
else if root.left != null and root.right != null
root.key = minimum(root.right).key
root.right = delete(root.right, root.key)
else
if root.left != null
root = root.left
else if root.right != null
root = root.right
else
root = null
return root
*/
func (bst *BinSearchTree) Height() int {
if bst.root == nil {
return 0
}
return bst.root.height()
}
// height возвращает высоту поддерева (для BSTree)
func (node *BSTree) height() int {
if node == nil {
return 0
}
leftHeight := node.left.height()
rightHeight := node.right.height()
// Высота = 1 (текущий узел) + максимум из высот поддеревьев
if leftHeight > rightHeight {
return leftHeight + 1
}
return rightHeight + 1
}
func (bst *BinSearchTree) Delete(targetName string) bool {
if bst.root == nil {
return false
}
_, found := bst.Search(targetName)
if !found {
return false
}
bst.root = bst.root.delete(targetName)
return true
}
func (root *BSTree) delete(targetName string) *BSTree {
if root == nil {
return nil
}
if targetName < root.data.Name {
root.left = root.left.delete(targetName)
} else if targetName > root.data.Name {
root.right = root.right.delete(targetName)
} else {
// Нашли узел для удаления
// Случай 1: нет левого потомка
if root.left == nil {
return root.right
}
// Случай 2: нет правого потомка
if root.right == nil {
return root.left
}
// Случай 3: оба потомка есть
successor := root.right.Minimum()
root.data = successor.data // Копируем все данные сразу
root.right = root.right.delete(successor.data.Name)
}
return root
}
func (bst *BinSearchTree) PrintAll() {
bst.root.printAll(0)
}
func (bst *BSTree) printAll(depth int) {
if bst == nil {
return
}
bst.right.printAll(depth + 1)
for i := 0; i < depth; i++ {
fmt.Printf("\t")
}
bst.PrintNode()
bst.left.printAll(depth + 1)
}

View File

@ -0,0 +1,15 @@
package hash_table
func GetHashString(str string) int {
hash := 0
for _, ch := range str {
hash = (hash << 5) - hash + int(ch)
}
if hash < 0 {
hash = -hash
}
return hash
}

View File

@ -0,0 +1,246 @@
package hash_table
import (
"fmt"
ds "source/pkg/data_struct"
)
// HashTable - хеш-таблица с цепочками
type HashTable struct {
buckets []*bucket
size int
capacity int
loadFactor float64
}
type bucket struct {
head *elementHT
}
type elementHT struct {
data ds.MyData
next *elementHT
}
// NewHashTable - создает новую хеш-таблицу
func NewHashTable(capacity int, loadFactor float64) *HashTable {
buckets := make([]*bucket, capacity)
for i := 0; i < capacity; i++ {
buckets[i] = &bucket{}
}
return &HashTable{
buckets: buckets,
size: 0,
capacity: capacity,
loadFactor: loadFactor,
}
}
// func (h HashTable) getIndex(name string) int {
// return GetHashString(name) % h.size
// }
// func (h HashTable) Add(name string) {
// }
func (ht *HashTable) GetIndex(name string) int {
hash := GetHashString(name)
return hash % ht.capacity
}
func (ht *HashTable) Len() int {
return ht.size
}
// func (ht *HashTable) getIndex(hash int) int {
// return hash % ht.capacity
// }
func (h *HashTable) Insert(new ds.MyData) {
if h.size >= int(float64(h.capacity)*h.loadFactor) {
h.resize()
}
ind := h.GetIndex(new.Name)
buck := h.buckets[ind]
current := buck.head
for current != nil {
if current.data.Name == new.Name {
current.data.Phone = new.Phone
return
}
current = current.next
}
newHead := &elementHT{
data: new,
next: buck.head,
}
buck.head = newHead
h.size++
}
func (ht *HashTable) InsertAll(data []ds.MyData) {
for _, el := range data {
ht.Insert(el)
}
}
func (h *HashTable) Search(name string) (phone string, status bool) {
ind := h.GetIndex(name)
buck := h.buckets[ind]
current := buck.head
for current != nil {
if current.data.Name == name {
return current.data.Phone, true
}
current = current.next
}
return "", false
}
// func pressEnterToContinue() {
// fmt.Print("Нажмите Enter для продолжения...")
// bufio.NewReader(os.Stdin).ReadBytes('\n')
// }
// resize - увеличивает размер таблицы
func (ht *HashTable) resize() {
// fmt.Printf("Resize table!\n elements: %d(%.3f%%)\n old capacity: %d\n new capacity: %d\n", ht.size, float64(ht.size)/float64(ht.capacity), ht.capacity, 2*ht.capacity)
// ht.Print()
// pressEnterToContinue()
newCapacity := ht.capacity * 2
newHT := NewHashTable(newCapacity, ht.loadFactor)
for _, b := range ht.buckets {
current := b.head
for current != nil {
newHT.Insert(current.data)
current = current.next
}
}
ht.buckets = newHT.buckets
ht.capacity = newCapacity
}
func (ht *HashTable) Delete(name string) bool {
ind := ht.GetIndex(name)
buck := ht.buckets[ind]
if buck.head == nil {
return false
}
if buck.head.data.Name == name {
buck.head = buck.head.next
ht.size--
return true
}
prev := buck.head
current := buck.head.next
for current != nil {
if current.data.Name == name {
prev.next = current.next
ht.size--
return true
}
prev = current
current = current.next
}
return false
}
func (ht *HashTable) Contains(name string) bool {
_, ok := ht.Search(name)
return ok
}
func (elem *elementHT) ToString() string {
if elem == nil {
return "nil"
}
return elem.data.ToString()
}
func (ht *HashTable) Print() {
for ind := 0; ind < ht.capacity; ind++ {
buck := ht.buckets[ind]
current := buck.head
bucketsStr := ""
for current != nil {
bucketsStr += " --> " + current.ToString()
current = current.next
}
fmt.Printf("[%d]: %s\n", ind, bucketsStr)
}
}
func (ht *HashTable) listAll() []ds.MyData {
data := make([]ds.MyData, ht.size)
index := 0
for ind := 0; ind < ht.capacity; ind++ {
buck := ht.buckets[ind]
current := buck.head
for current != nil {
data[index] = current.data
index++
// fmt.Println(current.name, current.phone)
current = current.next
}
}
return data
}
func (ht *HashTable) ListAll() []ds.MyData {
// fmt.Printf("Size: %d, Capacity: %d\n", ht.size, ht.capacity)
data := ht.listAll()
data = ds.QSort(data, 0, len(data)-1)
// for i, el := range data {
// fmt.Printf("[%d]: \"%s\", %d\n", i, el.name, el.phone)
// }
return data
}
// func (ht *HashTable) PrintMostPopularnames(phone int) {
// // fmt.Printf("Size: %d, Capacity: %d\n", ht.size, ht.capacity)
// data := ht.listAll()
// data = QSortElementsHT(data, 0, len(data)-1)
// for i := 0; i < phone; i++ {
// fmt.Printf("[%d]: %3d : %s\n", i, ht.GetIndex(data[len(data)-i-1].name), data[len(data)-i-1].ToString())
// }
// }

View File

@ -0,0 +1,169 @@
package linked_list
import (
"fmt"
ds "source/pkg/data_struct"
)
/*
Связный список (LinkedListPhoneBook)
Узел представляется словарём: `{'name': 'Имя', 'phone': '123', 'next': None}.`
Функции:
def ll_insert(head, name, phone) проходит до конца (или сразу добавляет в конец) и возвращает новую голову (если вставка в начало) или изменяет список по ссылке. Удобнее возвращать новую голову, если вставка может быть в начало.
def ll_find(head, name) ищет узел, возвращает телефон или None.
def ll_delete(head, name) удаляет узел, возвращает новую голову.
def ll_list_all(head) собирает все записи в список и сортирует (сортировка вынесена отдельно).
*/
type LinkedList struct {
head *LList
}
type LList struct {
data ds.MyData
next *LList
}
func NewLinkedList() *LinkedList {
return &LinkedList{}
}
func newLinkedList(data ds.MyData) *LList {
return &LList{
data: data,
next: nil,
}
}
func (ll *LList) ToString() string {
if ll == nil {
return "nil"
}
return ll.data.ToString()
}
func (ll *LinkedList) Len() int {
if ll == nil {
return 0
}
len := 0
current := ll.head
for current != nil {
len++
current = current.next
}
return len
}
func (ll *LinkedList) Insert(data ds.MyData) {
newNode := newLinkedList(data)
if ll.head == nil {
ll.head = newNode
return
}
current := ll.head
for current.next != nil {
current = current.next
}
current.next = newNode
}
func (ll *LinkedList) InsertAll(data []ds.MyData) {
for _, el := range data {
ll.Insert(el)
}
}
func (ll *LinkedList) Search(targetName string) (string, bool) {
current := ll.head
for current != nil {
if current.data.Name == targetName {
return current.data.Phone, true
}
current = current.next
}
return "", false
}
func (ll *LinkedList) PrintAll() {
current := ll.head
index := 0
for current != nil {
fmt.Printf("[%d] %s\n", index, current.ToString())
index++
current = current.next
}
}
func (ll *LinkedList) Delete(targetName string) bool {
if ll.head == nil {
return false
}
// Особый случай: удаление головы списка
if ll.head.data.Name == targetName {
// Сдвигаем данные и указатель
*ll.head = *ll.head.next
return true
}
// Стандартное удаление из середины/конца
current := ll.head
for current.next != nil {
if current.next.data.Name == targetName {
current.next = current.next.next
return true
}
current = current.next
}
return false
}
func (ll *LinkedList) listAll() []ds.MyData {
current := ll.head
listLL := make([]ds.MyData, ll.Len())
ind := 0
for current != nil {
listLL[ind] = current.data
ind++
current = current.next
}
listLL = ds.QSort(listLL, 0, len(listLL)-1)
return listLL
}
func (ll *LinkedList) GetByInd(ind int) (ds.MyData, bool) {
if ind >= ll.Len() {
return ds.MyData{}, false
}
index := 0
current := ll.head
for current != nil {
if index == ind {
return current.data, true
}
current = current.next
index++
}
return ds.MyData{}, false
}

View File

@ -0,0 +1,379 @@
Structure,Mode,Operation,Time
Связный список,Случайный,Вставка,0.194844
Связный список,Случайный,Поиск,0.023535
Связный список,Случайный,Удаление,0.015070
Связный список,Случайный,Вставка,0.195476
Связный список,Случайный,Поиск,0.024576
Связный список,Случайный,Удаление,0.013662
Связный список,Случайный,Вставка,0.196501
Связный список,Случайный,Поиск,0.027028
Связный список,Случайный,Удаление,0.018409
Связный список,Случайный,Вставка,0.194328
Связный список,Случайный,Поиск,0.024307
Связный список,Случайный,Удаление,0.014566
Связный список,Случайный,Вставка,0.192402
Связный список,Случайный,Поиск,0.024709
Связный список,Случайный,Удаление,0.012597
Связный список,Случайный,Вставка,0.195884
Связный список,Случайный,Поиск,0.024688
Связный список,Случайный,Удаление,0.014169
Связный список,Случайный,Вставка,0.193099
Связный список,Случайный,Поиск,0.024969
Связный список,Случайный,Удаление,0.014594
Связный список,Случайный,Вставка,0.190199
Связный список,Случайный,Поиск,0.024101
Связный список,Случайный,Удаление,0.014087
Связный список,Случайный,Вставка,0.194119
Связный список,Случайный,Поиск,0.024697
Связный список,Случайный,Удаление,0.015095
Связный список,Случайный,Вставка,0.192847
Связный список,Случайный,Поиск,0.024285
Связный список,Случайный,Удаление,0.014059
Связный список,Случайный,Вставка,0.191560
Связный список,Случайный,Поиск,0.024087
Связный список,Случайный,Удаление,0.013595
Связный список,Случайный,Вставка,0.192786
Связный список,Случайный,Поиск,0.023233
Связный список,Случайный,Удаление,0.014077
Связный список,Случайный,Вставка,0.197807
Связный список,Случайный,Поиск,0.024156
Связный список,Случайный,Удаление,0.015051
Связный список,Случайный,Вставка,0.191335
Связный список,Случайный,Поиск,0.024676
Связный список,Случайный,Удаление,0.013941
Связный список,Случайный,Вставка,0.195091
Связный список,Случайный,Поиск,0.024660
Связный список,Случайный,Удаление,0.013566
Связный список,Случайный,Вставка,0.196118
Связный список,Случайный,Поиск,0.024149
Связный список,Случайный,Удаление,0.014061
Связный список,Случайный,Вставка,0.192031
Связный список,Случайный,Поиск,0.024358
Связный список,Случайный,Удаление,0.013602
Связный список,Случайный,Вставка,0.192075
Связный список,Случайный,Поиск,0.024104
Связный список,Случайный,Удаление,0.013106
Связный список,Случайный,Вставка,0.192208
Связный список,Случайный,Поиск,0.023780
Связный список,Случайный,Удаление,0.014568
Связный список,Случайный,Вставка,0.193080
Связный список,Случайный,Поиск,0.024706
Связный список,Случайный,Удаление,0.013573
Связный список,Случайный,Вставка (среднее),0.193690
Связный список,Случайный,Поиск (среднее),0.024440
Связный список,Случайный,Удаление (среднее),0.014272
Связный список,Отсортированный,Вставка,0.193077
Связный список,Отсортированный,Поиск,0.033712
Связный список,Отсортированный,Удаление,0.023180
Связный список,Отсортированный,Вставка,0.191460
Связный список,Отсортированный,Поиск,0.033173
Связный список,Отсортированный,Удаление,0.024734
Связный список,Отсортированный,Вставка,0.193809
Связный список,Отсортированный,Поиск,0.034748
Связный список,Отсортированный,Удаление,0.022083
Связный список,Отсортированный,Вставка,0.198505
Связный список,Отсортированный,Поиск,0.034239
Связный список,Отсортированный,Удаление,0.022935
Связный список,Отсортированный,Вставка,0.192402
Связный список,Отсортированный,Поиск,0.036666
Связный список,Отсортированный,Удаление,0.022155
Связный список,Отсортированный,Вставка,0.198979
Связный список,Отсортированный,Поиск,0.033534
Связный список,Отсортированный,Удаление,0.024246
Связный список,Отсортированный,Вставка,0.196372
Связный список,Отсортированный,Поиск,0.033731
Связный список,Отсортированный,Удаление,0.023694
Связный список,Отсортированный,Вставка,0.209801
Связный список,Отсортированный,Поиск,0.057158
Связный список,Отсортированный,Удаление,0.027851
Связный список,Отсортированный,Вставка,0.194425
Связный список,Отсортированный,Поиск,0.034020
Связный список,Отсортированный,Удаление,0.021955
Связный список,Отсортированный,Вставка,0.195977
Связный список,Отсортированный,Поиск,0.033676
Связный список,Отсортированный,Удаление,0.022606
Связный список,Отсортированный,Вставка,0.191872
Связный список,Отсортированный,Поиск,0.032348
Связный список,Отсортированный,Удаление,0.023074
Связный список,Отсортированный,Вставка,0.195098
Связный список,Отсортированный,Поиск,0.032630
Связный список,Отсортированный,Удаление,0.023753
Связный список,Отсортированный,Вставка,0.194327
Связный список,Отсортированный,Поиск,0.032106
Связный список,Отсортированный,Удаление,0.023585
Связный список,Отсортированный,Вставка,0.190991
Связный список,Отсортированный,Поиск,0.031614
Связный список,Отсортированный,Удаление,0.022668
Связный список,Отсортированный,Вставка,0.193774
Связный список,Отсортированный,Поиск,0.033153
Связный список,Отсортированный,Удаление,0.022583
Связный список,Отсортированный,Вставка,0.206674
Связный список,Отсортированный,Поиск,0.033185
Связный список,Отсортированный,Удаление,0.023165
Связный список,Отсортированный,Вставка,0.191183
Связный список,Отсортированный,Поиск,0.032613
Связный список,Отсортированный,Удаление,0.022630
Связный список,Отсортированный,Вставка,0.190937
Связный список,Отсортированный,Поиск,0.033334
Связный список,Отсортированный,Удаление,0.022092
Связный список,Отсортированный,Вставка,0.191349
Связный список,Отсортированный,Поиск,0.036153
Связный список,Отсортированный,Удаление,0.022576
Связный список,Отсортированный,Вставка,0.195836
Связный список,Отсортированный,Поиск,0.032643
Связный список,Отсортированный,Удаление,0.022599
Связный список,Отсортированный,Вставка (среднее),0.195342
Связный список,Отсортированный,Поиск (среднее),0.034722
Связный список,Отсортированный,Удаление (среднее),0.023208
Хеш таблица,Случайный,Вставка,0.002008
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.004030
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002006
Хеш таблица,Случайный,Поиск,0.001004
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002157
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.003016
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002017
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.003028
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002514
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002955
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002034
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002006
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.004015
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002255
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.003012
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002006
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002301
Хеш таблица,Случайный,Поиск,0.000503
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002568
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002006
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.003140
Хеш таблица,Случайный,Поиск,0.000000
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка,0.002015
Хеш таблица,Случайный,Поиск,0.001009
Хеш таблица,Случайный,Удаление,0.000000
Хеш таблица,Случайный,Вставка (среднее),0.002554
Хеш таблица,Случайный,Поиск (среднее),0.000126
Хеш таблица,Случайный,Удаление (среднее),0.000000
Хеш таблица,Отсортированный,Вставка,0.001504
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.003014
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.002020
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.001503
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.002023
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000503
Хеш таблица,Отсортированный,Вставка,0.001509
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.002282
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.002008
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.003019
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.001504
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.002523
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.002006
Хеш таблица,Отсортированный,Поиск,0.001000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.001503
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.001148
Хеш таблица,Отсортированный,Вставка,0.001504
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.002013
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.001002
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.003522
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.001008
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.002546
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка,0.001001
Хеш таблица,Отсортированный,Поиск,0.000000
Хеш таблица,Отсортированный,Удаление,0.000000
Хеш таблица,Отсортированный,Вставка (среднее),0.001951
Хеш таблица,Отсортированный,Поиск (среднее),0.000050
Хеш таблица,Отсортированный,Удаление (среднее),0.000083
Бинарное дерево поиска,Случайный,Вставка,0.003507
Бинарное дерево поиска,Случайный,Поиск,0.001002
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.004530
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.004086
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.004518
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.005591
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.004526
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.001503
Бинарное дерево поиска,Случайный,Вставка,0.004028
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.004618
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.001503
Бинарное дерево поиска,Случайный,Вставка,0.006937
Бинарное дерево поиска,Случайный,Поиск,0.001400
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.006121
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.001001
Бинарное дерево поиска,Случайный,Вставка,0.007520
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.001006
Бинарное дерево поиска,Случайный,Вставка,0.005534
Бинарное дерево поиска,Случайный,Поиск,0.001001
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.003024
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.007068
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.001003
Бинарное дерево поиска,Случайный,Вставка,0.004552
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.004518
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.003011
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.004291
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка,0.004562
Бинарное дерево поиска,Случайный,Поиск,0.000000
Бинарное дерево поиска,Случайный,Удаление,0.001002
Бинарное дерево поиска,Случайный,Вставка,0.003511
Бинарное дерево поиска,Случайный,Поиск,0.001003
Бинарное дерево поиска,Случайный,Удаление,0.000000
Бинарное дерево поиска,Случайный,Вставка (среднее),0.004803
Бинарное дерево поиска,Случайный,Поиск (среднее),0.000220
Бинарное дерево поиска,Случайный,Удаление (среднее),0.000351
Бинарное дерево поиска,Отсортированный,Вставка,0.900417
Бинарное дерево поиска,Отсортированный,Поиск,0.052424
Бинарное дерево поиска,Отсортированный,Удаление,0.061880
Бинарное дерево поиска,Отсортированный,Вставка,0.889120
Бинарное дерево поиска,Отсортированный,Поиск,0.053632
Бинарное дерево поиска,Отсортированный,Удаление,0.062189
Бинарное дерево поиска,Отсортированный,Вставка,0.881248
Бинарное дерево поиска,Отсортированный,Поиск,0.055152
Бинарное дерево поиска,Отсортированный,Удаление,0.061669
Бинарное дерево поиска,Отсортированный,Вставка,0.885030
Бинарное дерево поиска,Отсортированный,Поиск,0.055543
Бинарное дерево поиска,Отсортированный,Удаление,0.062420
Бинарное дерево поиска,Отсортированный,Вставка,0.891156
Бинарное дерево поиска,Отсортированный,Поиск,0.056153
Бинарное дерево поиска,Отсортированный,Удаление,0.062845
Бинарное дерево поиска,Отсортированный,Вставка,0.891750
Бинарное дерево поиска,Отсортированный,Поиск,0.058122
Бинарное дерево поиска,Отсортированный,Удаление,0.062453
Бинарное дерево поиска,Отсортированный,Вставка,0.888773
Бинарное дерево поиска,Отсортированный,Поиск,0.055758
Бинарное дерево поиска,Отсортированный,Удаление,0.061916
Бинарное дерево поиска,Отсортированный,Вставка,0.888226
Бинарное дерево поиска,Отсортированный,Поиск,0.051592
Бинарное дерево поиска,Отсортированный,Удаление,0.063321
Бинарное дерево поиска,Отсортированный,Вставка,0.880372
Бинарное дерево поиска,Отсортированный,Поиск,0.053502
Бинарное дерево поиска,Отсортированный,Удаление,0.063089
Бинарное дерево поиска,Отсортированный,Вставка,0.889972
Бинарное дерево поиска,Отсортированный,Поиск,0.055111
Бинарное дерево поиска,Отсортированный,Удаление,0.062310
Бинарное дерево поиска,Отсортированный,Вставка,0.882075
Бинарное дерево поиска,Отсортированный,Поиск,0.055492
Бинарное дерево поиска,Отсортированный,Удаление,0.062256
Бинарное дерево поиска,Отсортированный,Вставка,0.884940
Бинарное дерево поиска,Отсортированный,Поиск,0.056025
Бинарное дерево поиска,Отсортированный,Удаление,0.062441
Бинарное дерево поиска,Отсортированный,Вставка,0.881076
Бинарное дерево поиска,Отсортированный,Поиск,0.051258
Бинарное дерево поиска,Отсортированный,Удаление,0.061709
Бинарное дерево поиска,Отсортированный,Вставка,0.882319
Бинарное дерево поиска,Отсортированный,Поиск,0.053783
Бинарное дерево поиска,Отсортированный,Удаление,0.061596
Бинарное дерево поиска,Отсортированный,Вставка,0.890215
Бинарное дерево поиска,Отсортированный,Поиск,0.051424
Бинарное дерево поиска,Отсортированный,Удаление,0.063194
Бинарное дерево поиска,Отсортированный,Вставка,0.886962
Бинарное дерево поиска,Отсортированный,Поиск,0.054314
Бинарное дерево поиска,Отсортированный,Удаление,0.062138
Бинарное дерево поиска,Отсортированный,Вставка,0.887173
Бинарное дерево поиска,Отсортированный,Поиск,0.055819
Бинарное дерево поиска,Отсортированный,Удаление,0.064069
Бинарное дерево поиска,Отсортированный,Вставка,0.884293
Бинарное дерево поиска,Отсортированный,Поиск,0.052575
Бинарное дерево поиска,Отсортированный,Удаление,0.063521
Бинарное дерево поиска,Отсортированный,Вставка,0.888483
Бинарное дерево поиска,Отсортированный,Поиск,0.053261
Бинарное дерево поиска,Отсортированный,Удаление,0.062347
Бинарное дерево поиска,Отсортированный,Вставка,0.889441
Бинарное дерево поиска,Отсортированный,Поиск,0.050554
Бинарное дерево поиска,Отсортированный,Удаление,0.062955
Бинарное дерево поиска,Отсортированный,Вставка (среднее),0.887152
Бинарное дерево поиска,Отсортированный,Поиск (среднее),0.054075
Бинарное дерево поиска,Отсортированный,Удаление (среднее),0.062516
1 Structure Mode Operation Time
2 Связный список Случайный Вставка 0.194844
3 Связный список Случайный Поиск 0.023535
4 Связный список Случайный Удаление 0.015070
5 Связный список Случайный Вставка 0.195476
6 Связный список Случайный Поиск 0.024576
7 Связный список Случайный Удаление 0.013662
8 Связный список Случайный Вставка 0.196501
9 Связный список Случайный Поиск 0.027028
10 Связный список Случайный Удаление 0.018409
11 Связный список Случайный Вставка 0.194328
12 Связный список Случайный Поиск 0.024307
13 Связный список Случайный Удаление 0.014566
14 Связный список Случайный Вставка 0.192402
15 Связный список Случайный Поиск 0.024709
16 Связный список Случайный Удаление 0.012597
17 Связный список Случайный Вставка 0.195884
18 Связный список Случайный Поиск 0.024688
19 Связный список Случайный Удаление 0.014169
20 Связный список Случайный Вставка 0.193099
21 Связный список Случайный Поиск 0.024969
22 Связный список Случайный Удаление 0.014594
23 Связный список Случайный Вставка 0.190199
24 Связный список Случайный Поиск 0.024101
25 Связный список Случайный Удаление 0.014087
26 Связный список Случайный Вставка 0.194119
27 Связный список Случайный Поиск 0.024697
28 Связный список Случайный Удаление 0.015095
29 Связный список Случайный Вставка 0.192847
30 Связный список Случайный Поиск 0.024285
31 Связный список Случайный Удаление 0.014059
32 Связный список Случайный Вставка 0.191560
33 Связный список Случайный Поиск 0.024087
34 Связный список Случайный Удаление 0.013595
35 Связный список Случайный Вставка 0.192786
36 Связный список Случайный Поиск 0.023233
37 Связный список Случайный Удаление 0.014077
38 Связный список Случайный Вставка 0.197807
39 Связный список Случайный Поиск 0.024156
40 Связный список Случайный Удаление 0.015051
41 Связный список Случайный Вставка 0.191335
42 Связный список Случайный Поиск 0.024676
43 Связный список Случайный Удаление 0.013941
44 Связный список Случайный Вставка 0.195091
45 Связный список Случайный Поиск 0.024660
46 Связный список Случайный Удаление 0.013566
47 Связный список Случайный Вставка 0.196118
48 Связный список Случайный Поиск 0.024149
49 Связный список Случайный Удаление 0.014061
50 Связный список Случайный Вставка 0.192031
51 Связный список Случайный Поиск 0.024358
52 Связный список Случайный Удаление 0.013602
53 Связный список Случайный Вставка 0.192075
54 Связный список Случайный Поиск 0.024104
55 Связный список Случайный Удаление 0.013106
56 Связный список Случайный Вставка 0.192208
57 Связный список Случайный Поиск 0.023780
58 Связный список Случайный Удаление 0.014568
59 Связный список Случайный Вставка 0.193080
60 Связный список Случайный Поиск 0.024706
61 Связный список Случайный Удаление 0.013573
62 Связный список Случайный Вставка (среднее) 0.193690
63 Связный список Случайный Поиск (среднее) 0.024440
64 Связный список Случайный Удаление (среднее) 0.014272
65 Связный список Отсортированный Вставка 0.193077
66 Связный список Отсортированный Поиск 0.033712
67 Связный список Отсортированный Удаление 0.023180
68 Связный список Отсортированный Вставка 0.191460
69 Связный список Отсортированный Поиск 0.033173
70 Связный список Отсортированный Удаление 0.024734
71 Связный список Отсортированный Вставка 0.193809
72 Связный список Отсортированный Поиск 0.034748
73 Связный список Отсортированный Удаление 0.022083
74 Связный список Отсортированный Вставка 0.198505
75 Связный список Отсортированный Поиск 0.034239
76 Связный список Отсортированный Удаление 0.022935
77 Связный список Отсортированный Вставка 0.192402
78 Связный список Отсортированный Поиск 0.036666
79 Связный список Отсортированный Удаление 0.022155
80 Связный список Отсортированный Вставка 0.198979
81 Связный список Отсортированный Поиск 0.033534
82 Связный список Отсортированный Удаление 0.024246
83 Связный список Отсортированный Вставка 0.196372
84 Связный список Отсортированный Поиск 0.033731
85 Связный список Отсортированный Удаление 0.023694
86 Связный список Отсортированный Вставка 0.209801
87 Связный список Отсортированный Поиск 0.057158
88 Связный список Отсортированный Удаление 0.027851
89 Связный список Отсортированный Вставка 0.194425
90 Связный список Отсортированный Поиск 0.034020
91 Связный список Отсортированный Удаление 0.021955
92 Связный список Отсортированный Вставка 0.195977
93 Связный список Отсортированный Поиск 0.033676
94 Связный список Отсортированный Удаление 0.022606
95 Связный список Отсортированный Вставка 0.191872
96 Связный список Отсортированный Поиск 0.032348
97 Связный список Отсортированный Удаление 0.023074
98 Связный список Отсортированный Вставка 0.195098
99 Связный список Отсортированный Поиск 0.032630
100 Связный список Отсортированный Удаление 0.023753
101 Связный список Отсортированный Вставка 0.194327
102 Связный список Отсортированный Поиск 0.032106
103 Связный список Отсортированный Удаление 0.023585
104 Связный список Отсортированный Вставка 0.190991
105 Связный список Отсортированный Поиск 0.031614
106 Связный список Отсортированный Удаление 0.022668
107 Связный список Отсортированный Вставка 0.193774
108 Связный список Отсортированный Поиск 0.033153
109 Связный список Отсортированный Удаление 0.022583
110 Связный список Отсортированный Вставка 0.206674
111 Связный список Отсортированный Поиск 0.033185
112 Связный список Отсортированный Удаление 0.023165
113 Связный список Отсортированный Вставка 0.191183
114 Связный список Отсортированный Поиск 0.032613
115 Связный список Отсортированный Удаление 0.022630
116 Связный список Отсортированный Вставка 0.190937
117 Связный список Отсортированный Поиск 0.033334
118 Связный список Отсортированный Удаление 0.022092
119 Связный список Отсортированный Вставка 0.191349
120 Связный список Отсортированный Поиск 0.036153
121 Связный список Отсортированный Удаление 0.022576
122 Связный список Отсортированный Вставка 0.195836
123 Связный список Отсортированный Поиск 0.032643
124 Связный список Отсортированный Удаление 0.022599
125 Связный список Отсортированный Вставка (среднее) 0.195342
126 Связный список Отсортированный Поиск (среднее) 0.034722
127 Связный список Отсортированный Удаление (среднее) 0.023208
128 Хеш таблица Случайный Вставка 0.002008
129 Хеш таблица Случайный Поиск 0.000000
130 Хеш таблица Случайный Удаление 0.000000
131 Хеш таблица Случайный Вставка 0.004030
132 Хеш таблица Случайный Поиск 0.000000
133 Хеш таблица Случайный Удаление 0.000000
134 Хеш таблица Случайный Вставка 0.002006
135 Хеш таблица Случайный Поиск 0.001004
136 Хеш таблица Случайный Удаление 0.000000
137 Хеш таблица Случайный Вставка 0.002157
138 Хеш таблица Случайный Поиск 0.000000
139 Хеш таблица Случайный Удаление 0.000000
140 Хеш таблица Случайный Вставка 0.003016
141 Хеш таблица Случайный Поиск 0.000000
142 Хеш таблица Случайный Удаление 0.000000
143 Хеш таблица Случайный Вставка 0.002017
144 Хеш таблица Случайный Поиск 0.000000
145 Хеш таблица Случайный Удаление 0.000000
146 Хеш таблица Случайный Вставка 0.003028
147 Хеш таблица Случайный Поиск 0.000000
148 Хеш таблица Случайный Удаление 0.000000
149 Хеш таблица Случайный Вставка 0.002514
150 Хеш таблица Случайный Поиск 0.000000
151 Хеш таблица Случайный Удаление 0.000000
152 Хеш таблица Случайный Вставка 0.002955
153 Хеш таблица Случайный Поиск 0.000000
154 Хеш таблица Случайный Удаление 0.000000
155 Хеш таблица Случайный Вставка 0.002034
156 Хеш таблица Случайный Поиск 0.000000
157 Хеш таблица Случайный Удаление 0.000000
158 Хеш таблица Случайный Вставка 0.002006
159 Хеш таблица Случайный Поиск 0.000000
160 Хеш таблица Случайный Удаление 0.000000
161 Хеш таблица Случайный Вставка 0.004015
162 Хеш таблица Случайный Поиск 0.000000
163 Хеш таблица Случайный Удаление 0.000000
164 Хеш таблица Случайный Вставка 0.002255
165 Хеш таблица Случайный Поиск 0.000000
166 Хеш таблица Случайный Удаление 0.000000
167 Хеш таблица Случайный Вставка 0.003012
168 Хеш таблица Случайный Поиск 0.000000
169 Хеш таблица Случайный Удаление 0.000000
170 Хеш таблица Случайный Вставка 0.002006
171 Хеш таблица Случайный Поиск 0.000000
172 Хеш таблица Случайный Удаление 0.000000
173 Хеш таблица Случайный Вставка 0.002301
174 Хеш таблица Случайный Поиск 0.000503
175 Хеш таблица Случайный Удаление 0.000000
176 Хеш таблица Случайный Вставка 0.002568
177 Хеш таблица Случайный Поиск 0.000000
178 Хеш таблица Случайный Удаление 0.000000
179 Хеш таблица Случайный Вставка 0.002006
180 Хеш таблица Случайный Поиск 0.000000
181 Хеш таблица Случайный Удаление 0.000000
182 Хеш таблица Случайный Вставка 0.003140
183 Хеш таблица Случайный Поиск 0.000000
184 Хеш таблица Случайный Удаление 0.000000
185 Хеш таблица Случайный Вставка 0.002015
186 Хеш таблица Случайный Поиск 0.001009
187 Хеш таблица Случайный Удаление 0.000000
188 Хеш таблица Случайный Вставка (среднее) 0.002554
189 Хеш таблица Случайный Поиск (среднее) 0.000126
190 Хеш таблица Случайный Удаление (среднее) 0.000000
191 Хеш таблица Отсортированный Вставка 0.001504
192 Хеш таблица Отсортированный Поиск 0.000000
193 Хеш таблица Отсортированный Удаление 0.000000
194 Хеш таблица Отсортированный Вставка 0.003014
195 Хеш таблица Отсортированный Поиск 0.000000
196 Хеш таблица Отсортированный Удаление 0.000000
197 Хеш таблица Отсортированный Вставка 0.002020
198 Хеш таблица Отсортированный Поиск 0.000000
199 Хеш таблица Отсортированный Удаление 0.000000
200 Хеш таблица Отсортированный Вставка 0.001503
201 Хеш таблица Отсортированный Поиск 0.000000
202 Хеш таблица Отсортированный Удаление 0.000000
203 Хеш таблица Отсортированный Вставка 0.002023
204 Хеш таблица Отсортированный Поиск 0.000000
205 Хеш таблица Отсортированный Удаление 0.000503
206 Хеш таблица Отсортированный Вставка 0.001509
207 Хеш таблица Отсортированный Поиск 0.000000
208 Хеш таблица Отсортированный Удаление 0.000000
209 Хеш таблица Отсортированный Вставка 0.002282
210 Хеш таблица Отсортированный Поиск 0.000000
211 Хеш таблица Отсортированный Удаление 0.000000
212 Хеш таблица Отсортированный Вставка 0.002008
213 Хеш таблица Отсортированный Поиск 0.000000
214 Хеш таблица Отсортированный Удаление 0.000000
215 Хеш таблица Отсортированный Вставка 0.003019
216 Хеш таблица Отсортированный Поиск 0.000000
217 Хеш таблица Отсортированный Удаление 0.000000
218 Хеш таблица Отсортированный Вставка 0.001504
219 Хеш таблица Отсортированный Поиск 0.000000
220 Хеш таблица Отсортированный Удаление 0.000000
221 Хеш таблица Отсортированный Вставка 0.002523
222 Хеш таблица Отсортированный Поиск 0.000000
223 Хеш таблица Отсортированный Удаление 0.000000
224 Хеш таблица Отсортированный Вставка 0.002006
225 Хеш таблица Отсортированный Поиск 0.001000
226 Хеш таблица Отсортированный Удаление 0.000000
227 Хеш таблица Отсортированный Вставка 0.001503
228 Хеш таблица Отсортированный Поиск 0.000000
229 Хеш таблица Отсортированный Удаление 0.001148
230 Хеш таблица Отсортированный Вставка 0.001504
231 Хеш таблица Отсортированный Поиск 0.000000
232 Хеш таблица Отсортированный Удаление 0.000000
233 Хеш таблица Отсортированный Вставка 0.002013
234 Хеш таблица Отсортированный Поиск 0.000000
235 Хеш таблица Отсортированный Удаление 0.000000
236 Хеш таблица Отсортированный Вставка 0.001002
237 Хеш таблица Отсортированный Поиск 0.000000
238 Хеш таблица Отсортированный Удаление 0.000000
239 Хеш таблица Отсортированный Вставка 0.003522
240 Хеш таблица Отсортированный Поиск 0.000000
241 Хеш таблица Отсортированный Удаление 0.000000
242 Хеш таблица Отсортированный Вставка 0.001008
243 Хеш таблица Отсортированный Поиск 0.000000
244 Хеш таблица Отсортированный Удаление 0.000000
245 Хеш таблица Отсортированный Вставка 0.002546
246 Хеш таблица Отсортированный Поиск 0.000000
247 Хеш таблица Отсортированный Удаление 0.000000
248 Хеш таблица Отсортированный Вставка 0.001001
249 Хеш таблица Отсортированный Поиск 0.000000
250 Хеш таблица Отсортированный Удаление 0.000000
251 Хеш таблица Отсортированный Вставка (среднее) 0.001951
252 Хеш таблица Отсортированный Поиск (среднее) 0.000050
253 Хеш таблица Отсортированный Удаление (среднее) 0.000083
254 Бинарное дерево поиска Случайный Вставка 0.003507
255 Бинарное дерево поиска Случайный Поиск 0.001002
256 Бинарное дерево поиска Случайный Удаление 0.000000
257 Бинарное дерево поиска Случайный Вставка 0.004530
258 Бинарное дерево поиска Случайный Поиск 0.000000
259 Бинарное дерево поиска Случайный Удаление 0.000000
260 Бинарное дерево поиска Случайный Вставка 0.004086
261 Бинарное дерево поиска Случайный Поиск 0.000000
262 Бинарное дерево поиска Случайный Удаление 0.000000
263 Бинарное дерево поиска Случайный Вставка 0.004518
264 Бинарное дерево поиска Случайный Поиск 0.000000
265 Бинарное дерево поиска Случайный Удаление 0.000000
266 Бинарное дерево поиска Случайный Вставка 0.005591
267 Бинарное дерево поиска Случайный Поиск 0.000000
268 Бинарное дерево поиска Случайный Удаление 0.000000
269 Бинарное дерево поиска Случайный Вставка 0.004526
270 Бинарное дерево поиска Случайный Поиск 0.000000
271 Бинарное дерево поиска Случайный Удаление 0.001503
272 Бинарное дерево поиска Случайный Вставка 0.004028
273 Бинарное дерево поиска Случайный Поиск 0.000000
274 Бинарное дерево поиска Случайный Удаление 0.000000
275 Бинарное дерево поиска Случайный Вставка 0.004618
276 Бинарное дерево поиска Случайный Поиск 0.000000
277 Бинарное дерево поиска Случайный Удаление 0.001503
278 Бинарное дерево поиска Случайный Вставка 0.006937
279 Бинарное дерево поиска Случайный Поиск 0.001400
280 Бинарное дерево поиска Случайный Удаление 0.000000
281 Бинарное дерево поиска Случайный Вставка 0.006121
282 Бинарное дерево поиска Случайный Поиск 0.000000
283 Бинарное дерево поиска Случайный Удаление 0.001001
284 Бинарное дерево поиска Случайный Вставка 0.007520
285 Бинарное дерево поиска Случайный Поиск 0.000000
286 Бинарное дерево поиска Случайный Удаление 0.001006
287 Бинарное дерево поиска Случайный Вставка 0.005534
288 Бинарное дерево поиска Случайный Поиск 0.001001
289 Бинарное дерево поиска Случайный Удаление 0.000000
290 Бинарное дерево поиска Случайный Вставка 0.003024
291 Бинарное дерево поиска Случайный Поиск 0.000000
292 Бинарное дерево поиска Случайный Удаление 0.000000
293 Бинарное дерево поиска Случайный Вставка 0.007068
294 Бинарное дерево поиска Случайный Поиск 0.000000
295 Бинарное дерево поиска Случайный Удаление 0.001003
296 Бинарное дерево поиска Случайный Вставка 0.004552
297 Бинарное дерево поиска Случайный Поиск 0.000000
298 Бинарное дерево поиска Случайный Удаление 0.000000
299 Бинарное дерево поиска Случайный Вставка 0.004518
300 Бинарное дерево поиска Случайный Поиск 0.000000
301 Бинарное дерево поиска Случайный Удаление 0.000000
302 Бинарное дерево поиска Случайный Вставка 0.003011
303 Бинарное дерево поиска Случайный Поиск 0.000000
304 Бинарное дерево поиска Случайный Удаление 0.000000
305 Бинарное дерево поиска Случайный Вставка 0.004291
306 Бинарное дерево поиска Случайный Поиск 0.000000
307 Бинарное дерево поиска Случайный Удаление 0.000000
308 Бинарное дерево поиска Случайный Вставка 0.004562
309 Бинарное дерево поиска Случайный Поиск 0.000000
310 Бинарное дерево поиска Случайный Удаление 0.001002
311 Бинарное дерево поиска Случайный Вставка 0.003511
312 Бинарное дерево поиска Случайный Поиск 0.001003
313 Бинарное дерево поиска Случайный Удаление 0.000000
314 Бинарное дерево поиска Случайный Вставка (среднее) 0.004803
315 Бинарное дерево поиска Случайный Поиск (среднее) 0.000220
316 Бинарное дерево поиска Случайный Удаление (среднее) 0.000351
317 Бинарное дерево поиска Отсортированный Вставка 0.900417
318 Бинарное дерево поиска Отсортированный Поиск 0.052424
319 Бинарное дерево поиска Отсортированный Удаление 0.061880
320 Бинарное дерево поиска Отсортированный Вставка 0.889120
321 Бинарное дерево поиска Отсортированный Поиск 0.053632
322 Бинарное дерево поиска Отсортированный Удаление 0.062189
323 Бинарное дерево поиска Отсортированный Вставка 0.881248
324 Бинарное дерево поиска Отсортированный Поиск 0.055152
325 Бинарное дерево поиска Отсортированный Удаление 0.061669
326 Бинарное дерево поиска Отсортированный Вставка 0.885030
327 Бинарное дерево поиска Отсортированный Поиск 0.055543
328 Бинарное дерево поиска Отсортированный Удаление 0.062420
329 Бинарное дерево поиска Отсортированный Вставка 0.891156
330 Бинарное дерево поиска Отсортированный Поиск 0.056153
331 Бинарное дерево поиска Отсортированный Удаление 0.062845
332 Бинарное дерево поиска Отсортированный Вставка 0.891750
333 Бинарное дерево поиска Отсортированный Поиск 0.058122
334 Бинарное дерево поиска Отсортированный Удаление 0.062453
335 Бинарное дерево поиска Отсортированный Вставка 0.888773
336 Бинарное дерево поиска Отсортированный Поиск 0.055758
337 Бинарное дерево поиска Отсортированный Удаление 0.061916
338 Бинарное дерево поиска Отсортированный Вставка 0.888226
339 Бинарное дерево поиска Отсортированный Поиск 0.051592
340 Бинарное дерево поиска Отсортированный Удаление 0.063321
341 Бинарное дерево поиска Отсортированный Вставка 0.880372
342 Бинарное дерево поиска Отсортированный Поиск 0.053502
343 Бинарное дерево поиска Отсортированный Удаление 0.063089
344 Бинарное дерево поиска Отсортированный Вставка 0.889972
345 Бинарное дерево поиска Отсортированный Поиск 0.055111
346 Бинарное дерево поиска Отсортированный Удаление 0.062310
347 Бинарное дерево поиска Отсортированный Вставка 0.882075
348 Бинарное дерево поиска Отсортированный Поиск 0.055492
349 Бинарное дерево поиска Отсортированный Удаление 0.062256
350 Бинарное дерево поиска Отсортированный Вставка 0.884940
351 Бинарное дерево поиска Отсортированный Поиск 0.056025
352 Бинарное дерево поиска Отсортированный Удаление 0.062441
353 Бинарное дерево поиска Отсортированный Вставка 0.881076
354 Бинарное дерево поиска Отсортированный Поиск 0.051258
355 Бинарное дерево поиска Отсортированный Удаление 0.061709
356 Бинарное дерево поиска Отсортированный Вставка 0.882319
357 Бинарное дерево поиска Отсортированный Поиск 0.053783
358 Бинарное дерево поиска Отсортированный Удаление 0.061596
359 Бинарное дерево поиска Отсортированный Вставка 0.890215
360 Бинарное дерево поиска Отсортированный Поиск 0.051424
361 Бинарное дерево поиска Отсортированный Удаление 0.063194
362 Бинарное дерево поиска Отсортированный Вставка 0.886962
363 Бинарное дерево поиска Отсортированный Поиск 0.054314
364 Бинарное дерево поиска Отсортированный Удаление 0.062138
365 Бинарное дерево поиска Отсортированный Вставка 0.887173
366 Бинарное дерево поиска Отсортированный Поиск 0.055819
367 Бинарное дерево поиска Отсортированный Удаление 0.064069
368 Бинарное дерево поиска Отсортированный Вставка 0.884293
369 Бинарное дерево поиска Отсортированный Поиск 0.052575
370 Бинарное дерево поиска Отсортированный Удаление 0.063521
371 Бинарное дерево поиска Отсортированный Вставка 0.888483
372 Бинарное дерево поиска Отсортированный Поиск 0.053261
373 Бинарное дерево поиска Отсортированный Удаление 0.062347
374 Бинарное дерево поиска Отсортированный Вставка 0.889441
375 Бинарное дерево поиска Отсортированный Поиск 0.050554
376 Бинарное дерево поиска Отсортированный Удаление 0.062955
377 Бинарное дерево поиска Отсортированный Вставка (среднее) 0.887152
378 Бинарное дерево поиска Отсортированный Поиск (среднее) 0.054075
379 Бинарное дерево поиска Отсортированный Удаление (среднее) 0.062516

View File

@ -0,0 +1,288 @@
package main
import (
"fmt"
"math/rand"
csvwriter "source/pkg/csv_writer"
ds "source/pkg/data_struct"
dg "source/pkg/gen_data"
bst "source/pkg/structures/bin_search_tree"
ht "source/pkg/structures/hash_table"
ll "source/pkg/structures/linked_list"
// csv "source/pkg/csv_ri"
"time"
)
const (
countUsers = 20_000
countRepeat = 20
countRandomSearch = 1000
countNotExitstSearch = 500
countDeletes = 1000
)
type TestData struct {
Items []ds.MyData // все записи
ItemsSorted []ds.MyData // все записи отсортированные
Search []ds.MyData // для поиска (существующие и несуществующие)
ToDelete []ds.MyData // для удаления
UniqueItems []ds.MyData // Уникальные элементы для тестов
}
type DataStructure interface {
Insert(data ds.MyData)
InsertAll(data []ds.MyData)
Search(name string) (string, bool)
Delete(name string) bool
Len() int
}
// Создатели структур
type StructureFactory func() DataStructure
func NewLinkedList() DataStructure {
return ll.NewLinkedList()
}
func NewHashTable() DataStructure {
return ht.NewHashTable(256, 0.75)
}
func NewBinSearchTree() DataStructure {
return bst.NewBinSearchTree()
}
func uniqueElements(data []ds.MyData) []ds.MyData {
res := make([]ds.MyData, 0, len(data))
for _, el := range data {
isUnique := true
for _, resEl := range res {
if el == resEl {
isUnique = false
break
}
}
if isUnique {
res = append(res, el)
}
}
return res
}
func GenerateTestData() TestData {
items := dg.RecordsShuffled(countUsers)
// fmt.Println("isSorted:", isSorted(items))
itemsSort := ds.QSort(items, 0, len(items)-1)
uniqueItems := uniqueElements(items)
existing := make([]ds.MyData, countRandomSearch)
// notExisting := [countNotExitstSearch]ds.MyData{}
notExisting := make([]ds.MyData, countNotExitstSearch)
toDelete := make([]ds.MyData, countDeletes)
countUniq := len(uniqueItems)
for i := 0; i < countRandomSearch; i++ {
// randInd := rand.Intn(countUsers)
randInd := rand.Intn(countUniq)
existing[i] = uniqueItems[randInd]
// fmt.Println(randInd)
}
for i := 0; i < countNotExitstSearch; i++ {
// randInd := rand.Intn(countUsers)
randInd := rand.Intn(10)
name := fmt.Sprintf("User_%d", randInd)
notExisting[i] = *ds.NewData(name, "")
// fmt.Println(randInd)
}
for _, el := range notExisting {
existing = append(existing, el)
}
// toDelete = make([]ds.MyData, countDeletes)
usedIndices := make(map[int]bool)
for i := 0; i < countDeletes; i++ {
var randInd int
for {
randInd = rand.Intn(countUniq)
if !usedIndices[randInd] {
usedIndices[randInd] = true
break
}
}
toDelete[i] = uniqueItems[randInd]
}
return TestData{
Items: items,
ItemsSorted: itemsSort,
Search: existing,
ToDelete: toDelete,
UniqueItems: uniqueItems,
}
}
// Тест вставки массива данных (один раз)
func testOnesInsert(structure DataStructure, data []ds.MyData) float64 {
start := time.Now()
for _, item := range data {
structure.Insert(item)
}
return time.Since(start).Seconds()
}
// Тест поиска массива данных (один раз)
func testOnesSearch(structure DataStructure, data []ds.MyData) float64 {
start := time.Now()
// flag := true
for _, item := range data {
structure.Search(item.Name)
// p, ok := structure.Search(item.Name)
// if flag {
// flag = ((p == item.Phone) == ok)
// }
}
// fmt.Println(flag)
return time.Since(start).Seconds()
}
// Тест удаления массива данных (один раз)
func testOnesDelete(structure DataStructure, data []ds.MyData) float64 {
start := time.Now()
for _, item := range data {
structure.Delete(item.Name)
}
return time.Since(start).Seconds()
}
func testForData(nameStruct, mode string, factory StructureFactory, data_insert, data_search, data_delete []ds.MyData) {
BenchRes := make([]csvwriter.BenchmarkResult, 0, countRepeat*3+3) // Массив строк отчёта
averageTimeInsert := 0.
averageTimeSearch := 0.
averageTimeDelete := 0.
for iteration := 0; iteration < countRepeat; iteration++ {
structure := factory()
insertTime := testOnesInsert(structure, data_insert)
averageTimeInsert += insertTime
// Отладочная информация для бинарного дерева (проверка на вырождение)
if bst, ok := structure.(*bst.BinSearchTree); ok {
fmt.Printf(
"Высота дерева: %d, элементов: %d\n",
bst.Height(), bst.Len(),
)
}
BenchRes = append(BenchRes, csvwriter.BenchmarkResult{
Structure: nameStruct,
Mode: mode,
Operation: "Вставка",
Time: insertTime,
})
searchTime := testOnesSearch(structure, data_search)
averageTimeSearch += searchTime
BenchRes = append(BenchRes, csvwriter.BenchmarkResult{
Structure: nameStruct,
Mode: mode,
Operation: "Поиск",
Time: searchTime,
})
deleteTime := testOnesDelete(structure, data_delete)
averageTimeDelete += deleteTime
BenchRes = append(BenchRes, csvwriter.BenchmarkResult{
Structure: nameStruct,
Mode: mode,
Operation: "Удаление",
Time: deleteTime,
})
fmt.Printf("%s | Вставка | %s | Время: %f\n", nameStruct, mode, insertTime)
fmt.Printf("%s | Поиск | %s | Время: %f\n", nameStruct, mode, searchTime)
fmt.Printf("%s | Удаление | %s | Время: %.9f\n", nameStruct, mode, deleteTime)
}
averageTimeInsert /= countRepeat
averageTimeSearch /= countRepeat
averageTimeDelete /= countRepeat
BenchRes = append(BenchRes, csvwriter.BenchmarkResult{
Structure: nameStruct,
Mode: mode,
Operation: "Вставка (среднее)",
Time: averageTimeInsert,
})
BenchRes = append(BenchRes, csvwriter.BenchmarkResult{
Structure: nameStruct,
Mode: mode,
Operation: "Поиск (среднее)",
Time: averageTimeSearch,
})
BenchRes = append(BenchRes, csvwriter.BenchmarkResult{
Structure: nameStruct,
Mode: mode,
Operation: "Удаление (среднее)",
Time: averageTimeDelete,
})
fmt.Printf("%s | Вставка | %s | Время (среднее): %f\n", nameStruct, mode, averageTimeInsert)
fmt.Printf("%s | Поиск | %s | Время (среднее): %f\n", nameStruct, mode, averageTimeSearch)
fmt.Printf("%s | Удаление | %s | Время (среднее): %f\n", nameStruct, mode, averageTimeDelete)
csvwriter.AppendRaw(BenchRes)
}
func isSorted(data []ds.MyData) bool {
for i := 0; i < len(data)-1; i++ {
if data[i].Name > data[i+1].Name {
return false
}
}
return true
}
func Test(nameStruct string, factory StructureFactory) {
data := GenerateTestData()
// fmt.Println("items", isSorted(data.Items))
// fmt.Println("items sort", isSorted(data.ItemsSorted))
testForData(nameStruct, "Случайный", factory, data.Items, data.Search, data.ToDelete)
testForData(nameStruct, "Отсортированный", factory, data.ItemsSorted, data.Search, data.ToDelete)
}
func main() {
csvwriter.CreateEmptyCSV("results", "benchmarks.csv")
fmt.Println("============= Начало тестов =============")
Test("Связный список", NewLinkedList)
Test("Хеш таблица", NewHashTable)
Test("Бинарное дерево поиска", NewBinSearchTree)
// fmt.Println("User_0001" < "User_00100")
// fmt.Println(isSorted(dg.RecordsShuffled(10000)))
}

View File

@ -0,0 +1,50 @@
package main
import (
"bufio"
"fmt"
"os"
ds "source/pkg/data_struct"
bst "source/pkg/structures/bin_search_tree"
)
const (
countNumbers = 64
)
func pressEnterToContinue() {
fmt.Print("Нажмите Enter для продолжения...")
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
// isInArr проверяет, содержится ли target в срезе arr[:len]
func isInArr(arr []int, length int, target int) bool {
for i := 0; i < length; i++ {
if arr[i] == target {
return true
}
}
return false
}
func main() {
fmt.Println("hello world!")
head := bst.NewBinSearchTree()
for i := 1; i <= 20; i++ {
name := fmt.Sprintf("User_%02d", i)
phone := fmt.Sprintf("Phone_%02d", i)
head.Insert(*ds.NewData(name, phone))
}
head.BstInorderTraversal()
head.Delete("User_05")
fmt.Println("Удаляем User_05")
head.BstInorderTraversal()
fmt.Println(head.Search("User_07"))
}

View File

@ -0,0 +1,19 @@
package main
import (
"fmt"
csvwriter "source/pkg/csv_writer"
)
func main() {
// Простой способ
results := []csvwriter.BenchmarkResult{
{Structure: "HashTable", Mode: "Chaining", Operation: "Insert", Time: 0.001234},
{Structure: "LinkedList", Mode: "Singly", Operation: "Search", Time: 0.005678},
{Structure: "BSTree", Mode: "Recursive", Operation: "Delete", Time: 0.003456},
}
if err := csvwriter.AppendRaw(results); err != nil {
fmt.Printf("Ошибка: %v\n", err)
}
}

View File

@ -0,0 +1,90 @@
package main
import (
"fmt"
// hash_table "hash-table-task/hash-table"
ds "source/pkg/data_struct"
ht "source/pkg/structures/hash_table"
)
/*
1. Сконструировать и реализовать свою хеш таблицу
- изначальный размер 8, коэф-т загрузки 0.75
- Преобразование подаваемого данного в индекс с помощью хеш функции(в ручну) пример: полиномиальный хеш
- Коллизии обрабатываются методом цепочек, каждая корзина таблицы - список в котором хранятся пары значений key-value
- При превышении коэф-та загрузки происходит перехеширование таблицы, размер увеличивается вдвое, все пары заново вставляются в таблицу.
2. Читаем текстовый файл, разбивает на слова, приводим к нижнему регистру, подсчитываем повторения каждого слова: key - слово, value - кол-во повторений
- На вывод 10 самых встречающихся слов, для каждого слова выводим: ind(hash), key, value
- Текст - первая глава, первые три стиха Евгений Онегин
*/
func main() {
fmt.Println("hello world")
head := ht.NewHashTable(8, 0.75)
for i := 1; i <= 40; i++ {
name := fmt.Sprintf("User_%02d", i)
phone := fmt.Sprintf("Phone_%02d", i)
head.Insert(*ds.NewData(name, phone))
}
head.Print()
head.Delete("User_05")
fmt.Println("Удаляем User_05")
head.Print()
fmt.Println(head.Search("User_07"))
// Чтение всего файла
// const filePath = "../data/onegin.txt"
// // const filePath = "../data/onegin_full.txt"
// data, err := os.ReadFile(filePath)
// text := string(data)
// if err != nil {
// fmt.Println("Ошибка чтения файла:", err)
// return
// }
// fmt.Println(text)
// text = strings.ToLower(text)
// // Разбиение на слова (разделители: пробелы и переводы строк)
// re := regexp.MustCompile(`[\p{L}\p{N}-]+`)
// words := re.FindAllString(text, -1)
// fmt.Printf("Найдено слов: %d\n", len(words))
// for i, word := range words {
// fmt.Printf("Слово %d: %s\n", i+1, word)
// }
// hashTable := ht.NewHashTable(8, 0.95)
// for i, word := range words {
// fmt.Printf("%d : %s\n", i, word)
// hashTable.Put(word, 1)
// }
// fmt.Println("\nХеш таблица текста: ")
// hashTable.Print()
// // fmt.Println("Отсортированные ячейки таблицы: ")
// // hashTable.PrintSort()
// fmt.Println("\nСамые часто встречающиеся слова: ")
// // hashTable.PrintMostPopularWords(10)
}

View File

@ -0,0 +1,52 @@
package main
import (
"bufio"
"fmt"
"os"
ds "source/pkg/data_struct"
// rs "source/pkg/resulter"
ll "source/pkg/structures/linked_list"
)
func isInArr(arr []int, length int, target int) bool {
for i := 0; i < length; i++ {
if arr[i] == target {
return true
}
}
return false
}
func Razdelitel() {
for i := 0; i < 20; i++ {
fmt.Print("-")
}
fmt.Println()
}
func pressEnterToContinue() {
fmt.Print("Нажмите Enter для продолжения...")
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
func main() {
fmt.Println("hello world!")
head := ll.NewLinkedList()
for i := 1; i <= 20; i++ {
name := fmt.Sprintf("User_%02d", i)
phone := fmt.Sprintf("Phone_%02d", i)
head.Insert(*ds.NewData(name, phone))
}
head.PrintAll()
head.Delete("User_05")
head.PrintAll()
fmt.Println(head.Search("User_07"))
}