美文网首页
二分查找

二分查找

作者: 小碧小琳 | 来源:发表于2018-08-02 14:41 被阅读0次

查找题目的套路:

  • 根据辅助变量found来判断是否已经找到target。
  • 每次查找到item都会有三种情况:item等于target,item小于target,item大于target。然后就是每种情况下,如何改变查找条件。

一、二分搜索

二分搜索的是有序表,时间复杂度是O(log(n))。需要一个辅助变量found来表示是否已经找到target。
思路:
1、左指针为left,右指针为right,中间指针为len(list)//2。

2、有序,选择中间元素item,与target进行比较,相应的有三种情况

  • target等于item,结束搜索,返回True
  • target小于中间的数item,说明target在左半部分,下一步应该在左半部分索引,即在[left : mid-1]部分索引,于是将right赋值为mid-1,继续下一步的循环。
  • target大于中间的数item,说明target在右半部分,下一步应该在右半部分索引,即在[mid+1 : right]部分索引,于是将left赋值为mid+1,继续下一步的循环。
  • 4、循环,直到找到。

代码:

循环条件:左指针小于等于右指针,且没有发现target

1   def binarySearch(alist, target):
        #定义左指针跟右指针的索引
2       first = 0
3       last = len(alist)-1
        #把found设置为Flase
4       found = False
5   
6       while first<=last and not found:
7           midpoint = (first + last)//2
8           if alist[midpoint] == target:
9               found = True
10          else:
11              if target < alist[midpoint]:
12                  last = midpoint-1#target在左半部分
13              else:
14                  first = midpoint+1
16      return found

递归版本:用列表切片来限制搜索范围

1   def binarySearch(alist, target):
2       if len(alist) == 0:
3           return False
4       else:
5           midpoint = len(alist)//2
6           if alist[midpoint]==target:
7             return True
8           else:
9             if target<alist[midpoint]:
10              return binarySearch(alist[:midpoint],target)
11            else:
12              return binarySearch(alist[midpoint+1:],target)
13  
14  testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
15  print(binarySearch(testlist, 3))
16  print(binarySearch(testlist, 13))

相关文章

网友评论

      本文标题:二分查找

      本文链接:https://www.haomeiwen.com/subject/jkzjvftx.html