14天阅读挑战赛
《趣学算法(第2版)》读书笔记 Part 1 :如何高效学习算法
《趣学算法(第2版)》读书笔记 Part 2 :算法入门
《趣学算法(第2版)》读书笔记 Part 3 :贪心算法基础(理论)
《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)
对应图书1.1-1.2章节内容。
算法是对特定问题或解步骤的一种描述。
通常使用伪代码来描述算法。
算法的描述不依赖于任何一种语言,可用自然语言、程序设计语言(C,C++,Java,Python等)、伪代码、流程图、框图描述。
算法具有以下特性:
(1)有穷性:算法是由若干条指令组成的有穷序列,总是在执行若干次后结束,不可能永不停止。
(2)确定性:每条语句都有确定的含义,无歧义。
(3)可行性:算法在当前环境条件下可以通过有限次运算来实现。
(4)输入/输出:有零个或多个输入,以及一个或多个输出。
“好”算法的标准如下:
即算法的时间复杂度和空间复杂度。
算法的时间复杂度:算法运行所需的时间。
将算法基本运算的执行次数作为时间复杂度的衡量标准。
现代计算机一秒能计算数十亿次,所以不能用秒来具体计算算法消耗的时间。由于相同配置的计算机进行一次基本运算的时间是一定的,可以用算法基本运算的执行次数来衡量算法的效率。
有的如排序、查找、插入等算法,可以分为最好、最坏和平均情况分别求法渐近复杂度。但考查一个算法时通常考查最坏的情况,这对衡量算法的好坏更貝有实际意义。
算法的空间复杂度:算法占用的空间大小。
空间复杂度的本意是指算法在运行过程中占用了多少存储空间。
算法占用的存储空间包括:
参考资料:
算法
百度百科的算法释义 https://sourl.cn/yUc5qA
基于Python的算法释义 http://t.csdn.cn/vfiQP
伪代码
伪代码语法 http://t.csdn.cn/Tiqec
伪代码详细规则与实例 http://t.csdn.cn/SDShz
伪代码学习与应用 http://t.csdn.cn/3NmRt
栈
详解栈Stack和队列Queue http://t.csdn.cn/bhz1o
基于Python讲解栈及应用 http://t.csdn.cn/U7XyN
基于Python讲解栈及LeetCode实例 http://t.csdn.cn/hFccV
递归
递归算法 http://t.csdn.cn/T3T5t
递归算法详解 http://t.csdn.cn/UkxK8
Python:递归算法(基础) http://t.csdn.cn/RKCb8
Python:递归算法(深入) http://t.csdn.cn/dTb9B
读书笔记:
“伪代码"介于自然浯盲和程序设计语言之间,它更符合人们的表达方式,便于理解。它不是严格的程序设计语言。如果要上机调试,则要转换为标准的计算机程序设计语言才能运行。
伪代码(Pseudocode)
伪代码是一种非正式的,类似于英语结构的,用于描述模块结构图的语言。它提供了更多的设计信息,每一个模块的描述都必须与设计结构图一起出现。
伪代码介于自然语言与编程语言之间。它可以将整个算法运行过程的结构用接近自然语言的形式描述出来,即使用你熟悉的文字描述一段程序所表达的意思。使用伪代码的目的是使被描述的算法可以容易的以任何一种编程语言(C,C++,Java,Python等)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。
伪代码多用于程序设计初期,像流程图一样帮助写出程序流程。简单的程序一般都不用写流程、思路,若是复杂的代码最好还是把流程写下来,写好的伪代码不仅可用作编程后期测试、维护的基础,也便于用来与他人交流。
伪代码有不同的类型和语法,例如《趣学算法(第2版)》书中就是使用的类C++伪代码(注:这里不确定,因为程序设计语言我目前只学过Python和C#,但是看书中伪代码的语法结构蛮像C++ )。
说到伪代码就不得不提的程序设计语言:Python
Python语言,我接触的第一门程序设计语言,对小白相对友好。
讲个笑话:
将伪代码更改为Python代码的方法
以计算机科学界大佬的标准来看,Python语言极具语义化的特性就像是伪码,甚至比伪代码还简洁。
hahahahahaha…
章节1.2讲解实例时配了一些微积分求导公式和线性图,需要读者具备一定微积分和线性代数的高等数学基础。
栈 stack
栈,又名堆栈。原意为存储货物或供旅客住宿的地方,可引申为仓库、中转站,引入到计算机领域就是指数据暂时存储的地方,所以才有进栈、出栈的说法。
栈是一种运算受限的线性表,限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈是一种只能在一端进行插入和删除操作的特殊线性表,即它允许在同一端进行插入和删除操作,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom)。栈底固定,而栈顶浮动。栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈多用于做递归,以及在函数调用的时候存储断点。栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。
递归算法
递归的定义:递归是一种直接或者间接调用自身函数或者方法的算法。即程序对自身的调用,其实就是自己调用自己。
递归的特征:存在一个或者多个基例,基例并不需要调用自己,它是一个确定的表达式。所有的递归链结尾均是基例。
递归的运行原理:递归调用过程是入栈操作过程,递归返回过程是出栈操作过程。
解锁思维导图新用途
写博文前,先整理思路写一份简略的思维导图,作为文章提纲用。
突然发现思维导图在读书笔记中更像文章下笔前起草的一份提纲,在写笔记前先写一份思维导图极度有助于保持清晰的思路,节省了我花在内容结构安排上的思索时间。
好吧,突然意识到这其实就是一种算法优化,hahaha…