#include "bst/bst.h" #include "list/list.h" #include #include #include #include #include void measureList(std::set *sequence, FILE *file){ float buildTime = 0, searchTime = 0, deleteTime = 0; for (int i = 0; i < 10; i++) { std::cout << "- Running list " << i + 1 << "/10\r"; fflush(stdout); // Measure build time auto start = std::chrono::high_resolution_clock::now(); List *head = nullptr; for (int value : *sequence) { head = insert(head, value); } auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration elapsed_seconds = end - start; buildTime += elapsed_seconds.count() * 1000; // Convert to milliseconds // Now we run the search start = std::chrono::high_resolution_clock::now(); for (int value : *sequence) { search(head, value); } end = std::chrono::high_resolution_clock::now(); elapsed_seconds = end - start; searchTime += elapsed_seconds.count() * 1000; // Convert to milliseconds // Measure deletion time for list start = std::chrono::high_resolution_clock::now(); while(head != nullptr){ head = remove(head); } end = std::chrono::high_resolution_clock::now(); elapsed_seconds = end - start; deleteTime += elapsed_seconds.count() * 1000; // Convert to milliseconds } buildTime /= 10; searchTime /= 10; deleteTime /= 10; std::cout << "- List built in " << buildTime << "ms | searched in " << searchTime << "ms | deleted in " << deleteTime << "ms" << std::endl; fprintf(file, "List,%f,%f,%f\n", buildTime, searchTime, deleteTime); } void measureBST(std::set *sequence, FILE *file){ float buildTime = 0, searchTime = 0, deleteTime = 0; for (int i = 0; i < 10; i++) { std::cout << "- Running bst " << i + 1 << "/10\r"; fflush(stdout); // Measure build time auto start = std::chrono::high_resolution_clock::now(); Tree *root = nullptr; for (int value : *sequence) { root = insert(root, value); } root = balance(root); auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration elapsed_seconds = end - start; buildTime += elapsed_seconds.count() * 1000; // Convert to milliseconds // Now we run the search start = std::chrono::high_resolution_clock::now(); for (int value : *sequence) { search(root, value); } end = std::chrono::high_resolution_clock::now(); elapsed_seconds = end - start; searchTime += elapsed_seconds.count() * 1000; // Convert to milliseconds // Measure deletion time for tree start = std::chrono::high_resolution_clock::now(); deleteTree(root); end = std::chrono::high_resolution_clock::now(); elapsed_seconds = end - start; deleteTime += elapsed_seconds.count() * 1000; // Convert to milliseconds } buildTime /= 10; searchTime /= 10; deleteTime /= 10; std::cout << "- Tree built in " << buildTime << "ms | searched in " << searchTime << "ms | deleted in " << deleteTime << "ms" << std::endl; fprintf(file, "BST,%f,%f,%f\n", buildTime, searchTime, deleteTime); } int main() { // Init the random number generator std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(1, 1000000); // Open a file for writing results FILE *file = fopen("results.csv", "w"); fprintf(file, "Elements,Structure,BuildTime,SearchTime,DeleteTime\n"); for (int n = 1; n < 26; n++) { std::set sequence; while (sequence.size() < n * 1000) { sequence.insert(dis(gen)); } // Display this like a cascade std::cout << "Running tests for " << n * 1000 << " elements..." << std::endl; measureList(&sequence, file); measureBST(&sequence, file); } fclose(file); return 0; }