《算法图解》学习笔记_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 

猜你喜欢

转载自www.cnblogs.com/violethjq/p/10443022.html