170618 杂项-二叉搜索树和图的相关算法

1625-5 王子昂 总结《2017年6月18日》 【连续第259天总结】

A. 二叉搜索树和图

B. 二叉搜索树:
每个节点拥有一个关键字,通常要求关键字彼此不通
左子树下的节点的关键字都要小于根节点,右子树下的节点的关键字都要大于根节点。
在查找数据的时候,只需要判断数据和当前节点的大小就可以决定向其的左子数或是右子数继续查找了
优点在于,当需要插入或删除数据的时候,线性数据结构需要调整插入位置之后的所有数据;而二叉搜索树的插入只需要不断比对,放置于某个叶节点的下方即可;删除相对要麻烦一些,需要判断以谁来替代被删除的节点。
缺点是,当插入的数据本身是有序(或接近有序时),将会产生形如一棵只有右子节点的数,这样要搜索数据时需要遍历整个队列。
因此在插入数据时需要尽可能的保证叶节点到根节点的深度大致相同。即保证平衡性。为此引入了红黑树、AVL树等



图:
图是边和顶点的集合,可以分为有向图和无向图两种类型。
有向图中,两个通过边连接的顶点是有序的,即边是有方向的
在多重图中,顶点可以与自身相连接;顶点之间可能有多条边
顶点关联的边数,叫做度。在有向图中,还分为入度和出度。以该顶点为终点的边的数量就称为入度。
图有两种表示方法:邻接表和邻接矩阵。
邻接表:每个顶点代表一个表,表中存放着所有与该顶点有邻接关系的顶点。
有向图的邻接表可以只记录发出的边。
邻接矩阵:将每个顶点代表一个行和列来生成一个矩阵,当i和j节点有邻接关系时,(i,j)的值就为1,否则为0;对于有向图和无向图,(i,j)的意义是不同的。由于无向图的边是无序的,因此无向图的邻接矩阵是对称的。  
邻接表只需要(总边数)个存储单元,而邻接矩阵需要(顶点数的平方)个存储单元。当图的边很稠密的情况下,两种表示方法占用的空间差别不大,而当边稀疏的情况下就比较大了。
不过,邻接矩阵的优点在于它的查询较为容易;并且由于图常常要进行矩阵运算,因此用矩阵表示时较为方便


图的遍历:给定图中的任意一个顶点,沿着图中的边访问图中所有的顶点,且每个顶点仅被访问一次
算法有两种:深度优先和广度优先
深度优先:扫描当前节点的子节点是否存在未被访问过的节点,如果存在就访问,然后把该节点作为当前节点重复。假如当前节点的所有子节点都被访问过了,就退回上一个节点。
因此,深度优先遍历是一个不断探查和回退的过程。
深度优先搜索最后的结果是一棵树,因为每个节点只会被访问一次。深度优先生成树在很多地方都有应用。
深度优先搜索的算法分为两种,递归和非递归。递归算法很明显,在搜索到未被访问过的节点时再次执行该函数;而非递归算法则是利用一个栈来保存数据,在搜索到未被访问过的节点时访问,然后将其压入栈顶(即作为当前节点),否则将当前栈顶弹出(即回退),然后执行下一个循环


广度优先:没有探查和回退,而是一个逐层遍历的过程。以开始节点为首层,逐个访问下一层的未访问节点,然后再下一层,不断循环。
因此广度优先还可以用来计算每个节点到起点的最短距离。
在广度优先时同样会记录访问数据,但是这个过程并不是递归的,而是逐层扩展的过程。因此在深度优先中使用栈来存放数据,广度优先中则使用队列。
访问每一个节点的同时将其入列,然后用扫描出列的节点的子节点,不断重复。


拓扑排序:
有向图转换成顶点的线性序列,满足G包含边(U,V)时,在序列中,U就出现在V的前面
可以用于有顺序要求的任务规划,例如穿鞋子之前要穿袜子,修解析几何之前要修几何,等等
算法概述:从有向图中选择一个入度为0的顶点输出,从有向图中删去顶点及其发出的全部有向边,然后重复即可。


更深的叙述可以参阅《算法导论》第二十二章
C
. 明日计划

CrackMe(25)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值