Python 3二进制搜索已排序的变量(数字列表)

时间:2017-12-01 12:31:37

标签: python python-3.x sorting binary-search

你好:)我正在编写一个程序,通过排序列表使用二进制搜索。它应该如下工作:python find.py 3 1 2 3

程序应在数字1 2和3中查找3

如果在1 2和3中,它应该返回true并打印找到的针, 如果它不在1 2和3中,如果应该返回false并且打印没有找到....

def binary_search(needle, haystack):
    first = 0
    last = len(haystack) - 1
    itemlist = str(input(haystack))
    sorted(itemlist)

    while first <= last:
        mid = (first + last) / 2
        if itemlist[mid] == needle :
            print("Found the needle in the haystack")
            return True
        elif needle < itemlist[mid]:
            last = mid - 1
        else:
            first = mid + 1 
        if not True:
            print("Did not find the needle in the haystack")
            return False

所以我尝试实现一个标准的二进制搜索算法,但是我遇到的每个版本都不会将第一个数字作为您需要在以下所有数字中搜索的项目... 所以我的问题是,如何将第一个变量设置为“项目”,然后将所有内容设置为可能包含或不包含该项目的列表?

我还需要对x长度列表进行排序,所以我尝试了排序函数,但由于列表可以是任意长度,我需要对变量进行排序吗?我有点卡在那里......有关这些话题的任何提示吗?

2 个答案:

答案 0 :(得分:0)

sys.argv是一个包含用于调用python进程的命令行参数的列表。 sys.argv[0]是脚本的名称,sys.arv[1:]是剩余的参数。像这样访问它:

def binary_search(needle, haystack):
    print('binary_search(): needle = {}, haystack = {}'.format(needle, haystack))
    # your implementation here

if __name__ == '__main__':
    import sys

    if len(sys.argv) > 2:
        needle = sys.argv[1]
        haystack = sys.argv[2:]
        binary_search(needle, haystack)
    else:
        print('Usage: {} needle haystack...'.format(sys.argv[0]))

如果您需要先对大海捞针进行排序,请使用sorted()

binary_search(needle, sorted(haystack))

然而,首先排序没有什么意义,因为它具有 O(n log n)时间复杂度,而线性搜索只有 O(n)时间复杂度。因此,如果输入未排序,则最好通过遍历列表进行搜索,直到找到目标为止。

最后,您可能需要将输入转换为数值才能使搜索起作用。您可以使用int()

        needle = int(sys.argv[1])
        haystack = [int(s) for s in sys.argv[2:]]

答案 1 :(得分:0)

二进制搜索是标准库的一部分。以下是如何将它用于您的问题:

import sys
import bisect

argv = [int(_) for _ in sys.argv[1:]]
x = argv.pop(0)
i = bisect.bisect_left(argv, x)
print("Found:", i != len(argv) and argv[i] == x)

此外,只有输入列表已经排序,问题才有意义。如果不是,只需使用x in argv,这是线性的(对列表进行排序是线性的)。