记:冬天真的处于冬眠状态了,一个午觉睡了一下午...就离谱呐,晚上去健身了,第二章库存,惭愧,今天没学习成,大话数据库看到第三章了,因为开始提到了算法的实现,所以打算把C++模块也复习起来创个文件夹,自己用C++试着写写
2.2 数据结构与算法关系
?? ?介绍了重要的数据结构后再把相应的算法拿出来讲,而不是单独讲哪一方面(第三章开始体会到两者的关系)
2.4 算法定义
? ? ?算法(Algorithm):是描述解决问题的方法,对计算机来说就是指令的有限序列。
? ? ?指令:能被人或机器等计算装置执行
? ? ?为了解决某个问题,就需要把指令表示成一定的操作序列,操作序列包括一系列操作,每个操作都完成特定的功能,这就是算法了(个人理解:相当于做一道菜,按照食谱一步步完成指令)
? ? ?对于一个问题来说有很多种算法来解决,但没有通用的算法(就像没有包治百病的药)
2.5 算法的特性
? ? 算法的五个基本特性: ?? ?1.输入输出:零个(直接输出hello world就不需要输入)或多个输入,至少一个(不需要输出就不用算法了)或多个输出 ?? ?2.有穷性:算法在执行了有限的步骤后,自动结束,而不是无限循环 ?? ?3.确定性:每一步都有确定的含义,不会出现二义性 ?? ?4.可行性:每一步必须可行,每一步能通过执行有限次数完成
2.6 算法设计的要求
? ? ?虽然算法不唯一,但相对好的算法应该具备以下性质:
? ? ?1.正确性:算法没有语法错误;对于合法输入的数据能够满足要求的输出结果;对于非法输入数据能够有错误说明(一般情况下,判断算法是否正确的标准);对刁钻的测试数据也能有满足需求的输出(最难的要求) ?? ?2.可读性:便于他人理解 ?? ?3.健壮性:当输入数据不合法时,算法也能作出相关处理,而不是产生异常或随机结果 ?? ?4.时间效率高和存储量低:尽量保持时间复杂度和空间复杂度都低(这个地方是个人理解的,不知道对不对)
2.7 算法效率的度量方法
?? ?事后统计方法:设计好测试程序和数据再利用计算机进行运行比较 ?? ?事前分析估算法:在程序编制前就用统计学方法对算法进行估计 ?? ??? ??? ??? ??? ?通过算法实践复杂度来估算算法时间效率
2.8 函数的渐进增长
?? ?在输入规模一定(都是n)的情况下,只要超过一个数值N(n>N之后),这个函数f(n)就总是大于另一个函数g(n),我们则称函数是渐进增长的。 ?? ??? ?1.随着n的增大,后面加的常数基本不影响算法变化,所以可以忽略这些加法常数 ?? ??? ?2.最高次项相乘的常数并不重要 ?? ??? ?3.最高此项的指数大的,函数随着n的增长,结果也会变得增长特别快 ?? ?总结:判断一个算法的效率,函数中的常数和其他次要项常常可以忽略,更应该关注主项(最高阶项)的阶数
2.9 算法时间复杂度
?? ?算法时间复杂度:即算法的时间度量,是算法的渐进时间复杂度简称,记作T(n)=O(f(n)),T(n)是语句总的执行次数,f(n)是输入规模n的某个函数。随着n的增大,T(n)增长最慢的算法为最优算法 ?? ?大O记法:用大写O()来体现算法时间复杂的记法 ?? ?O(1)常数阶 ?O(n)线性阶 ? O(n2)平方阶 ?? ?如何分析算法的时间复杂度呢?即如何推导大O阶(基本就是2.8总结的三点) ?? ??? ?1.用常数1取代所有的加法常数 ?? ??? ?2.只保留最高阶项 ?? ??? ?3. 如果最高阶存在且不为1,则去掉它的系数
2.10 常见的时间复杂度:
?常见的时间复杂度表:
?? ?所耗费的时间从小到大依次是:
?
2.11 最坏情况和平均情况?? ?
?? ?最坏运行时间:运行时间不会比这个再长了(打麻将摸到最后一张108张),没有特殊说明情况下的默认 ?? ?平均运行时间:期望的运行时间,n/2次后发现目标元素(从概率角度,假设某个数字在每个位置的可能性是相同的)
2.12 算法空间复杂度
?? ?空间上的开销来换取换取时间,其实两种方法没有好坏之分,就像考研报班,有预算的就直接报班,没钱就花时间慢慢摸索准备,具体情况具体分析。 ?? ?
|