From 4a73197daf4f906139ae2b13cdc965cd922fe848 Mon Sep 17 00:00:00 2001 From: dieterpl Date: Wed, 10 Oct 2018 23:20:30 +0200 Subject: [PATCH 1/5] Added fibonacci search --- allalgorithms/searches/__init__.py | 1 + allalgorithms/searches/fibonacci_search.py | 33 ++++++++++++++++++++++ changelog.md | 7 +++++ docs/searches/fibonacci-search.md | 33 ++++++++++++++++++++++ readme.md | 1 + tests/test_searches.py | 13 +++++++-- 6 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 allalgorithms/searches/fibonacci_search.py create mode 100644 docs/searches/fibonacci-search.md diff --git a/allalgorithms/searches/__init__.py b/allalgorithms/searches/__init__.py index dad7119..dc0f547 100644 --- a/allalgorithms/searches/__init__.py +++ b/allalgorithms/searches/__init__.py @@ -1 +1,2 @@ from .binary_search import * +from .fibonacci_search import * diff --git a/allalgorithms/searches/fibonacci_search.py b/allalgorithms/searches/fibonacci_search.py new file mode 100644 index 0000000..5afd388 --- /dev/null +++ b/allalgorithms/searches/fibonacci_search.py @@ -0,0 +1,33 @@ +# -*- 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 71baf9e..528a93c 100644 --- a/changelog.md +++ b/changelog.md @@ -28,3 +28,10 @@ Added: - Pigeonhole Sort - Selection Sort - Stooge Sort + +# Version `0.0.2` + +Date: October 10, 2018 + +- ### Sorting + - Fibonacci Search 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 1d5be4f..fdf6385 100644 --- a/readme.md +++ b/readme.md @@ -59,6 +59,7 @@ print(binary_search(arr, 3)) - ### Searches - [Binary Search](https://python.allalgorithms.com/searches/binary-search) + - [Fibonacci Search](https://python.allalgorithms.com/searches/fibonacci-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 622beeb..dfc96e1 100644 --- a/tests/test_searches.py +++ b/tests/test_searches.py @@ -1,7 +1,9 @@ import unittest -from allalgorithms.searches import binary_search - +from allalgorithms.sorting import ( + binary_search, + fibonacci_search +) class TestSearches(unittest.TestCase): @@ -12,6 +14,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)) + if __name__ == '__main__': unittest.main() From c2ef611ab7ebdad0d3996dba16a79e4ea5383b42 Mon Sep 17 00:00:00 2001 From: dieterpl Date: Wed, 10 Oct 2018 23:33:51 +0200 Subject: [PATCH 2/5] Fixed import to searches instead of sorting --- tests/test_searches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_searches.py b/tests/test_searches.py index dfc96e1..5ac707d 100644 --- a/tests/test_searches.py +++ b/tests/test_searches.py @@ -1,6 +1,6 @@ import unittest -from allalgorithms.sorting import ( +from allalgorithms.searches import ( binary_search, fibonacci_search ) From 14bf84b8ee1db45f66805ee6f6897cf82b0404b7 Mon Sep 17 00:00:00 2001 From: dieterpl Date: Thu, 11 Oct 2018 00:13:24 +0200 Subject: [PATCH 3/5] Added lines --- allalgorithms/searches/fibonacci_search.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/allalgorithms/searches/fibonacci_search.py b/allalgorithms/searches/fibonacci_search.py index 5afd388..0d9aa01 100644 --- a/allalgorithms/searches/fibonacci_search.py +++ b/allalgorithms/searches/fibonacci_search.py @@ -6,6 +6,8 @@ # Contributed by: dieterpl # Github: @dieterpl # + + def fibonacci_search(arr, query): fib2, fib1 = 0, 1 fib = fib2 + fib1 From 4a883c7cb83b62c22ee28a4c86eeedd75e2361c7 Mon Sep 17 00:00:00 2001 From: Abraham Hernandez Date: Wed, 10 Oct 2018 22:03:22 -0400 Subject: [PATCH 4/5] add fibonacci search docs on main readme --- docs/readme.md | 1 + 1 file changed, 1 insertion(+) 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) From ce87b436e3b6374647ee2bbaa61762653b0a9c6b Mon Sep 17 00:00:00 2001 From: Abraham Hernandez Date: Wed, 10 Oct 2018 22:09:35 -0400 Subject: [PATCH 5/5] adding forgotten `,` --- tests/test_searches.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_searches.py b/tests/test_searches.py index 3193b1b..41120f7 100644 --- a/tests/test_searches.py +++ b/tests/test_searches.py @@ -2,7 +2,7 @@ from allalgorithms.searches import ( binary_search, - fibonacci_search + fibonacci_search, jump_search ) @@ -30,4 +30,4 @@ def test_jump_search(self): self.assertEqual(None, binary_search(arr, -1)) if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main()