zoukankan      html  css  js  c++  java
  • day6--二分查找法

    二分查找法

    我们在使用一个列表的时候,往往需要找到一个元素的位置也就是它的索引,按照一般的情况,肯定是一个一个的找过去,元素多了就是一件麻烦事。。

    后来就引进了一个概念:二分查找法

    它是根据情况将数据分为两半,找出中间值,然后让要查找的值和它比较,逐渐缩小范围直到找到相应的值。。。

    我目前能想到的是可以运用到数字上面,因为数字可以比较大小,当然这些数字必须是有序排列的

    例如:找出下面列表中的某个元素

    我们一般的查找方法
    l1=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
    def found(list,target):
        x=1
        for i in list:
            if i==target:
                print('找到了')
                break
            else:
                x=x+1
        print(x)
    found(l1,5)  # 结果为 找到了,x为5
    found(l1,1)  #结果为  找到了,x为1
    有个奇怪的现象,我们查找一个不存在的元素时,它的值是列表里面的元素个数加1
    found(l1,19) found(l1,100) 结果都为 19

    那么二分查找法如何实现:

    l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
    n=1
    def half_search(list, target, start=0, end=None):
        global n
        end = len(list) - 1 if end is None else end
        if end >= start:
            mid_index = (end - start) // 2 + start  # 找出中间索引的位置
            if target > list[mid_index]:
                n= n + 1
                return half_search(list, target, start=mid_index + 1, end=end)
            elif target < list[mid_index]:
                n = n + 1
                return half_search(list, target, start=start, end=mid_index - 1)
            elif target == list[mid_index]:
                print('找了%s次' % n)
                return '它的索引为%s'%mid_index
            else:
                print('找了%s次' % n)
                return '没有找到'
        else:
            print('找了%s次' % n)
            return '没有此值'
    print(half_search(l1,1)) #结果为 找了4次 它的索引为0
    print(half_search(l1,5)) #结果为 找了7次 它的索引为4
    print(half_search(l1,10)) #结果为 找了10次 它的索引为9
    View Code

    从上面的比较我们可以看出,如果元素考前的话,一般的查找有有优势,但是二分查找法在大量的数据中是有绝对优势的

    二分查找法,查找一个存在的元素最多查找 n/2+1次,n为元素的个数

  • 相关阅读:
    hdu1247 字典树或者hash
    hdu1247 字典树或者hash
    hdu1251 hash或者字典树
    hdu1251 hash或者字典树
    hdu4421 2-sat(枚举二进制每一位)
    hdu4421 2-sat(枚举二进制每一位)
    poj3648 2-sat
    poj3648 2-sat
    hdu 1814 字典序最小的2sat(暴力深搜)
    hdu 1814 字典序最小的2sat(暴力深搜)
  • 原文地址:https://www.cnblogs.com/mmyy-blog/p/9222962.html
Copyright © 2011-2022 走看看