2021-04-19

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本章内容
 为阅读后续内容打下基础。
 编写第一种查找算法——二分查找。
 学习如何谈论算法的运行时间——大O表示法。
 了解一种常用的算法设计方法——递归。


1.1 引言

算法是一组完成任务的指令,任何代码片段都可视为算法。

1.2 二分查找

二分查找是一种算法,其输入是一个有序的元素列表(必须有序的原因稍后解释)。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null

注:仅当列表是有序的时候,二分查找才管用

1.2.1 二分法在有序数组中查找元素


def binary_search(list,item):
    low = 0
    high = len(list)-1

    while low<=high:
        mid = (low+high)//2
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid-1
        else:
            low = mid+1
    return None

my_list = [1,3,5,7,9]
print(binary_search(my_list,3))

# 二分查找非递归法
# 在python中
# " / "表示浮点数除法,返回浮点结果;
# " // "表示整数除法。
# 在本文中当数组的长度为奇数时,mid由(low+high)//2 向下取整。

1.2.2 二分查找的优缺点

  • 虽然二分查找的效率高,其花费时间为O(lgn)但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。

  • 二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。

  • 对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。

1.3 大O表示法

大O表示法是一种特殊的表示法,指出了算法的速度有多快。

1.3.1 常见的大O运行时间:

  • O(log n) ,也叫对数时间,这样表示的算法包括二分查找。

  • O(n) ,也叫线性时间,这样的算法包括简单查找。

  • O(n * log n) ,这样的算法包括快速排序。

  • O(n^{2}), 这样的算法包括选择排序。

  • O( n! ),这样的算法包括旅行商的解决方案。

1.3.2 关于大O运行时间的小结:

  • 算法的速度指的并非时间,而是操作数的增速。
  • 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
  • 算法的运行时间用大O表示法表示。
  • O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。

1.4课后练习

1、练习 (P8)

1.1 假设有一个包含128个名字的有序列表,你要使用二分查找法在其中查找一个 名字,请问最多需要几步才能找到?

128->64->32->16->8->4->2->1,所以最多需要7步。

1.2上面列表的长度翻倍之后,最多需要几步?

翻倍后顶多会增加一步,所以是8步。

1、练习​​​​​​​ (P13)

使用大O表示法给出下属各种情况的运行时间

1.3 在电话簿中根据名字查找电话号码。

根据字母姓式二分查找所用时间为:O(log n)

1.4 在电话簿中根据电话号码找人。(提示:你必须查找整个电话簿。)

简单查找,所用时间为:O(n)

1.5 阅读电话簿中每个人的电话号码

简单查找,所用时间为:O(n)

1.6阅读电话簿中姓名以A打头的人的电话号码。

总结

  • 二分查找的速度比简单查找快得多。
  • O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
  • 算法运行时间并不以秒为单位。
  • 算法运行时间是从其增速的角度度量的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值