AVL Tree refactor

This commit is contained in:
IlyaShurupov 2024-04-08 16:16:37 +03:00 committed by Ilya Shurupov
parent 92d8b04cf8
commit db1a6b35ef
8 changed files with 511 additions and 376 deletions

View file

@ -1,5 +1,7 @@
#include <iostream>
#include "Tests.hpp"
#include "Tree.hpp"
#include "Timing.hpp"
using namespace tp;
@ -24,7 +26,7 @@ SUITE(AvlTree) {
TEST(Persistance) {
AvlTree<AvlNumericKey<alni>, TestClass, TestAllocator> tree;
const auto size = 10;
const auto size = 1000;
struct Item {
Item() :
@ -122,4 +124,62 @@ SUITE(AvlTree) {
CHECK(tree.maxNode(tree.head()) == nullptr);
CHECK(tree.minNode(tree.head()) == nullptr);
}
TEST(Speed) {
AvlTree<AvlNumericKey<alni>, TestClass, TestAllocator> tree;
const auto size = 1000000;
struct Item {
Item() :
data(0) {}
bool presents = false;
TestClass data;
};
Item* buff = new Item[size];
for (auto i : Range(size)) {
buff[i].data.setVal(i);
}
Timer insertTime;
ualni loadSize = 0;
while (loadSize < size / 2) {
auto idx = ualni(randomFloat() * (size - 1));
if (!buff[idx].presents) {
tree.insert((alni) buff[idx].data.getVal(), buff[idx].data);
loadSize++;
buff[idx].presents = true;
}
}
std::cout << "AVL Tree Insert Speed " << (double) loadSize / (double) insertTime.timePassed() << "\n";
Timer removeTime;
ualni unloadSize = 0;
while (unloadSize < size / 2) {
auto idx = ualni(randomFloat() * (size - 1));
if (buff[idx].presents) {
tree.remove((alni) buff[idx].data.getVal());
unloadSize++;
buff[idx].presents = false;
}
}
for (auto idx = 0; idx < size; idx++) {
auto& item = buff[idx];
if (item.presents) {
tree.remove((alni) item.data.getVal());
unloadSize++;
item.presents = false;
}
}
std::cout << "AVL Tree Remove Speed " << (double) unloadSize / (double) removeTime.timePassed() << "\n";
delete[] buff;
}
}