From 7dff214d9ba2bd178830d06422073022def49ba3 Mon Sep 17 00:00:00 2001 From: Sergey Tsaplin Date: Fri, 29 Jul 2016 18:03:20 +0500 Subject: [PATCH 1/3] Binary Search refactoring --- BinarySeach.py | 101 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 74 insertions(+), 27 deletions(-) diff --git a/BinarySeach.py b/BinarySeach.py index 9d09c6ba3ea4..0a00a69f4bbc 100644 --- a/BinarySeach.py +++ b/BinarySeach.py @@ -1,30 +1,77 @@ -def binarySearch(alist, item): - - first = 0 - last = len(alist)-1 - found = False - - while first<=last and not found: - - midpoint = (first + last)//2 - if alist[midpoint] == item: - found = True - print("Found [ at position: %s ]" % (alist.index(item) + 1)) +""" +This is pure python implementation of binary search algorithm + +For doctests run following command: +python -m doctest -v selection_sort.py +or +python3 -m doctest -v selection_sort.py + +For manual testing run: +python binary_search.py +""" +from __future__ import print_function + + +def binary_search(sorted_collection, item): + """Pure implementation of binary sort algorithm in Python + + :param sorted_collection: some sorted collection with comparable items + :param item: item value to search + :return: index of found item or None if item is not found + + Examples: + >>> binary_search([0, 5, 7, 10, 15], 0) + 0 + + >>> binary_search([0, 5, 7, 10, 15], 15) + 4 + + >>> binary_search([0, 5, 7, 10, 15], 5) + 1 + + >>> binary_search([0, 5, 7, 10, 15], 6) + + >>> binary_search([5, 2, 1, 5], 2) + Traceback (most recent call last): + ... + ValueError: Collection must be sorted + """ + if sorted_collection != sorted(sorted_collection): + raise ValueError('Collection must be sorted') + left = 0 + right = len(sorted_collection) - 1 + + while left <= right: + midpoint = (left + right) // 2 + current_item = sorted_collection[midpoint] + if current_item == item: + return midpoint else: - - if item < alist[midpoint]: - - last = midpoint-1 + if item < current_item: + right = midpoint - 1 else: - first = midpoint+1 - - if found == False: - continue - # print("Not found") - return found -print("Enter numbers seprated by space") -s = input() -numbers = list(map(int, s.split())) -trgt =int( input('enter a single number to be found in the list ')) -binarySearch(numbers, trgt) + left = midpoint + 1 + return None + + +if __name__ == '__main__': + import sys + # For python 2.x and 3.x compatibility: 3.x has not raw_input builtin + # otherwise 2.x's input builtin function is too "smart" + if sys.version_info.major < 3: + input_function = raw_input + else: + input_function = input + + user_input = input_function('Enter numbers separated by coma:\n') + collection = [int(item) for item in user_input.split(',')] + target_input = input_function( + 'Enter a single number to be found in the list:\n' + ) + target = int(target_input) + result = binary_search(collection, target) + if result is not None: + print('{} found at positions: {}'.format(target, result)) + else: + print('Not found') From 65ca0bbaa2ebf11ec8081598f32c98a23e24d4e3 Mon Sep 17 00:00:00 2001 From: Sergey Tsaplin Date: Fri, 29 Jul 2016 18:06:37 +0500 Subject: [PATCH 2/3] Rename binary_search module pythonic way --- BinarySeach.py => binary_seach.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename BinarySeach.py => binary_seach.py (100%) diff --git a/BinarySeach.py b/binary_seach.py similarity index 100% rename from BinarySeach.py rename to binary_seach.py From ec6b64a9eca8c2d3f092e2e0a44c6b18159a0b54 Mon Sep 17 00:00:00 2001 From: Sergey Tsaplin Date: Fri, 29 Jul 2016 19:12:51 +0500 Subject: [PATCH 3/3] Add bin search algorithm using stdlib --- binary_seach.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/binary_seach.py b/binary_seach.py index 0a00a69f4bbc..a48762863cfa 100644 --- a/binary_seach.py +++ b/binary_seach.py @@ -10,10 +10,32 @@ python binary_search.py """ from __future__ import print_function +import bisect + + +def assert_sorted(collection): + """Check if collection is sorted. If not raises :py:class:`ValueError` + + :param collection: collection + :return: True if collection is sorted + :raise: :py:class:`ValueError` if collection is not sorted + + Examples: + >>> assert_sorted([0, 1, 2, 4]) + True + + >>> assert_sorted([10, -1, 5]) + Traceback (most recent call last): + ... + ValueError: Collection must be sorted + """ + if collection != sorted(collection): + raise ValueError('Collection must be sorted') + return True def binary_search(sorted_collection, item): - """Pure implementation of binary sort algorithm in Python + """Pure implementation of binary search algorithm in Python :param sorted_collection: some sorted collection with comparable items :param item: item value to search @@ -36,8 +58,7 @@ def binary_search(sorted_collection, item): ... ValueError: Collection must be sorted """ - if sorted_collection != sorted(sorted_collection): - raise ValueError('Collection must be sorted') + assert_sorted(sorted_collection) left = 0 right = len(sorted_collection) - 1 @@ -54,6 +75,37 @@ def binary_search(sorted_collection, item): return None +def binary_search_std_lib(sorted_collection, item): + """Pure implementation of binary search algorithm in Python using stdlib + + :param sorted_collection: some sorted collection with comparable items + :param item: item value to search + :return: index of found item or None if item is not found + + Examples: + >>> binary_search_std_lib([0, 5, 7, 10, 15], 0) + 0 + + >>> binary_search_std_lib([0, 5, 7, 10, 15], 15) + 4 + + >>> binary_search_std_lib([0, 5, 7, 10, 15], 5) + 1 + + >>> binary_search_std_lib([0, 5, 7, 10, 15], 6) + + >>> binary_search_std_lib([5, 2, 1, 5], 2) + Traceback (most recent call last): + ... + ValueError: Collection must be sorted + """ + assert_sorted(sorted_collection) + index = bisect.bisect_left(sorted_collection, item) + if index != len(sorted_collection) and sorted_collection[index] == item: + return index + return None + + if __name__ == '__main__': import sys # For python 2.x and 3.x compatibility: 3.x has not raw_input builtin