• python --- 二分查找算法


    二分查找法:在我的理解中这个查找方法为什么会叫二分呢,我认为是将要查询的一个列表分成了两份,然后在利用某个值来进行比较,在一个不断循环的过程中来找出我们要找的某一个值。

    废话不多说,先上代码:

     1 def twofenfind(lst, target):
     2     left = 0
     3     right = len(lst) - 1
     4 
     5     while target in lst:
     6         mid = (left + right) // 2
     7         if target > lst[mid]:
     8             left = mid + 1
     9 
    10         elif target < lst[mid]:
    11             right = mid - 1
    12 
    13         else:
    14             return mid
    15     return None
    16 
    17 
    18 
    19 print(twofenfind([1, 2, 3 ,4, 7], 3))
    # 代码有些地方可能会有歧义,但这也仅仅只是我个人的一些理解(如有错误还请指正)。

    二分查找发是一个效率很高的查找法,但是被查找的数据必须是有序的。

    首先,将待查找target值与有序列表lst[0]到lst[n - 1]的中间位置——记为mid上的结点的关键字进行比较,如果相等就完成查找;否则,若lst[mid]>target,则说明待查找的数只可能在列表左边

    lst[0]-lst[mid - 1]中,只需要在左边的列表中进行查找;若lst[mid] > x,则在右边的列表lst[mid + 1] 到 lst[n - 1]中继续进行查找,这样经过一次,关键字的比较就缩小了一半的查找区间。

    然后继续按照上面的方法进行查找,然后知道找到关键字为target的元素或者当前查找区间为空(即表明查找失败)为止。

     

    下面测试一下,以查找target:13为例: 

    当中取mid的关键字和target进行比较,很显然13 < 17,所以要查找的13应该是在前半部分的,所以下次查找的区间应该是在[0,5],即left的值不变仍然为0,right的值变为mid - 1 = 5,所以

    mid = len(right + left) // 2 = 2(这里要进行整除)

     

    取11和13进行比较,显然13 > 11, 所以要查找的值应该是在11后面的,所以left就变为了mid + 1 ,right的值仍然不变,取得最终的值mid = 3

    取mid指示的位置的关键字13和target进行比较,结果相等,就说明查找成功了,所以target在列表中的位置即为mid所指示的位置。(我是按照索引来查找的)

  • 相关阅读:
    C++ STL中vector应用
    cocos2dx绘制直线
    [ios] 获得ios设备具体型号
    如何制作 iTunesArtwork
    Ios AppIcon 去掉默认半弧形白色遮罩
    App运行内存打印
    C++ 文件操作
    objc 笔记
    (转)c++ oc字符操作
    cocos2dx 文本 优化
  • 原文地址:https://www.cnblogs.com/tulintao/p/10748541.html
Copyright © 2020-2023  润新知