Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 29 additions & 18 deletions FibUpdate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,38 +4,43 @@

constexpr std::size_t NOT_FOUND = static_cast<std::size_t>(-1);

std::size_t fibonacciSearch(const std::vector<int>& 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<int>& 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;
Expand All @@ -44,6 +49,12 @@ std::size_t fibonacciSearch(const std::vector<int>& arr, int x) {
int main() {
std::vector<int> 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)
Expand Down