zoukankan      html  css  js  c++  java
  • 搜索算法----二分查找

    所谓搜索就是在序列当中查找某一元素,这就叫做搜索,但是如果我们没有学习算法的知识的话,使用传统的查找方式就是从第一个元素到最后一个元素,除了传统的查抄方式之外,还有一个就是有个算法-------二分查找

    二分查找就像我们查字典一样,先把字典分成两个部分,假如说我查找p字母,我将字典分成两半后看到的字母是M,因为字典是按顺序排列的,所以p字母是在m字母的后面,然后,我在将m字母后面的一半再分成两个部分,再看我当前页是否在p字母的前半部分还是右半部分,或者说正好就是p字母,按照这个思路在进行依次向下分。

    这样查找方式可以提高我们一半的效率。

    二分查找优点是比较次数少,查找速度快,平均性能好,其缺点是要求查找是有序表且插入删除困难·,因此,二分查找方法适用于不经常变动而查找频繁的有序数列。

    二分查找的缺点也是二分查找要满足以下条件,也就是就是我们的数列必须是按照顺序排列的

    二分查找可以分两种方式进行书写,一种是递归方式,另一种是非递归方式。

    python的递归方式:

    ef binary_search(alist,item):
    n = len(alist) #计算alist的长度
    if n>0:
    mid = n//2
    if item == alist[mid]:
    return True
    elif item<alist[mid]:
    return binary_search(alist[:mid],item) #进行递归操作
    else:
    return binary_search(alist[mid+1:],item) #因为列表中包括前面但是不包括后面,因此mid+1
    return False
    if __name__ == "__main__":
    li = [17,20,26,31,44,54,55,77,93]
    print(binary_search(li,55))

    python非递归方式:

    #非递归方式
    def binary_search(alist,item):
    n = len(alist)
    first = 0
    last = n-1
    while first <= last:
    mid = (first+last) // 2
    if item == alist[mid]:
    return True
    elif item < alist[mid]:
    last = mid -1
    else:
    first = mid+1
    return False
    if __name__ == "__main__":
    li = [17,20,26,31,44,54,55,77,93]
    print(binary_search(li,55))
  • 相关阅读:
    java栈的最大深度?
    String hashCode 方法为什么选择数字31作为乘子
    LinkedList 源码分析(JDK 1.8)
    ArrayList 源码分析
    LinkedHashMap 源码详细分析(JDK1.8)
    Java并发基础:了解无锁CAS就从源码分析
    IntelliJ IDEA(2018)安装详解
    HashMap 源码详细分析(JDK1.8)
    Java原子类实现原理分析
    谈谈Java中的volatile
  • 原文地址:https://www.cnblogs.com/white-the-Alan/p/9854384.html
Copyright © 2011-2022 走看看