解决问题方法的效率,跟数据的组织方式有关。
循环和递归
解决问题方法的效率,跟空间的利用效率有关。
解决问题方法的效率,跟算法的巧妙程度有关
数据对象在计算机中的组织方式
- 逻辑结构:线性结构和树结构、图结构
- 物理存储结构:数组、链表
数据对象必定与一系列加在其上的操作相关联
完成这些操作所用的方法就是算法
- 数据类型
- 数据对象集
- 数据集合相关联的操作集
- 抽象:描述数据类型的方法不依赖于具体实现
- 与存放数据的机器无关
- 与数据存储的物理结构无关
- 与实现操作的算法和编程语言均无关
只描述数据对象集和相关操作集是什么,并不涉及如何做到的问题
- 一个有限指令集
- 接收一些输入(有些情况下不需要输入)
- 产生输出
- 一定在有限步骤之后终止
- 每一条指令必须
- 有充分明确的目标,不可以有歧义
- 计算机能处理的范围之内
- 描述应不依赖与任何一种计算机语言以及具体的实现手段
- 空间复杂度sn
根据算法写成的程序在执行时占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。
- 时间复杂度Tn
根据算法写成的程序在执行时耗费时间的长度。这个长度往往也与输入数据的规模有关。时间复杂度过高的低效算法可能导致我们在有生之年都等不到运行结果。
递归的时候会占用内存,因为递归下一层的时候要暂存上一层的结果
Sn = C*N
加减比乘除算的快
在分析一般算法的效率时,我们经常关注下面两种复杂度
- 最坏情况复杂度T worst(n)
- 平均复杂度T avg(n)
基本上就是第一种:最坏情况复杂度
- 同一个问题可以有不同的表示(存储)方法
- 有一类共性问题:有序线性序列的组织和管理
由同类型数据元素构成有序序列的线性结构
- 表中元素个数成为线性表的长度
- 线性表没有元素时,称为空表
- 表起始位置称表头,表结束位置称表尾
链式存储实现
- 广义表是线性表的推广
- 对于线性表而言,n个元素都是基本的单元素
- 广义表中,这些元素不仅可以是单元素也可以是另一个广义表
多重链表:链表中的节点可能同时隶属于多个链
- 多重链表中结点的指针域会有多个,如前面例子包含了netx和sublist两个指针域
- 但包含两个指针域的链表并不一定是多重链表,比如在双向链表不是多重链表
多重链表有广泛的用途:
基本上如树、图这样相对复杂的数据结构都可以采用多重链表方式实现存储
堆栈stack :具有一定操作约束的线性表
- 只有一端(栈顶,top)做插入、删除
- 插入数据:push入栈
- 删除数据:pop出栈
- 后入先出:LIFO
中缀表达式转成后缀表达式
堆栈的其他应用:
- 函数调用及递归实现
- 深度优先搜索
- 回溯算法
队列及实现
队列:queue具有一定操作约束的线性表
- 插入和删除操作:只能在一端插入,而在另一端删除
- 数据插入 入队列 AddQ
- 数据删除 出队列DeleteQ
- 先来先服务
- 先进先出 FIFO
分层次组织在管理上具有更高的效率
数据管理的基本操作之一:查找
如何实现有效率的查找
searching
二分查找
DBEFAGHCI
DEFBHGICA
路线是一样的, 第一次碰到就输出的叫做先序、第二次的叫做中序、第三次的叫做后序
判断同构
判断有没有哪个节点没有被指向 哪个节点就是根
例如231被指向了,那么意思就是0这个节点是根节点
使用check来判断根节点
尾递归可以用循环实现
查找的效率决定于树的高度
所以走台阶问题我大概懂了
只能一次走一阶台阶或者一次走两阶台阶
一阶台阶有1种走法
二阶台阶有2种走法
那么三阶台阶无非就是1阶台阶的走法+走2阶的走法(2)
或者2阶台阶的走法+走1阶的走法(1)
那么四阶台阶无非就是2阶台阶的走法+走2阶的走法(2)
或者3阶台阶的走法+走1阶的走法(1)
所以也就是斐波那契数列的性质
F(n)=F(n-1)+1+F(n-2)+2
必须保证是查找树 也就是左边小右边大
实现堆用完全二叉树
根节点是最大的完全二叉树
i/2就是完全二叉树的父节点
因为是完全二叉树,所以要用最后一个元素替补删除掉的那个元素,才能满足完全二叉树的性质
时间复杂性就是树的高度 log2n
从倒数第二层开始建立堆,建完之后逐层往上建立,
如何根据节点不同的查找效率构造更有效的搜索树
由于度为1的节点就是只有一个儿子的节点
没有度为1的节点
那么就是n2+n1+n0=n0-1+0+n0=2n0-1
第二种的意思是, 我用2的三次方也就是8种不同的符号来表示7个字符绰绰有余
当所以的值都在叶节点上的时候就不可能出现一个字符的编码是另一个字符的前缀
用数组实现
这样做会导致一边倒,会让高度增加 find操作很难效率查
可以尝试把集合小的挂到集合大的下面
直接简化成把值为3对应为下标为3的数组中的,数组里存的值是他的父节点
无向图 对称 那么会不会空间浪费呢
访问完所有的之后一定是原路返回
利用堆栈
明白为啥是深度优先了
会走的比较深
一圈一圈的搜索
六度空间
![image-20210901203454720](数据结构与算法.assets/image-20210901203454720.png)
即根据先序遍历和中序遍历得到后序遍历