1、前面讨论了静态查找表,它们的特点是,数据是一次性就给好了。
2、而对于动态查找表,数据可以是在查找过程中动态添加、生成的。其实这概念不太严谨。
3、二叉排序树(BST):左子树上所有结点的值均小于根结点的值;右子树上所有结点的值均大于根结点上的值。
4、二叉排序树的查找过程:
(1)若树为空,直接返回/跳出。
(2)树非空,则
(a)若key==root.data,return true。
(b)若key<root.data, root = root.left[......]
1、前面讨论了静态查找表,它们的特点是,数据是一次性就给好了。
2、而对于动态查找表,数据可以是在查找过程中动态添加、生成的。其实这概念不太严谨。
3、二叉排序树(BST):左子树上所有结点的值均小于根结点的值;右子树上所有结点的值均大于根结点上的值。
4、二叉排序树的查找过程:
(1)若树为空,直接返回/跳出。
(2)树非空,则
(a)若key==root.data,return true。
(b)若key<root.data, root = root.left[......]
概念明天补上。。。
顺序查找,用了哨兵,减少检查数组长度的次数,据说这样可以让顺序查找的性能提升一倍。
优点:无序任何假设条件(如数组有序等)。
缺点:效率低。
#include <stdio.h>
int ssearch(int* arr, int n, int key)
{
int i = 0;
arr[n] = key;
for(i=0;arr[i]!=key;i++);
if(i==n)
{[......]
如果我们要求每一顶点对之间的最短路径,怎么做呢?
方法1:对N个顶点,依次执行前面的Prim算法。
方法2:使用Floyd算法。
实际上,Floyd算法是动态规划(DP)算法。
原理很简单,我们假设dp[i][j]表示从顶点i到顶点j的最短路径,则dp[i][j] = min (dp[i][k]+dp[k][j], 0<=k<=nvexs)。
于是算法如下:
import java.util.LinkedList;
public class Fl[......]
单源最短路径:给定带权有向图和源点v,求从v到G中其余各点的最短路径。
Dijkstra算法非常类似于最小生成树算法(的Prim)。
算法:
0、假设源为v0,设置辅助变量dist和pre,优先队列pq,按照dist[x]从小到达排序(小顶堆)。
1、如果v0->i连通,初始化dist[i]为w[v0][i]。放(dist[i], i)入pq。
2、循环,直到pq为空。
2.1、取出pq中最小的,设其下标为x,
2.2、遍历图matrix[x][i[......]
与AOV网对应的,还有一个AOE网,当然它也是有DAG(向无环图)。
AOE(Activity On Edge)网:顾名思义,用边表示活动的网。
与AOV不同,活动都表示在了边上,如下图所示:
如上所示,共有11项活动(11条边),9个事件(9个顶点)。
整个工程只有一个开始点和一个完成点。
即只有一个入度为零的点(源点)和只有一个出度为零的点(汇点)。
(1) 关键路径:是从开始点到完成点的最长路径的长度。路径的长度是边上活动耗费的时间。
(2[......]