2018-07-17二分查找及时间复杂度

搜索:查找某个项目是否存在

搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。

搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找
二分法查找:

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

只能在有序顺表中使用。

代码实现:
1、迭代法

# coding:utf-8


def binary_search(alist, item):
    """二分查找"""
    n = len(alist)
    if n > 0:
        mid = n//2
        if alist[mid] == item:
            return True
        elif item < alist[mid]:
            return binary_search(alist[:mid], item)
        else:
            return binary_search(alist[mid+1:], item)
    return False


if __name__ == "__main__":
    testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42, ]
    print(binary_search(testlist, 3))
    print(binary_search(testlist, 13))

结果:


运行结果

2、非迭代法

def binary_search(alist, item):
    """二分查找,非递归"""
    n = len(alist)
    first = 0
    last = n - 1
    mid = (first + last)//2
    while first <= last:
        if alist[mid] == item:
            return True
        elif item < alist[mid]:
            last = mid - 1
        else:
            first = mid + 1
        return False


if __name__ == "__main__":
    testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42, ]
    print(binary_search(testlist, 3))
    print(binary_search(testlist, 13))

结果:


结果
时间复杂度:

遍历方式,最优时间复杂度O(1),最坏O(n),最优O(1)
二分查找,2的logn次方等于n,最坏时间复杂度为O(logn),最优O(1)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,006评论 0 13
  • 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文...
    北方蜘蛛阅读 2,940评论 1 4
  • 原文出处:http://www.cnblogs.com/maybe2030/p/4715035.html引文出处:...
    明教de教主阅读 9,222评论 0 7
  • 我是个偏感性的人,有些小脾气,又有些没脾气。有人说我性格好,有人说我脾气差。 作为一个孩子的我,自然喜欢听那些好听...
    无非黑白阅读 373评论 0 0
  • 每个人的一生都会遇到几个贵人,有些人紧紧抓住贵人的手,适时翻身,也有些人遇到贵人擦肩而过!为了您的未来,来看看哪些...
    巅峰之旅阅读 253评论 0 2