Skip to content

Commit

Permalink
add comments
Browse files Browse the repository at this point in the history
  • Loading branch information
Sergeo-Sss committed Dec 6, 2023
1 parent cab9714 commit 69ff6c1
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 21 deletions.
46 changes: 38 additions & 8 deletions LibraryCPP/binaryHeap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

struct BinaryHeap
{
void** heapData;
size_t heapSize;
size_t dataCount;
Comparator compare;
Destructor destroy;
void** heapData; // Массив указателей для хранения элементов кучи
size_t heapSize; // Максимальное количество элементов, которое может хранить куча
size_t dataCount; // Текущее количество элементов в куче
Comparator compare; // Функция-компаратор для сравнения элементов кучи
Destructor destroy; // Функция-деструктор для удаления элементов
};

BinaryHeap* binaryHeap_create(const size_t size, Comparator comp, Destructor dest)
Expand All @@ -29,52 +29,82 @@ void binaryHeap_swapData(BinaryHeap* heap, const size_t firstIndex, const size_t

void binaryHeap_heapify(BinaryHeap* heap, int i)
{
int left = 2 * i + 1;
int right = 2 * i + 2;
int smallest = i;
// Вычисляем индексы левого и правого дочерних элементов для данного узла
int left = 2 * i + 1; // Индекс левого дочернего элемента
int right = 2 * i + 2; // Индекс правого дочернего элемента
int smallest = i; // Индекс наименьшего элемента, начинаем с текущего узла

// Проверяем, меньше ли левый дочерний элемент текущего узла
// и находится ли он в пределах размера кучи
if (left < (int)heap->dataCount && heap->compare(heap->heapData[left], heap->heapData[smallest]) < 0)
smallest = left;

// Аналогично проверяем правый дочерний элемент
if (right < (int)heap->dataCount && heap->compare(heap->heapData[right], heap->heapData[smallest]) < 0)
smallest = right;

// Если один из дочерних элементов меньше текущего элемента, меняем их местами
if (smallest != i)
{
binaryHeap_swapData(heap, i, smallest);
// Рекурсивно применяем heapify к измененному дочернему элементу
binaryHeap_heapify(heap, smallest);
}
}

void binaryHeap_insert(BinaryHeap* heap, void* node)
{
// Проверяем, не достигнут ли максимальный размер кучи.
// Если достигнут, то новый элемент добавить нельзя.
if (heap->dataCount == heap->heapSize)
return;

// Увеличиваем количество элементов в куче на единицу.
heap->dataCount++;
// Рассчитываем индекс, где будет размещён новый элемент.
size_t i = heap->dataCount - 1;
// Размещаем новый элемент в конец массива кучи.
heap->heapData[i] = node;

// Проходим циклом вверх по куче для восстановления её свойств.
// Пока не достигнут корень кучи и пока родительский элемент больше нового элемента...
while (i != 0 && heap->compare(heap->heapData[(i - 1) / 2], heap->heapData[i]) > 0)
{
// Обмениваем новый элемент с его родителем.
binaryHeap_swapData(heap, (i - 1) / 2, i);
// Перемещаем индекс на позицию родительского элемента.
i = (i - 1) / 2;
}
}

void* binaryHeap_extractMin(BinaryHeap* heap)
{
// Проверяем, есть ли элементы в куче. Если нет, возвращаем NULL.
if (heap->dataCount <= 0)
return NULL;

// Если в куче только один элемент, уменьшаем количество элементов
// и возвращаем этот единственный элемент.
if (heap->dataCount == 1)
{
heap->dataCount--;
return heap->heapData[0];
}

// Сохраняем корневой элемент (минимальный элемент кучи) для последующего возвращения.
void* root = heap->heapData[0];

// Заменяем корневой элемент последним элементом в куче.
heap->heapData[0] = heap->heapData[heap->dataCount - 1];

// Уменьшаем количество элементов в куче на единицу.
heap->dataCount--;

// Применяем процедуру "heapify" начиная с корня, чтобы восстановить свойства кучи
// и убедиться, что все родительские элементы меньше своих дочерних.
binaryHeap_heapify(heap, 0);

// Возвращаем изначальный корневой элемент, который является минимальным элементом кучи.
return root;
}

Expand Down
40 changes: 27 additions & 13 deletions LibraryCPP/huffmanTree.cpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
#include "huffmanTree.h"

Check notice on line 1 in LibraryCPP/huffmanTree.cpp

View workflow job for this annotation

GitHub Actions / cpp-linter

Run clang-format on LibraryCPP/huffmanTree.cpp

File LibraryCPP/huffmanTree.cpp does not conform to Custom style guidelines. (lines 4, 5, 6, 7, 8, 10, 11, 15, 16, 17, 18, 19, 20, 21, 22, 27, 28, 29, 30, 31, 32, 33, 38, 39, 44, 45, 50, 51, 56, 57, 62, 63, 64, 68, 69, 70, 74, 75, 80, 81, 82, 83, 84, 85, 86, 87, 92, 93, 94, 95, 97, 98, 99, 100, 105, 106, 107, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125)

// Ñòðóêòóðà óçëà äåðåâà Õàôôìàíà
struct HuffmanNode
{
bool isLeaf;
unsigned long long int weight;
unsigned char symbol;
bool isLeaf; // Ôëàã, óêàçûâàþùèé, ÿâëÿåòñÿ ëè óçåë ëèñòîì
unsigned long long int weight; // Âåñ óçëà, èñïîëüçóåòñÿ äëÿ ïîñòðîåíèÿ äåðåâà
unsigned char symbol; // Ñèìâîë, ñîîòâåòñòâóþùèé óçëó (òîëüêî äëÿ ëèñòüåâ)

HuffmanNode* leftNode;
HuffmanNode* rightNode;
HuffmanNode* leftNode; // Óêàçàòåëü íà ëåâûé äî÷åðíèé óçåë
HuffmanNode* rightNode; // Óêàçàòåëü íà ïðàâûé äî÷åðíèé óçåë
};

// Ôóíêöèÿ äëÿ ñîçäàíèÿ ëèñòîâîãî óçëà
HuffmanNode* huffman_createLeafNode(unsigned char symbol, unsigned long long int weight)
{
HuffmanNode* node = new HuffmanNode;
Expand All @@ -21,6 +23,7 @@ HuffmanNode* huffman_createLeafNode(unsigned char symbol, unsigned long long int
return node;
}

// Ôóíêöèÿ äëÿ ñîçäàíèÿ âíóòðåííåãî óçëà
HuffmanNode* huffman_createInternalNode(HuffmanNode* leftNode, HuffmanNode* rightNode)
{
HuffmanNode* node = new HuffmanNode;
Expand All @@ -31,52 +34,61 @@ HuffmanNode* huffman_createInternalNode(HuffmanNode* leftNode, HuffmanNode* righ
return node;
}

// Ïîëó÷åíèå ëåâîãî äî÷åðíåãî óçëà
HuffmanNode* huffman_getLeftNode(HuffmanNode* node)
{
return node ? node->leftNode : NULL;
}

// Ïîëó÷åíèå ïðàâîãî äî÷åðíåãî óçëà
HuffmanNode* huffman_getRightNode(HuffmanNode* node)
{
return node ? node->rightNode : NULL;
}

// Óñòàíîâêà ëåâîãî äî÷åðíåãî óçëà
void huffman_setLeftNode(HuffmanNode* node, HuffmanNode* newNode)
{
node->leftNode = node->leftNode ? node->leftNode : newNode;
}

// Óñòàíîâêà ïðàâîãî äî÷åðíåãî óçëà
void huffman_setRightNode(HuffmanNode* node, HuffmanNode* newNode)
{
node->rightNode = node->rightNode ? node->rightNode : newNode;
}

// Ïðîâåðêà, ÿâëÿåòñÿ ëè óçåë ëèñòîì
bool huffman_nodeIsLeaf(HuffmanNode* node)
{
return node->isLeaf;
}

// Ïîëó÷åíèå ñèìâîëà èç óçëà
unsigned char huffman_getNodeChar(HuffmanNode* node)
{
return node->symbol;
}

// Ïîëó÷åíèå âåñà óçëà
unsigned long long int huffman_getNodeWeight(HuffmanNode* node)
{
return node->weight;
}

// Óäàëåíèå äåðåâà Õàôôìàíà (ðåêóðñèâíàÿ ôóíêöèÿ)
HuffmanNode* huffman_deleteTree(HuffmanNode* node)
{
if (node)
{
huffman_deleteTree(node->leftNode);
huffman_deleteTree(node->rightNode);
delete node;
huffman_deleteTree(node->leftNode); // Óäàëåíèå ëåâîãî ïîääåðåâà
huffman_deleteTree(node->rightNode); // Óäàëåíèå ïðàâîãî ïîääåðåâà
delete node; // Óäàëåíèå òåêóùåãî óçëà
}
return nullptr;
}

// Êîìïàðàòîð äëÿ óçëîâ (èñïîëüçóåòñÿ â î÷åðåäè ñ ïðèîðèòåòîì)
int huffmanNodeComparator(const void* nodeA, const void* nodeB)
{
HuffmanNode* huffmanNodeA = (HuffmanNode*)nodeA;

Check warning on line 94 in LibraryCPP/huffmanTree.cpp

View workflow job for this annotation

GitHub Actions / cpp-linter

/LibraryCPP/huffmanTree.cpp:94:33 [cppcoreguidelines-pro-type-cstyle-cast]

do not use C-style cast to convert between unrelated types
Expand All @@ -89,24 +101,26 @@ int huffmanNodeComparator(const void* nodeA, const void* nodeB)
return 0;
}

// Äåñòðóêòîð äëÿ óçëîâ (èñïîëüçóåòñÿ â î÷åðåäè ñ ïðèîðèòåòîì)
void huffmanNodeDestructor(void* node)
{
HuffmanNode* huffmanNode = (HuffmanNode*)node;

Check warning on line 107 in LibraryCPP/huffmanTree.cpp

View workflow job for this annotation

GitHub Actions / cpp-linter

/LibraryCPP/huffmanTree.cpp:107:32 [cppcoreguidelines-pro-type-cstyle-cast]

do not use C-style cast to convert between unrelated types
huffman_deleteTree(huffmanNode);
}

// Ôóíêöèÿ äëÿ ïå÷àòè äåðåâà Õàôôìàíà (äëÿ îòëàäêè)
void huffman_printTree(HuffmanNode* node, unsigned int height)
{
if (node)
{
huffman_printTree(node->rightNode, height + 1);
for (unsigned int i = 0; i < height; i++)
huffman_printTree(node->rightNode, height + 1); // Ïå÷àòü ïðàâîãî ïîääåðåâà
for (unsigned int i = 0; i < height; i++) // Îòñòóï äëÿ âèçóàëèçàöèè óðîâíÿ
std::cout << " ";
if (node->isLeaf)
std::cout << (unsigned char)node->symbol;
std::cout << (unsigned char)node->symbol; // Ïå÷àòü ñèìâîëà ëèñòà
else
std::cout << node->weight;
huffman_printTree(node->leftNode, height + 1);
std::cout << node->weight; // Ïå÷àòü âåñà âíóòðåííåãî óçëà
huffman_printTree(node->leftNode, height + 1); // Ïå÷àòü ëåâîãî ïîääåðåâà
}
else
std::cout << std::endl;
Expand Down

0 comments on commit 69ff6c1

Please sign in to comment.