数据结构与算法经典书籍
数据结构与算法分析(C语言版)Mark Allen Weiss 著 电子版资源
链接:https://pan.baidu.com/s/1rYO--1dISsd1dlobUPoJmQ?pwd=6666
提取码:6666
B站视频链接:
【数据结构与算法分析-(数据结构上篇完)】 https://www.bilibili.com/video/BV1rq4y1a7uA/?share_source=copy_web&vd_source=63b2bec79fe7e44c34a744e91284ebb2
第一章 引论
递归:当一个函数用他自己来定义时就称为是递归。
基准情形:你必须总要有某些基准的情形,他们不用递归就能求解
不断推进:对于那些需要递归求解的情形,递归调用必须总能够朝着产生基准情形的方向推进
第二章 算法分析
算法是为求解一个问题需要遵循的、被清除地指定的简单指令的集合。对于一个问题,一旦给定某种算法并且(以某种方式)确定其是正确的,那么重要的一步就是要确定该算法将需要多少诸如时间或者空间等资源量的问题。如果一个问题的求解算法需要长达一年时间,那么这种算法就很难有什么用处,同样,一个需要1G字节内存的算法在当前的大多数机器上也是没法使用的。
2.1数学基础
2.2模型
2.3要分析的问题
2.4运行时间的计算
- 法则1:for循环:一次for循环的运行时间至多是该for循环内语句(包括测试)的运行时间乘以迭代的次数
- 法则2:嵌套的for循环:从内向外分析这些循环。在一组嵌套循环内部的一条语句总的运行时间为该语句的运行时间乘以该组所有的for循环的大小的乘积。
- 法则3:顺序语句:将各个语句的运行时间求和即可(着意味着其中 的最大值就是所得的运行时间)
当N越来越大时,忽略O(N)
- 法则4:IF/ELSE语句:一个if/else语句的运行时间不会超过判断再加上S1和S2中运行时间长者的运行时间。显然再某些情况下这么估计有些过高,但绝不会过低。
2.4.3最大子序列和问题的解
第三章 表、栈和队列
3.1抽象数据类型(ADT)
模块化优点:
- 调试小程序比调试大程序要容易得多
- 多个人同时对一个模块式程序编程要更容易
- 一个写得好的模块化程序把某些依赖关系只局限在一个例程中,这样使得修改起来会更容易
抽象数据类型(ADT)是一些操作的集合。抽象数据类型式数学的抽象,在ADT的定义中根本没涉及如何实现操作的集合,这可以看作是模块化设计的扩充。
对诸如表、集合、图和它们的操作一起可以看作是抽象数据类型,就行整数、实数和布尔量是数据类型一样。整数、实数及布尔量有与它们相关的操作而抽象数据类型也有与它们自己相关的操作。对于集合ADT,我们可以有诸如并、交、测定大小以及取余等操作,或者,我们也可以只要两种操作又在该集合上定义了一种不同的ADT
3.2表ADT
为避免插入和删除的线性开销,我们需要允许表可以不连续存储,否者表的部分或全部指向需要整体移动。链表由一系列不必存在内存中相连的结构组成。每一个结构均含有表元素和指向包含该元素后继元素的结构的指针,我们称之为Next指针。最后一个单元的Next指针指向NULL;该值由C定义并且不能与其它指针混淆。ANSI C 规定NULL为零
我们将留出一个标志结点,有时候称之为表头或哑结点这是通常的一种习惯。防止表的丢失
3.3栈ADT
3.4队列ADT