最近计划重新开始学习数据结构和算法了
以下是关于《大话数据结构》第二章 读后总结
在此记录一下自己的理解和思考
概念一:算法的定义
书中:
是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作
个人理解:
能够更快更巧妙的去计算解决一个数学问题的思路方法和实现步骤。
要类比的话就好比在农场中,人类可以利用袁隆平爷爷发明的杂交水稻的方法(算法)更快的去解决一个自然培育方法(普通的方法)所难以解决的粮食产量问题(数学问题)。
概念二:算法的特性
书中:
算法具有五个基本特性:
① 输入:接受零个或多个输入
② 输出:至少有一个或多个输出
③ 有穷性:执行结果在可接受的时间内完成
④ 确定性:执行的每个步骤都被精确定义
⑤ 可行性:执行的每一步的是可以实现的
个人理解:
算法的特性,
好比用天然户外种植和杂交水稻的方式进行种植,一片土地可以看成是一个神奇黑匣子。
你给它春天播下种子(输入)并不断的浇水(可行性),保证充足的水分和阳光(确定性)他就能够在秋天(有穷性)给你丰收的果实(输出)。当然你不种东西(零输入),他也可能给你长出杂草(输出)
要是杂交水稻的例子,那就更能体现这个特性,你这个杂交的方法(算法),是否可行(理论到实操:可行性),怎么进行杂交的(步骤和操作:确定性),要提供什么(输入),能产出什么(输出),多久能看到产出(有穷性)。
概念三:算法设计的要求
书中:
① 正确性:算法至少应该具有输入,输出和加功处理无歧义性,能正确反映问题的需求,能够得到问题的正确答案。
② 可读性:算法设计的另一目的是为了便于阅读,理解,交流
③ 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名奇妙的结果
④ 时间效率高和存储量低:设计算法应该尽量满足时间效率高和存储量低的要求
个人理解:
还是拿杂交水稻方法来说,能够拿出来作为算法的方法,那肯定要能够提高产能确实解决温饱问题(正确性),无异议的,一般人都能理解和明白(可读性)公认这个方法没问题。当然最好,在能快速提高产能(时间效率高)的情况下,还能够用消耗更少的资源,比如财力物力人力等(存储量低)。然后这个方法在筛选种子(输入)的时候是否有要求(健壮性)
概念四:算法效率的度量方法
书中:
① 事后统计法:通过设计好的测试程序和数据,利用计时器对不同算法编制的程序的运行时间进行比较。
② 事前分析估算法:在程序编制前,依据统计方法对算法进行估算。
个人理解:
事后统计法就是直接用计时器,直接看不同算法运算出结果时的总时间。
事前分析估算法就是大概数一下有哪些步骤,哪些步骤要花多长时间,进行简单的累加估算
概念五:函数的渐近增长
书中:
① 函数的渐近增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,
f(n)总是比g(n)大,那么,我们说f(n)的增长渐近快于g(n)
个人理解:
相当于龟兔赛跑中,兔子和乌龟的比赛,虽然兔子提前让乌龟了跑了很多距离,但是兔子的加速度注定的天生的就会比乌龟还要快,所以只要终点是在无限长的位置,兔子🐇一定能超越并且是远超越乌龟🐢,
除非终点不长,就像我们常听到的那个故事的结果(🐢赢了🐇)。。。
因为不管一开始乌龟拉了兔子多长距离,只要兔子一发力,总有一个位置会是兔子和乌龟相遇的地方。
所以不同的算法,因该要考虑N的取值范围,算法A的基因比算法B基因优秀,但是如果在在指定的某些范围内,算法A就不一定要优于算法B。
概念六:算法的时间复杂度
书中:
① 算法时间复杂度的定义:
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并切丁T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
② 常见的时间复杂度
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
③ 最坏情况和平均情况
在查找的算法中,时间一般没有特殊说明按照最坏情况计算。
平均的查找时间一般为(n+1)/2,平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。
④ 算法的空间复杂度
通过计算算法所需要的存储空间
个人理解:
算法执行得到结果得总时间和影响总时间得各个因素的总关系。比如,从播种到获取果实的时间,是由水分,阳光等环境因素影响。
还有比较直观能理解的常见的关系,就是初中学习的 y = 1, y = x, y = x^2,y = log2x
把y比作总时间,x比作因素, y = 1 ,说明因素x的变化对y总时间没啥影响
y = x, 说明总时间会随这x的增长而增长,呈线性关系
至于为什么平均的查找时间为 (n+1)/ 2
假设 我们在台球上,放着五粒桌球,分别为1,2,3,4,5号。我们的目标是摸出一号球。
假设我们每次都从第一个位置开始摸,
如果第一次的位置是 【1,2,3,4,5】,则第一次就摸中,胜利✌
但是 一号球 也有可能在第二个位置【2,1,3,4,5】,则按照我们摸法,得摸第二次才摸中
但是 一号球 也有可能在第三个位置【2,3,1,4,5】,则按照我们摸法,得摸第三次才摸中
但是 一号球 也有可能在第四个位置【2,3,4,1,5】,则按照我们摸法,得摸第四次才摸中
但是 一号球 也有可能在第五个位置【2,3,4,5,1】,则按照我们摸法,得摸第五次才摸中
所以我们要摸到 一号球 的次数 存在5种可能,分别是1次,2次,3次,4次,5次
所以直观感觉就知道 摸到一号求 的平均次数 就应该就是 3 次。就是取中间值
数学公式就是 (n+1)/ 2。
至于空间复杂度的理解应该就是非常直观,即占用空间的大小和影响空间大小因素的关系。
以上就是 对第二章(算法)的 总结归纳~
希望自己理解的没有啥错误😅