【问题标题】:Implementing a binary search实现二分查找
【发布时间】:2013-05-11 03:17:42
【问题描述】:

我正在尝试实现二进制搜索;它需要一个有序列表,获取中间值,将其与目标值进行比较,然后在中间值上方或下方列出子列表,直到找到目标或从列表中丢失。但是,出于某种原因,除非中点是目标,否则我总是返回“无”。我不确定出了什么问题。

def bisect(list,target):


    print list
    split= list[len(list)//2]
    print "Split value : " + str(split)  

    if target==split: 
        return "target" 

    elif target<split:
        bisect(list[:split],target) 

    elif target>split:
        bisect(list[(split):],target)

a= [1,2,3,4,5,6,7,8,9,10]       
print bisect(a,2)

Output:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Split value : 6
[1, 2, 3, 4, 5, 6]
Split value : 4
[1, 2, 3, 4]
Split value : 3
[1, 2, 3]
Split value : 2
None

拆分和目标值之间的最后一次比较似乎没有发生?

【问题讨论】:

  • 为什么不使用bisect 模块?
  • @FredrikPihl 或至少 - 看看 bisect 模块如何实现其功能以进行比较
  • 附带说明:调用您的列表 list 会造成混淆,这意味着您不能在函数中使用同名的类型/构造函数。
  • @abarnert true 我没有使用该类型,所以它会导致问题,但我这样做的方式很糟糕。我会改的。

标签: python python-2.7


【解决方案1】:

两个问题:

  1. 当您通过调用bisect 进行递归时,您仍然需要通过执行return bisect(list[:split],target)返回调用的值。

  2. splitlist 的一个元素,而不是一个索引,所以list[:split] 不会像你想的那样做。改用list[:len(list)//2],同样将list[split:]改为list[len(list)//2:]

【讨论】:

  • 最好先执行splitpoint = len(list)//2,然后执行split = list[splitpoint] 并使用list[:splitpoint]list[splitpoint:],而不是重复相同的表达式3 次。但除此之外,很好的答案。
  • @abarnert list[:splitpoint]list[splitpoint+1:]。省略 +1 会导致无限递归。
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2014-05-10
  • 2016-02-23
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多