diff --git a/FibUpdate.cpp b/FibUpdate.cpp index 54c2223..9c2e39b 100644 --- a/FibUpdate.cpp +++ b/FibUpdate.cpp @@ -4,38 +4,43 @@ constexpr std::size_t NOT_FOUND = static_cast(-1); -std::size_t fibonacciSearch(const std::vector& arr, int x) { - std::size_t fibM2 = 0; // Two elements before current Fibonacci number - std::size_t fibM1 = 1; // One element before current Fibonacci number - std::size_t fibM = fibM2 + fibM1; // Current Fibonacci number - - // Find the smallest Fibonacci number greater than or equal to the array size - while (fibM < arr.size()) { +// Function to calculate Fibonacci numbers +std::size_t calculateFibonacci(std::size_t n) { + if (n <= 1) return n; + std::size_t fibM2 = 0; + std::size_t fibM1 = 1; + std::size_t fibM = fibM2 + fibM1; + for (std::size_t i = 2; i <= n; ++i) { + fibM = fibM1 + fibM2; fibM2 = fibM1; fibM1 = fibM; - fibM = fibM2 + fibM1; } + return fibM; +} + +std::size_t fibonacciSearch(const std::vector& arr, int x) { + std::size_t fibM = 0; + std::size_t offset = NOT_FOUND; - std::size_t offset = NOT_FOUND; // Initialize offset with NOT_FOUND + // Find the smallest Fibonacci number greater than or equal to the array size + while (calculateFibonacci(fibM) < arr.size()) { + fibM++; + } - while (fibM > 1) { - std::size_t i = std::min(offset + fibM2, arr.size() - 1); + while (fibM > 0) { + std::size_t i = std::min(offset + calculateFibonacci(fibM - 2), arr.size() - 1); if (arr[i] < x) { - fibM = fibM1; - fibM1 = fibM2; - fibM2 = fibM - fibM1; + fibM--; offset = i; } else if (arr[i] > x) { - fibM = fibM2; - fibM1 = fibM1 - fibM2; - fibM2 = fibM - fibM1; + fibM -= 2; } else { return i; } } - if (fibM1 && arr[offset + 1] == x) + if (offset < arr.size() - 1 && arr[offset + 1] == x) return offset + 1; return NOT_FOUND; @@ -44,6 +49,12 @@ std::size_t fibonacciSearch(const std::vector& arr, int x) { int main() { std::vector arr = {10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100, 235}; int x = 235; + + if (!std::is_sorted(arr.begin(), arr.end())) { + std::cout << "Array must be sorted for Fibonacci search to work." << std::endl; + return 1; + } + std::size_t ind = fibonacciSearch(arr, x); if (ind != NOT_FOUND)