趣学算法系列-算法之美

趣学算法系列-算法之美

声明:本系列为趣学算法一书学习总结内容,在此推荐大家看这本算法书籍作为算法入门,
原作者博客链接,本书暂无免费电子版资源,请大家支持正版

书籍简介

本书内容按照算法策略分为7章。
- 第1章从算法之美、简单小问题、趣味故事引入算法概念、时间复杂度、空间复杂度的概念和计算方法,以及算法设计的爆炸性增量问题,使读者体验算法的奥妙。
- 第2~7章介绍经典算法的设计策略、实战演练、算法分析及优化拓展,分别讲解贪心算法、分治算法、动态规划、回溯法、分支限界法、线性规划和网络流。每一种算法都有4~10个实例,共50个大型实例,包括经典的构造实例和实际应用实例,按照问题分析、算法设计、完美图解、伪代码详解、实战演练、算法解析及优化拓展的流程,讲解清楚且通俗易懂。附录介绍常见的数据结构及算法改进用到的相关知识,包括sort函数、优先队列、邻接表、并查集、四边不等式、排列树、贝尔曼规则、增广路复杂性计算、最大流最小割定理等内容。


读后推荐心得

书籍从大量的趣味故事以及图像展示,向读者生动的的分析和描述了算法问题的分析过程,一图胜千言,图像联合记忆的效果也远比文字讲解效果出众,并且配有专门的答疑QQ群交流,博客内容记录分析,值得推荐。
以下内容在原作基础上进行了删减或者自我理解加工,详细内容请查看原作书籍。

第一章 算法之美

瑞士著名的科学家 N.Wirth 教授曾提出: 数据结构+算法=程序。
数据结构是程序的骨架,算法是程序的灵魂。
- 什么是算法?
算法是为解决一个特定的问题而精心设计的一套数学模型以及在这套数学模型上的一系列操作步骤,这些操作步骤将问题描述的输入数据逐步处理、转换,并最后得到一个确定的结果。-出自《算法的乐趣》-王晓东
以下内容也有出自此书籍中的总结,由于篇幅零散在此提前说明。
- 算法具有以下特性。
- 有穷性:算法是由若干条指令组成的有穷序列,总是在执行若干次后结束,不可能永不停止。
- 确定性:每条语句有确定的含义,无歧义。
- 可行性:算法在当前环境条件下可以通过有限次运算实现。
- 输入输出:有零个或多个输入,一个或多个输出。

  • 算法的好坏标准
    • 正确性:满足问题的需求,运行正常,无语法错误,
      通过软件测试。
    • 易读性:简洁易懂,注释语句恰当适量。
    • 健壮性:算法对非法数据及操作有较好的反应和处理。
    • 高效性:算法运行效率高,即算法运行所消耗的时间短。
    • 低存储性:低存储性是指算法所需要的存储空间低。
    • 六字总结:高效率 低存储
  • 算法的时间复杂度

    最好、最坏和平均情况分别求算法渐近复杂度,但我们考查一个算法通常考查最坏的情况,而不是考查最好的情况,最坏情况对衡量算法的好坏具有实际的意义。
    О(1)<О(logn)<О(n)<О(nlogn) <О(n)<О(n)<О(2) <О(n!)<О(n)


函数增长曲线
  • 代码的量化指标
    • 代码注释率             适当注释 规范注释
    • 平均源代码文件长度
    • 平均函数长度          每个行数尽量不超过50行
    • 平均代码依赖度       设计模式原则解耦与抽象
    • 代码嵌套深度          避免多重的循环与判断
    • 测试用例覆盖度       异常情况的处理 不合法操作的处理
  • 算法的空间复杂度、
  • 算法占用的空间大小。一般将算法的辅助空间作为衡量空间复杂度的标准。空间复杂度的本意是指算法在运行过程中占用了多少存储空间。算法占用的存储空间
    包括:

    • (1)输入/输出数据;
    • (2)算法本身;
    • (3)额外需要的辅助空间。
  • 算法学习瓶颈

    很多人感叹:算法为什么这么难。算法作为一门学问,有两条几乎平行的线索。一个是数据结构(数据对象):数、
    矩阵、集合、串、排列、图、表达式、分布等。另一个是算法策略:贪心、分治、动态规
    划、线性规划、搜索等。
    传统的算法书大多注重
    内容的收录,但却忽视思维过程的展示,因此我们学习了经典的算法,却费解于算法设计
    的过程。

  • 本章主要说明问题
    • (1)将程序执行次数作为时间复杂度衡量标准。
    • (2)时间复杂度通常用渐近上界符号 f(n)表示。
    • (3)衡量算法的好坏通常考查算法的最坏情况。
    • (4)空间复杂度只计算辅助空间。
    • (5)递归算法的空间复杂度要计算递归使用的栈空间。
    • (6)设计算法时尽量避免爆炸级增量复杂度。
  • 程序员必须要会算法吗?   计算机其实是一种很傻的工具,傻到几乎没有智商(至少目前是这样),我暂且理解为面向傻瓜编程(在设计算法思路时这个原则 可以更好的帮助理解你设计变量 变量交换传递等过程)。   计算机愿意做,但前提是你要告诉它怎么做。算法可以理解为这样一种技术,它将告诉计算机怎么做。   计算机程序最重要的两点,那就是算法和数据结构。说数据结构和算法没用的人是因为他们用不到,用不到的原因是他们想不到,而想不到的原因是他们不会。就如小学生很少能看懂高等数学,当你的水平不到一定的层次,你就对所认知的东西有所抵触,不理解不等于不认同,存在即合理,算法工程师的薪资已经说明问题。