zoukankan      html  css  js  c++  java
  • 20190425-基于有序数组的二分查找法

    前言:日常需要在一个有序序列里面是否包含目标值的时候需要一一遍历序列,然后进行对比,这种算法称之为简单查找。简单查找的特点是:每次只查找并且排除一个数。

    现在我们提供一种更好的算法,如猜数字,告诉你目标数在0-100之间,通过猜测中间数字可以一次性排除多位数字。具体案例如下:

    给定序列为1-100,目标数字是88,现在我们进行二分查找算法路线分析:

    step1:猜测数字是50,告诉我们小了,此时我们将0-50都排除了

    step2:猜测数字是剩下的有序序列的中间值75,告诉我们小了,此时我们将0-75都排除,仅剩76-100

    step3:猜测数字是88,告诉我们猜对了

    全程仅用了3步,下面用函数实现猜数字功能的两种算法

    简单查找,times表示查找次数,按照上述例子,在1-100中查找88,需要查找88次

    def find_num(lis,target_num):
        times=0
        for i in lis:
            time+=1
            if i==target_num:
                return time    

    二分查找,times表示查找此次数,按照上述例子,在1-100中查找88,需要查找3次

    def binary_find(lis,target_num):
        low =0
        high = len(lis)-1
        times=0
        while low<=high:
            times+=1
            mid = (low+high)//2
            print(lis[mid])
            if lis[mid]==target_num:
                return times
            elif lis[mid]>target_num:
                high = mid-1
            elif lis[mid]<target_num:
                low = mid+1
                
    print(binary_find(list(range(1,101)),88))

    二分查找的特点:

     二分查找接受一个有序序列,和一个指定元素,如果指定元素在序列中,函数可返回函数在序列的位置,每次都检查序列的中间元素mid =(low+high)/2,如果猜的数字小了,则修改low=mid+1,如果猜的数字大了则修改high=mid-1

    二分查找仅能查找有序序列,无序序列不适用该方法

  • 相关阅读:
    [模仿]Google Doodles 的春分和秋分
    [模仿]canvas视频拼图
    SQL--from w3c school
    txt文件导入mysql
    公益图书馆-基本环境搭建及代码规范
    IP地址
    Android基础_1
    Android_输入输出流
    设计模式(2):观察者模式-2 (委托、事件)
    小张日记 一 正式场合说话要正式
  • 原文地址:https://www.cnblogs.com/hyj691001/p/10767372.html
Copyright © 2011-2022 走看看