• 技术文章 >Python技术 >Python基础教程

    python二分查找的原理

    小妮浅浅小妮浅浅2021-08-10 10:07:38原创2157

    原理

    1、假设表中的要素按升序排列,将表中间位置记录的关键词与检索关键词进行比较,如果两者相等,则检索成功。

    2、否则,利用中间位置记录将表分为前后两个子表。

    如果中间位置记录的关键词大于搜索关键词,则进一步搜索前一个子表,否则进一步搜索后一个子表。重复以上流程,找到符合条件的记录,使检索成功,或者在子表不存在之前,此时检索不成功。

    实例

    """
    应用前提:在一个含有n个元素的有序序列中定位目标值 时间复杂度:O(logn)
    该算法维持两个参数low和high,这样可使所有候选条目的索引位于low和high之间。首先, low=0和high=n-1。然后我们比较目标值和中间值候选项,即索引项[mid]的数据。
    mid =L(low + high)/2 ]考虑以下三种情况:
    - 如果目标值等于[mid]的数据, 然后找到正在寻找的值,则查找成功并且终止。
    - 如果目标值< [mid] 的数据, 对前半部分序列重复这一过程,即索引的范围从low到mid-1.
    - 如果目标值> [mid] 的数据,对后半部分序列重复这一过程,即索的范围从mid+1到high。
    - 如果low >high,说明索引范围[low, high]为空,则查找不成功。该算法被称为二分查找
    """
     
     
    def binary_search(alist, item):
        """非递归"""
        first = 0
        last = len(alist) - 1
        found = False
        while first <= last and not found:
            mid = (first + last) // 2
            if alist[mid] == item:
                found = True
            else:
                if item < alist[mid]:
                    last = mid - 1
                else:
                    first = mid + 1
        return found
     
     
    def binary_search_recursion(alist, item):
        if len(alist) > 0:
            mid = len(alist) // 2
            if alist[mid] == item:
                return True
            elif item < alist[mid]:
                return binary_search_recursion(alist[:mid], item)
            else:
                return binary_search_recursion(alist[mid + 1:], item)
        return False
     
     
    if __name__ == '__main__':
        ret = binary_search_recursion([17, 20, 26, 31, 44, 54, 55, 65, 77, 69], 26)
        print(ret)
     
        ret = binary_search([17, 20, 26, 31, 44, 54, 55, 65, 77, 69], 68)
        print(ret)

    以上就是python二分查找的原理,希望对大家有所帮助。更多Python学习指路:python基础教程

    本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。

    专题推荐:python二分查找
    上一篇:python顺序搜索的两种形式 下一篇:python哈希散列的映射

    相关文章推荐

    • python mktime()如何计算时间• python数据模块类如何定义• python如何定义索引模块类• python搜索模块如何查询• python PyQt5如何实现窗口功能• python阻塞调度如何使用• python标记清除的过程• python单向链表如何实现• python双向链表的概念介绍• Python单向循环链表的创建

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网