From 51c26b85fe1f75e3ca1cd2e756dadf1fc0bf01a6 Mon Sep 17 00:00:00 2001 From: Divide-et-impera-11 <54957167+Divide-et-impera-11@users.noreply.github.com> Date: Sat, 30 Nov 2019 19:58:22 +0100 Subject: [PATCH] Update exponential_search.cpp --- Search/exponential_search.cpp | 45 +++++++++++++---------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/Search/exponential_search.cpp b/Search/exponential_search.cpp index 7a0349917..243c28c8b 100644 --- a/Search/exponential_search.cpp +++ b/Search/exponential_search.cpp @@ -1,50 +1,37 @@ +// Copyright 2020 Divide-et-impera-11 #include #include #include using namespaces std; -//-----------------Binary Search Algorithm(use by Struzik algorithm)----------------- -// Time Complexity O(log n) where 'n' is the number of elements -// Worst Time Complexity O(log n) -// Best Time Complexity O(1) -// Space Complexity O(1) -// Auxiliary Space Complexity O(1) -template inline Type* binary_search(Type *array, size_t size, Type key) {//Parameter List:Pointer to an array|size of array|key what you search - int32_t lower_index(0), upper_index(size - 1),middle_index; //lower_index => start of search range|upper_index => end of search range +template inline Type* binary_search(Type *array, size_t size, Type key){ + int32_t lower_index(0), upper_index(size - 1),middle_index; while (lower_index <= upper_index) { middle_index = floor((lower_index + upper_index) / 2); - if (*(array + middle_index) < key) lower_index = (middle_index + 1); //narrow the search range from up - else if (*(array + middle_index) > key) upper_index = (middle_index - 1);//narrow the search range from down - else return (array + middle_index); //key has been found + if (*(array + middle_index) < key) lower_index = (middle_index + 1); + else if (*(array + middle_index) > key) upper_index = (middle_index - 1); + else return (array + middle_index); } return nullptr; } -//-----------------Struzik Search Algorithm(Exponential)----------------- -// Time Complexity O(log i)where i is the position of the search key in the list -// Worst Time Complexity O(log i) -// Best Time Complexity O(1) -// Space Complexity O(1) -// Auxiliary Space Complexity O(1) -template Type* Struzik_Search(Type* array,size_t size,Type key) { // Parameter List:Pointer to an array|size of array|key what you search - uint32_t block_front(0),block_size = size == 0 ? 0 : 1; //block_front => start of search range|block_size => end of search range - while (block_front != block_size) //if key bigger than last element itt will be equal and return nullptr +template Type* Struzik_Search(Type* array,size_t size,Type key) { + uint32_t block_front(0),block_size = size == 0 ? 0 : 1; + while (block_front != block_size) { - if (*(array + block_size - 1) < key) {//if the key is bigger than the end of block we define a new block what is twice bigger than the previous + if (*(array + block_size - 1) < key) { block_front = block_size; - (block_size * 2 - 1 < size) ? (block_size *= 2) : block_size = size;//if the end of new block bigger than size of array it takes the end of array + (block_size * 2 - 1 < size) ? (block_size *= 2) : block_size = size; continue; } - return binary_search(array + block_front, (block_size - block_front), key);//if delimit the block where the key shold be,do binary search + return binary_search(array + block_front, (block_size - block_front), key); } return nullptr; } int main(){ - // ----------------TEST CASES---------------- int *sorted_array = new int[7]{ 7,10,15,23,70,105,203 }; - assert(Struzik_Search(sorted_array, 7, 0) == nullptr);// Key smaller than the first element of array - assert(Struzik_Search(sorted_array, 7, 1000) == nullptr);// Key bigger than the last element of array - assert(Struzik_Search(sorted_array, 7, 50) == nullptr);// Key between the elemenets of array - assert(Struzik_Search(sorted_array, 7, 7) == sorted_array);// Key is in the array !FOUND! - // ----------------TEST CASES---------------- + assert(Struzik_Search(sorted_array, 7, 0) == nullptr); + assert(Struzik_Search(sorted_array, 7, 1000) == nullptr); + assert(Struzik_Search(sorted_array, 7, 50) == nullptr); + assert(Struzik_Search(sorted_array, 7, 7) == sorted_array); return EXIT_SUCCESS; }