Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 我做了下面的二进制搜索算法,我正在努力改进它。建议?_Python 3.x_Binary Search - Fatal编程技术网

Python 3.x 我做了下面的二进制搜索算法,我正在努力改进它。建议?

Python 3.x 我做了下面的二进制搜索算法,我正在努力改进它。建议?,python-3.x,binary-search,Python 3.x,Binary Search,我正在做一个家庭作业,我必须检查一个给定数字的大列表。列表长度为目标: list1=list1[下:检查] check=int((len(list1))//2) 如果列表1[检查]

我正在做一个家庭作业,我必须检查一个给定数字的大列表。列表长度为目标: list1=list1[下:检查] check=int((len(list1))//2) 如果列表1[检查]<目标: list1=list1[检查:上限] check=int((len(list1))//2) 如果列表1[检查]==目标: 找到=真 返回p.index(目标) 如果len(list1)==1: 如果目标不在列表1中: 返回-1`
感谢您的帮助

尝试使用else if's,例如,如果要检查的值较大,则不必检查其是否较小。

核心问题是,这不是一个正确编写的值(请参见此处的算法)

不需要
索引(目标)
来找到解决方案;二进制搜索是
O(lgn)
,因此索引的存在,即
O(n)
,违反了这一点!如前所述,整个“二进制搜索”函数可以替换为
list1.index(value)
,因为它“查找”值索引只是为了“查找”值索引

代码还对不需要的列表进行切片1;只需将上/下索引移动到值上的“磨合”。找到的值的索引是上下限最终相遇的地方

另外,请确保
list1
确实是一个列表,以便项目访问是
O(1)

(并且
/
不需要
int



1我相信切片的复杂性仍然是
O(lgn)
,但它是一种非惯用的二进制搜索,增加了创建新列表和复制相关项的额外开销。它也不允许正确生成找到的项的索引-至少没有传统实现中类似的变量维护。

谢谢您的输入。我将研究二进制搜索算法。虽然这是一个列表,而不是散列值,但我不明白o(1)中的项访问是什么意思。如果我没有索引,我如何返回索引?@user3205701并非所有序列都是相同的。虽然很可能会给您一个
列表
(除非有人觉得自己很卑鄙),但基于索引的二进制搜索只有在源上的索引查找为O(1)时才会有预期的界限。
def binary_search(list1, target):
  p = list1
  upper = len(list1)
  lower = 0
  found = False
  check = int((upper+lower)//2)
  while found == False:
    upper = len(list1)
    lower = 0    
    check = int(len(list1)//2)
    if list1[check] > target:
      list1 = list1[lower:check]
      check= int((len(list1))//2)
    if list1[check] < target:
      list1 = list1[check:upper]
      check = int((len(list1))//2)
    if list1[check] == target:
      found = True
      return p.index(target)
    if len(list1)==1:
      if target not in list1:
        return -1`