《算法图解》

Dufy>>>OpenMind,FreeHeart Dufy>>>OpenMind,FreeHeart     2022-09-07     335

关键词:

 前三章是打基础的,后面介绍的是应用广泛的算法。书中代码均用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!

 

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

 

 

 

 

 

图解系列之垃圾收集复制算法

查看详情

《算法图解》

 前三章是打基础的,后面介绍的是应用广泛的算法。书中代码均用Python2.7编写一、算法简介算法是一组完成任务的指令书中介绍算法的流程:描述算法----示例代码------大O()讨论运行时间-----可以解决的问题要明白不同算法的... 查看详情

分布式共识算法——paxos算法(图解)

文章目录PaxosPaxos概念Paxos角色Paxos算法流程Paxos算法两个阶段第一阶段:准备阶段第二阶段:批准阶段总结:图解算法流程举例说明算法流程图解说明一个简单的提案情况1:正常情况两个提案并发进行情况2:S3... 查看详情

分布式共识算法——paxos算法(图解)

文章目录PaxosPaxos概念Paxos角色Paxos算法流程Paxos算法两个阶段第一阶段:准备阶段第二阶段:批准阶段总结:图解算法流程举例说明算法流程图解说明一个简单的提案情况1:正常情况两个提案并发进行情况2:S3... 查看详情

图解系列之垃圾收集标记-清除算法

查看详情

图解系列之垃圾收集标记整理算法

查看详情

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

这几天看了《算法图解》,把里面的示例代码都实现了一边,在github上找到了一位朋友的仓库,fork了他的。里面有我们添加的Python,Java,C++的实现,欢迎大家fork!!! 附上网址:https://github.com/lynxux/AlgorithmDiagram 查看详情

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

《算法图解》代码实现和改进请随意观看表演二分查找数组和链表递归递归条件和基线条件快速排序散列表广度优先搜索狄克斯特拉算法贪婪算法 二分查找defbin_search(list,item):low=0high=len(list)-1whilelow<=high:mid=(low+high)//2#得到... 查看详情

paxos算法详细图解

1、Paxos算法的应用   Paxos算法及变种算法在分布式系统中应用广泛。   基于Paxos算法的变种有:ZAB、Raft   例如:   ?Zookeeper中的ZAB协议也是Paxos算法的变种。Zookeeper通过ZAB协议实现数据... 查看详情

分布式共识算法——raft算法(图解)(代码片段)

文章目录Raft算法Raft算法概念Raft角色Raft算法流程Raft算法原理角色关系任期原理通信原理图解算法流程选举过程执行操作过程(日志复制)确保安全Leader日志的完整性选民日志的一致性Raft算法Raft算法概念Raft是一种分布式... 查看详情

分布式共识算法——raft算法(图解)(代码片段)

文章目录Raft算法Raft算法概念Raft角色Raft算法流程Raft算法原理角色关系任期原理通信原理图解算法流程选举过程执行操作过程(日志复制)确保安全Leader日志的完整性选民日志的一致性Raft算法Raft算法概念Raft是一种分布式... 查看详情

图解排序算法-插入排序

插入排序图解:时间复杂度O(n^2),空间复杂度O(1)数组:[243,5,7,22,3] 核心代码实现:1packageorg.apel.test.rp.test.sort;23/**4*插入排序5*@authoralexlee6*7*/8publicclassInsertionSortextendsAbstractSort{910publicInsertionSort(int[]da 查看详情

图解算法系列之选择排序(代码片段)

选择排序(1)算法描述对于给定的一个线性空间,维护两个区域——“已排序区域”和“未排序区域”。遍历每一个元素,找出该元素后边所有元素中,比当前元素绝对值相差最大的元素,与该元素交换位置。(2)算法图解void... 查看详情

推荐书籍:《算法图解》

本书示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量。书中的前三章将帮助你打下基础,带你学习二分查找、大O表示法、两种基本的数据结构以及递归等。余下的... 查看详情

图解排序算法-希尔排序

希尔排序图解:时间复杂度O(nlog2n),空间复杂度O(1)数组:[243,5,7,22,3,11] 核心代码实现:1packageorg.apel.test.rp.test.sort;23/**4*希尔排序5*@authoralexlee6*7*/8publicclassShellSortextendsAbstractSort{910publicShellSort(int[]data 查看详情

算法图解-贪婪算法(代码片段)

内容:如何处理不可能完成的任务;没有快速算法的问题(NP完全问题)学习是被NP完全问题,以免浪费时间去寻找解决他们的快速算法学习近似算法,使用它们可快速中找到NP完全问题的近似解学习贪婪策略——一种非常简单的... 查看详情

图解排序算法之希尔排序

  希尔排序是希尔(DonaldShell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图... 查看详情

图解排序算法之希尔排序

  希尔排序是希尔(DonaldShell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图... 查看详情