数据结构序(Markdown版)

  1984年图灵奖颁给了尼古拉斯·沃斯(Niklaus Wirth)。
在这里插入图片描述
  他有一句名言:
  Algorithm+Data Structures=Programs
  程序=算法+数据结构
  在这个算法和数据结构被忽视的时代,程序员的日常工作,真的离算法和数据结构很远吗?
  我先很肤浅地理解计算机,计算机由软件和硬件组成,接收来自键盘,摄像头,网卡,麦克风等硬件的输入,转换为数据,这些数据经过操作系统和各种程序的计算后,得出结果再输出到硬盘、显示器、网卡等各种硬件。所以毕加索(Pablo Picasso)有句名言:
毕加索
  Computers are useless. They can only give you answers.
  计算机毫无用处,除了答案,什么也给不了。
  我们是程序员,重点关注的不是硬件设备如何把输入的信号转为数据,也不必过多关注输出的数据如何转换为硬件设备需要的信号。程序员最重要的工作就是编写程序,让程序正确、高效、稳定地处理输入的数据,计算出结果输出。所以从这个角度讲,输入不仅仅是程序中函数的入参,还包括从数据库提取的数据、文件中读取的内容,输入也不仅仅是函数的返回,还包括写入磁盘的内容,存入数据库的数据等等。
  程序处理输入数据,转换为输出数据的过程叫做算法,这些数据之间的关系叫做数据结构。编写程序第一步肯定是仔细研究数据之间的关系,设计出数据结构,才能去设计算法。算法严重依赖数据结构。所以第一步是数据结构,第二步才是算法。
  再看看程序员们日常头痛的问题:
  1. bug似乎无穷无尽;
  2. 代码难以维护;
  3. 需求不断变更,开发跟不上产品的想法;
  4. 性能问题简直是折磨;
  5. 安全问题一不小心就给企业造成巨大损失;
  要解决这五个问题,要养成良好的编程习惯及工作流程:
  1. 无论如何,第一步也是最重要的步骤是认真研究、深刻理解需求;
  2. 根据需求理清数据之间的关系,设计出数据库表结构以及程序中的数据结构;
  3. 根据设计好的数据结构设计出程序的处理逻辑也就是算法,画出流程图、时序图;
  4. 对输入进行数据校验和场景判断,这里所说的输入不仅是用户输入,还包括文件、数据库等;
  5. 根据设计好的算法编写程序;
  6. 对程序中各种可能的异常场景,比如网络、文件异常进行处理;
  7. 仔细对程序进行测试;
  8. 最后一步,编写规范的文档,和程序一起交付给需求方。
  本专栏不讨论如何研究与理解需求,重点在第二步根据需求设计数据结构。程序员都是实用主义者,所有的数据结构都是建立在现实需求的基础上。
  提起数据结构,大部分人都会觉得高深、困难,实际不然,第一:学习数据结构不需要太高的数学基础,不需要懂微积分、概率论、线性代数等高等数学知识;其次:学习数据结构不需要昂贵的硬件设备,普通的电脑完全可以胜任;第三:学习数据结构只需要掌握一门编程语言最基础的语法和极少数的API,不需要太深的编程语言基础。
  数据结构,因为研究的是数据之间的关系,而不是数据本身。为了更清晰地理解,本专栏在数据结构中,会使用两种图形抽象:
  数据抽象为一个点,数据之间的关系会抽象为一条线;
  数据之间的关系抽象为一张表,数据抽象为单元格。
  数据结构中最重要的数据结构是树,最难的是图。因为树有个特性,树的任意两个节点之间只有一条唯一的路径,所以使得很多算法问题都使用树来解决。图算法难则难在NP完全问题上,成为千禧年数学难题,也成为数据结构这门学科发展的最大障碍。所以数据结构近几年发展特别缓慢,也许你们可以解决这个数学难题,成为数据结构真正的大神。
  对于常见的数据结构,我整理了以下表格:

分类数据结构需求/用途
1 数组1.1 一维数组存储数据、数组列表、二叉堆
1.2 多维数组线性代数、动态规划
2 线性结构2.1 链表存储数据、队列、栈
2.2 数组列表存储数据
2.3 循环队列广度搜索
2.4 栈实现递归、宽度搜索、表达式解析
2.5 Floyd链表查环算法Floyd’s Cycle-Finding Algorithm
2.6 Brent链表查环算法Brent’s Cycle-Finding Algorithm
3 堆3.1 二叉堆优先队列
3.2 二项堆可合并优先队列
3.3 斐波那契堆可合并优先队列
4 表4.1 跳表有序集合、有序映射
4.2 哈希表存储数据快速检索、无序集合
5 位图5.1 位集用于压缩存储数据
6 树6.1 搜索算法存储树状关系数据的检索方法
6.2 二叉树遍历
6.3 AVL树快速查找
6.4 红黑树快速查找、有序映射
6.5 赫夫曼树数据压缩
6.6 van Emde Boas树快速查找
6.7 并查集
6.8 B-树磁盘存储,快速查找,m=4的B-树就是2-3-4树
6.9 B+树磁盘存储,快速查找
6.10 Fenwick树快速求前几项和
6.11 2-3-4树B-树和红黑树的桥梁
6.12 段树
  特别地,对于图,需要学习以下算法:
7 图基础7.1 图的介绍点、边、路径、权重等概念
7.2 图的几种分类加权图、无权图、有向无环图
7.3 图的几种存储方式邻接矩阵、邻接数组等方式
8 图基本定理8.1 握手定理
8.2 欧拉定理(图论)
8.3 Dirac’s Theorem (1952)
8.4 Ore’s Theorem (1962)哈密尔顿图的一个充分条件,证明过程类似Dirac定理
8.5 Whitney’s Inequality
8.6 欧拉图论公式
8.7 Kuratowi’s Theorem
8.8 4-color Theorem
8.9 5-color Theorem (Heawood 1890)
8.10 Max-Flow Min-Cut Theorem
8.11 拉姆齐定理(1929)Ramsey's Theorem
9 搜索算法9.1 三色标记BFS
9.2 三色标记DFS
9.3 DFS应用:检测环的存在递归实现
10 最短路径10.1 单源无权BFS适用于无权图
10.2 单源加权Dijkstra适用于加权图
10.3 单源加权D’Esopo-Pape适用于加权图,比Dijkstra更先进
10.4 单源负权Bellman-Ford适用于负权图
10.5 全源负权Floyd-Warshall适用于负权图
10.6 全源负权Johnson适用于负权图
11 最大流问题11.1 Ford-Fulkerson及Edmonds-Karp算法基于增广路径定理
11.2 Dinitz算法基于增广路径定理
11.3 Push-relabel algorithm基于溢出流算法
12 最小生成树12.1 prim算法
12.2 Kruskal算法
12.3 Reverse-Delete算法
12.4 Borüvka Algorithm
13 强连接组件13.1 Kosaraju’s Algorithm两次DFS实现
13.2 Tarjan算法一次DFS实现
14 拓扑排序14.1 Kahn算法
14.2 DFS算法三色标记加上路径数组实现
  祝大家都成为数据结构大神!
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒过来摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值