《算法图解》

Posted Dufy >>> Open Mind, Free Hear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法图解》相关的知识,希望对你有一定的参考价值。

 前三章是打基础的,后面介绍的是应用广泛的算法。书中代码均用Python 2.7编写

一、算法简介

算法是一组完成任务的指令

书中介绍算法的流程:描述算法----示例代码------大O()讨论运行时间-----可以解决的问题

要明白不同算法的 优缺点,还要知道采用不同的数据结构结果可能大不相同。所以,算法和数据结构是不分家的

二分查找:

二分查找算法:每次都可以减少一半的量,前提是列表必须有序

 对于二分查找,从中间开始。这样每次就可以减少一半的量,最多需要lgN步,O(logN)。与之相对应,简单逐个查找,则最多需要N步,O(N)。

二分代码如下:

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

 大O表示法

大O表示法如下,一定注意括号里面的n的意义O表示法让你能够比较操作数(或者运行时间),它指出了算法运行时间的增速。 

大O表示法数说的 是最糟糕的情形。除最糟情况下的运行时间外,还应考虑平均情况的运行时间。

几种常见的大O运行时间:

 

 二、选择排序

主要内容 :

  • 讲解最基本的数据结构:数组和链表,区分不同之处;
  • 介绍选择排序。排序很重要,如二分查找,前提是有序列表。选择排序是快速排序的基石

数组,链表操作的运行时间:

数组中的元素是相连的,而链表中的元素则可存储在内存中的任何地方 

选择排序

遍历列表中的每个元素一次,每次找到最小或最大值,总时间为O(n2

代码如下:

 1 def findSmallest(arr):
 2     smallest = arr[0]
 3     smallest_index = 0
 4     for i in range(1, len(arr)):
 5         if arr[i] < smallest:
 6             smallest = arr[i]
 7             smallest_index = i
 8     return smallest_index
 9 #现在可以使用这个函数来编写选择排序算法了。
10 def selectionSort(arr):
11     newArr = []
12     for i in range(len(arr)):        #代表从0到len,不包括len
13         smallest = findSmallest(arr)
14         newArr.append(arr.pop(smallest))
15     return newArr
16 
17 print (selectionSort([5, 3, 6, 2, 10, -11]))
View Code

 

  三、递归

“如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解。如何选择要看什么对你来说更重要。”

递归,是函数调用自己

 基线条件与递归条件:递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。
如下图:

 

 

 

 另外一种数据结构:栈,只有两种操作: 压入(插入)和弹出(删除并读取)

由下面的代码注意体会函数调用会用到栈

代码:

 1 def greet(name):
 2     print ("hello, " + name + "!")
 3     greet2(name)
 4     print ("getting ready to say bye...")
 5     bye()
 6 
 7 def greet2(name):
 8     print ("how are you, " + name + "?")
 9 def bye():
10     print ("ok bye!")
11 
12 greet("Lin")

 

结果:

hello, Lin!
how are you, Lin?
getting ready to say bye...
ok bye!

 

使用栈,方便,但是要付出内存的代价。

 

 

 

 

 

以上是关于《算法图解》的主要内容,如果未能解决你的问题,请参考以下文章

图解 Google V8 # 05:函数表达式的底层工作机制

《算法图解》代码实现和改进

《算法图解》示例代码的实现

图的最小生成树算法(图解+代码)| 学不会来看我系列

算法基础| 二分图解及代码模板

《算法图解》经典高清中文PDF+英文PDF+源代码