图解算法(一)

1.二分查找

python2.7 实现代码

 1 #!/usr/bin/python
 2 def binary_search(list,item):
 3    low=0
 4    high= len(list)-1
 5 
 6    while low<=high:
 7      mid = (low+high) / 2
 8      guess = list[mid]
 9      if guess == item:
10         return mid
11      if guess > item:
12         high = mid -1
13      else:
14         low = mid+1
15    return None
16 my_list = [1,3,5,7,9]
17 
18 print binary_search(my_list, 3)
19 print binary_search(my_list ,-1)

函数binary_search接收一个有序数组和一个元素。如果指定元素包含在数组中,这个函数将返回其位置。你将跟踪要在你其中查找的数组部分——开始时为整个数组。

low = 0

high = len(list)-1

你每次都检查中间的元素。

mid = (low+high) / 2    <------如果(low+high)不是偶数,Python自动将mid向下取整。

guess = list[mid]

如果猜的数字小了,就相应地修改low。

if guess < item:

  low= mid +1

如果猜测的数字大了,就修改high的值

2.大O表示法

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

2.1 算法的运行时间以不同的速度增加

   大O表示法指出了算法有多快。例如,假如列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作使用大O表示法,这个运行时间为O(n)。大O表示法指的并非是以秒为单位的速度。大O表示法让你能够比较操作数,它指出了算法运行时间的增速。

  再比如,为检查长度为n的列表,二分查找需要执行log n次操作。使用大O表示法表示O(log n)。

2.2 理解不同的大O运行时间

一种方法是以每次画一个的方式画16个格子,需要画16个格子。运行时间为O(n)

另一种方法是将纸张对折四次。运行时间为O(log n)

2.3 大O表示法指出了最糟情况下的运行时间

简单查找的运行时间总是为O(n)。查找A时,一次就找到了,这是最佳的情况,但是大O表示法说的是最糟的情形。

2.4 常见的大O运行时间

下面按从快到慢的顺序列出

  • O(log n),也叫对数时间,这样的算法包括二分查找
  • O(n),也叫线性时间,包括简单查找
  • O(n*log n),包括快速排序——一种速度较快的排序算法
  • O(n2),包括选择排序——一种速度较慢的排序算法
  • O(n!),包括接下来介绍的旅行商问题的解决方案

2.5 旅行商

一位旅行商,他需要前往5个城市,同时要确保旅程最短,可考虑前往这些城市的各种可能顺序。涉及n个城市时,需要执行时间为O(n!),即阶乘时间。

posted @ 2019-04-15 11:06  听风的dog  阅读(795)  评论(0编辑  收藏  举报