• 《算法图解》学习笔记_01算法简介


    算法是一种完成任务的指令。

    本章的主要内容:

    第一种查找算法——二分查找

    讨论算法的运行时间——大O表示法

    一种常用的算法设计方法——递归方法

    二分查找是一种算法,其输入是一个有序元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则,返回NULL

    对于包含n个元素的列表,用二分查找最多需要log2n步,而简单查找最多需要n步

    在这本书中使用大O表示法讨论运行时间时,log指的都是log2

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

    二分查找的Python3代码如下:

    def binary_search(list, item):
      low = 0                                        #列表中第一个数字的索引为0
      high = len(list) - 1                         #列表中最后一个数字的索引为列表的长度减1

      while low <= high:                         #二分查找从中间的位置开始查找
          mid = int((low + high) / 2)      #列表中心位置的索引
          guess = list[mid]                   #guess为中心位置对应的数字

      if guess == item:
       return mid                                #如果中心位置对应的数字即为item,则返回中心位置的索引

      if guess > item:
                 high = mid                           #如果真实值item小于我们猜测的数字,则向前缩小范围
          else:
                 low = mid + 1                       #如果真实值item大于我们猜测的数字,则向后缩小范围
      return None                                #如果查找的数字不在列表中,则返回None

    if __name__ == "__main__":                #测试
      list = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
      index = binary_search(list, 17)
      print('查找的索引为{0}, 对应的数字为{1}'.format(index, list[index]))

    运行时间

    线性时间(linear time):最多的需要猜测的次数与列表长度相同。

    对数时间(log时间):二分查找的运行时间。

    大O表示法

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

    设列表包含n个元素,简单查找需要检查每个元素,因此需要执行n次操作,使用大大O表示法,这个运行时间为O(n)

    大O表示法并不是以秒为单位的速度,它能够让我们比较操作数,大O表示法指出了算法运行时间的增速

    检查长度为n的列表,二分查找需要执行logn次操作,用大O表示法表示它的运行时间是O(logn)

    一些常见的大O运行时间:

    O(logn):对数时间,这样的算法包括二分查找

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

    O(n*logn):这样的算法包括快速排序(速度较快的排序算法)。

    O(n2):这样的算法包括选择排序(速度较慢的排序算法)。

    O(n!):这样的算法包括旅行商的解决方案(速度非常慢的排序算法)。

    算法启示:

    算法速度并非时间,而是操作数的增速;

    说到算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加;

    算法的运行时间用大O表示法表示;

    O(logn)比O(n)快,当需要搜索的元素越多是,前者比后者快得多。

    旅行商问题:

    一个旅行者要去5个城市,共有120种不同的排列方法;推广到n个城市,需要执行n!次操作,因此运行时间为O(n!)。

    小结

    二分查找的速度比简单查找快得多;

    O(logn)比O(n)快,当需要搜索的元素越多,前者比后者快得越多;

    算法运行时间不以秒为单位;

    算法运行时间是从其增速的角度度量的;

    算法运行时间用大O表示法表示。

    希望大家多多批评指正

    祝好

    Violet HE

    2019.2.27  18:25 

    你必须非常努力,才能看起来毫不费力。
  • 相关阅读:
    Linux autojump命令
    Linux rpmbuild命令
    RPM包制作教程
    LSP(分层服务提供程序)
    WPAD 的原理及实现
    在OpenSSL中添加自定义加密算法
    Openssl sess_id命令
    hdu1878欧拉回路(DFS+欧拉回路)
    好代码的伪科学定义
    MySQL安装过程中出现“APPLY security settings错误”的解决方式
  • 原文地址:https://www.cnblogs.com/violethjq/p/10443022.html
Copyright © 2020-2023  润新知