diff --git a/allalgorithms/searches/__init__.py b/allalgorithms/searches/__init__.py index 9f9d0fa..1f1caa6 100644 --- a/allalgorithms/searches/__init__.py +++ b/allalgorithms/searches/__init__.py @@ -1,2 +1,3 @@ from .binary_search import * +from .fibonacci_search import * from .jump_search import * diff --git a/allalgorithms/searches/fibonacci_search.py b/allalgorithms/searches/fibonacci_search.py new file mode 100644 index 0000000..0d9aa01 --- /dev/null +++ b/allalgorithms/searches/fibonacci_search.py @@ -0,0 +1,35 @@ +# -*- coding: UTF-8 -*- +# +# Fibonacci search works for a sorted array. +# The All â–²lgorithms library for python +# +# Contributed by: dieterpl +# Github: @dieterpl +# + + +def fibonacci_search(arr, query): + fib2, fib1 = 0, 1 + fib = fib2 + fib1 + hi = len(arr) - 1 + while fib <= hi: + fib2 = fib1 + fib1 = fib + fib = fib2 + fib1 + offset = -1 + while fib > 1: + i = min(offset + fib2, hi) + if arr[i] < query: + fib = fib1 + fib1 = fib2 + fib2 = fib - fib1 + offset = i + elif arr[i] > query: + fib = fib2 + fib1 = fib1 - fib2 + fib2 = fib - fib1 + else: + return i + if fib1 and arr[offset + 1] == query: + return offset + 1 + return None diff --git a/changelog.md b/changelog.md index 36058d9..4b4fb67 100644 --- a/changelog.md +++ b/changelog.md @@ -8,11 +8,12 @@ Date: October 9, 2018 ### Algorithms: -- ### Sorting - - Bubble Sort - ### Searches - Merge Sort +- ### Sorting + - Bubble Sort + # Version `0.0.1` Date: TO ADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 2018 @@ -22,10 +23,13 @@ Date: TO ADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 2018 Added: - ### Searches + - Fibonacci Search + - Jump Search + +- ### Sorting - Bubble Sort - Cocktail Shaker Sort - Insertion Sort - Pigeonhole Sort - Selection Sort - - Stooge Sort - - Jump Search + - Stooge Sort \ No newline at end of file diff --git a/docs/readme.md b/docs/readme.md index e29f3da..80e8f33 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -59,6 +59,7 @@ print(binary_search(arr, 3)) - ### Searches - [Binary Search](searches/binary-search) + - [Fibonacci Search](searches/fibonacci-search) - [Jump Search](searches/jump-search) - ### Sorting - [Bubble Sort](sorting/bubble-sort) diff --git a/docs/searches/fibonacci-search.md b/docs/searches/fibonacci-search.md new file mode 100644 index 0000000..fc09267 --- /dev/null +++ b/docs/searches/fibonacci-search.md @@ -0,0 +1,33 @@ +# Fibonacci Search + +In computer science, the Fibonacci search technique is a method of searching a sorted array using a divide and conquer algorithm that narrows down possible locations with the aid of Fibonacci numbers. (Wikipedia) +## Install + +``` +pip install allalgorithms +``` + +## Usage + +```py +from allalgorithms.searches import fibonacci_search + +arr = [-2, 1, 2, 7, 10, 77] + +print(fibonacci_search(arr, 7)) +# -> 3 + +print(fibonacci_search(arr, 3)) +# -> None +``` + +## API + +### fibonacci_search(array, query) + +> Return array index if its found, otherwise returns `None` + +##### Params: + +- `array`: Sorted Array +- `query`: Element to search for in the array diff --git a/readme.md b/readme.md index e31cefe..fe2ceb1 100644 --- a/readme.md +++ b/readme.md @@ -59,7 +59,9 @@ print(binary_search(arr, 3)) - ### Searches - [Binary Search](https://python.allalgorithms.com/searches/binary-search) + - [Fibonacci Search](https://python.allalgorithms.com/searches/fibonacci-search) - [Jump Search](https://python.allalgorithms.com/searches/jump-search) + - ### Sorting - [Bubble Sort](https://python.allalgorithms.com/sorting/bubble-sort) - [Cocktail Shaker Sort](https://python.allalgorithms.com/sorting/cocktail-shaker-sort) diff --git a/tests/test_searches.py b/tests/test_searches.py index dddd19f..41120f7 100644 --- a/tests/test_searches.py +++ b/tests/test_searches.py @@ -1,7 +1,10 @@ import unittest -from allalgorithms.searches import (binary_search, jump_search) - +from allalgorithms.searches import ( + binary_search, + fibonacci_search, + jump_search +) class TestSearches(unittest.TestCase): @@ -12,6 +15,13 @@ def test_binary_search(self): self.assertEqual(None, binary_search(arr, 8)) self.assertEqual(None, binary_search(arr, -1)) + def test_fibonacci_search(self): + arr = [1, 2, 3, 7, 10, 19, 27, 77] + self.assertEqual(3, fibonacci_search(arr, 7)) + self.assertEqual(7, fibonacci_search(arr, 77)) + self.assertEqual(None, fibonacci_search(arr, 8)) + self.assertEqual(None, fibonacci_search(arr, -1)) + def test_jump_search(self): arr = [1, 2, 3, 7, 10, 19, 27, 77] self.assertEqual(3, binary_search(arr, 7)) @@ -19,6 +29,5 @@ def test_jump_search(self): self.assertEqual(None, binary_search(arr, 8)) self.assertEqual(None, binary_search(arr, -1)) - if __name__ == '__main__': unittest.main()