diff --git a/Data-Structrue/graph.md b/Data-Structrue/graph.md index d3320b0..b02bcf1 100644 --- a/Data-Structrue/graph.md +++ b/Data-Structrue/graph.md @@ -319,3 +319,50 @@ Floyd算法复杂度高,所以基本上都是四个结点以下的图,能解 ### 拓扑排序 AOV网:用DAG图表示一个工程,顶点表示活动,有向边$$表示活动$v_i$必须先于活动$v_j$进行。 + +拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条;件时,称为该图的一个拓扑排序: + +1. 每个顶点出现且只出现一次。 +2. 若顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径。 + +或定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得若存在一条从顶点A到顶点B的路径,则在排序中顶点B出现在顶点A的后面。每个AOV网都有一个或多个拓扑排序序列。 + +拓扑排序的实现: + +1. 从AOV网中选择一个没有前驱的入度为0的顶点并输出。 +2. 从网中删除该顶点和所有以它为起点的有向边。 +3. 重复步骤1和2直到当前的AOV网为空或当前网中不存在无前驱的顶点为止。 + +逆拓扑排序的实现: + +1. 从AOV网中选择一个没有后继的出度为0的顶点并输出。 +2. 从网中删除该顶点和所有以它为起点的有向边。 +3. 重复步骤1和2直到当前的AOV网为空或当前网中不存在无前驱的顶点为止。 + +### 关键路径 + +在带权有向图中,以顶点表示时间,以有向边表示活动,以边上的权值表示完成该活动的开销,称之为用边表示活动的网络,简称AOE网。 + ++ 只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始。 ++ 只有在进入某顶点的各有向边所代表的活动都已经结束时,该顶点所代表的事件才能发生,活动也可以并行进行。 ++ 只有一个入度为0的顶点,即开始顶点(源点),表示整个工程的开始。 ++ 只有一个出度为0的顶点,称为结束顶点(汇点),表示整个工程的结束。 ++ 从源点到汇点的有向路径可能有多条,所有路径中,具有最大路径长度的路径称为关键路径(即决定完成整个工程所需的最小时间),而关键路径上的活动称为关键活动。 ++ 事件的最早发生时间:决定了所有从该事件开始的活动能够开工的最早时间。 ++ 活动的最早开始时间:指该活动弧的起点所表示的事件最早发生时间。 ++ 事件的最迟发生时间:在不推迟整个工程完成的前提下,该事件最迟必须发生的时间。 ++ 活动的最迟开始时间:指该活动弧的终点所表示的事件的最迟发生时间与该活动所需时间之差。 ++ 活动的时间余量:在不增加完成整个工程所需总时间的情况下,活动可以拖延的时间。 + +求关键路径的步骤: + +1. 求所有事件的最早发生时间ve。根据拓扑排序序列,依次按照所有路径的最大值求出各个顶点的最早发生时间。 +2. 求所有事件的最迟发生时间vl。根据逆拓扑排序序列,回退依次将每个结点按第一步计算的整个工程的时间减去本结点需要处理的时间,得到每个活动都最晚应该发生的时间,交叉的结点取最小值。 +3. 求所有活动的最早发生时间e。根据第二步可以得到每个活动发生的最早时间。 +4. 求所有活动的最迟发生时间l。根据vl求每个结点不影响整个工程的情况下最晚可以什么时候开始。 +5. 求所有活动的时间余量d。将l-e得到d,余量为0的活动就是关键活动,表示如果该活动拖延就会影响整个工程的进度。 + ++ 关键活动时间增加,整个工程工期延长。 ++ 关键活动时间减少,整个工程工期缩短。 ++ 关键活动时间减少,可能变为非关键活动。 ++ 若有多条关键路径,则必须提高所有关键路径关键活动才能缩短工期。 \ No newline at end of file diff --git a/Data-Structrue/search.md b/Data-Structrue/search.md new file mode 100644 index 0000000..e73c706 --- /dev/null +++ b/Data-Structrue/search.md @@ -0,0 +1,58 @@ +# 查找 + +## 基本概念 + ++ 查找:在数据集合中寻找满足某种条件的数据元素的过程。 ++ 查找表(查找结构):用于查找的数据集合,由同一类型的数据元素或记录组成。 ++ 关键字:数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该唯一。 ++ 静态查找表:只查找符合条件的数据元素。 ++ 动态查找表:出来要查找,还要进行删除或插入,除了查找速度还要考虑插入删除操作是否方便。 ++ 查找长度:查找运算中,需要对比关键字的次数。 ++ 平均查找长度ASL:所有查找过程中进行关键字比较次数的平均值。$ASL=\sum_{i=1}^nP_iC_i$。其中$P_i$表示查找第i个元素的概率,$C_i$表示查找第i个元素的查找长度。 + +## 静态查找 + +### 顺序查找 + +又称为线性查找,常用于线性表,从头到尾逐个查找。 + +ASL查找成功为$\dfrac{1+2+3+\cdots+n}{n}=\dfrac{n+1}{2}$,ASL查找失败为$n+1$,时间复杂度为$O(n)$。 + +#### 顺序表 + +可以让数据集变为有序的,这样对比数据大小也可以知道是否还需要遍历从而减少查找时间。这样顺序结构从逻辑上就变成了一个二叉树结构,左子树代表小于,右子树代表大于,所有数据结点挂在右子树上。 + +查找情况还要比普通乱序查找加上一个大于最大值的情况。 + +ASL查找失败为$\dfrac{1+2+3+\cdots+n+n}{n+1}=\dfrac{n}{2}+\dfrac{n}{n+1}$。成功结点的查找长度等于自身所在层数,失败结点的查找长度等于其父结点所在层数。 + +#### 查找概率不等 + +当数据元素查找概率不等时,可以将查找概率更大的元素放在靠前的位置,以减少大概率元素被遍历的时间。 + +但是此时数据是乱序的,所以查找失败的时间复杂度与没有优化的是一样的。 + +### 折半查找 + +也称为二分查找,只适用于有序的顺序表,链表无法适用。 + +定义三个指针,low指向查找范围的最小值,high指向查找范围的最大值,mid指向查找范围的中间值,$mid=\lfloor(low+high)/2\rfloor$。(也可以向上取整,过程会有所不同) + +查找时,首先计算出mid判断是否相等,若查找值小于mid的值,则将high赋值为mid的值,若查找值大于mid,则将low赋值为mid的值,重新计算mid。这样就可以不断二分区间来查找,从而加快迭代。当查找最后low>high则查找失败。 + +ASL查找成功为$\dfrac{1+2+3+\cdots+n}{n}=\dfrac{n+1}{2}$,ASL查找失败为$n+1$,时间复杂度为$O(n)$。 + +#### 折半查找判定树 + +若当前low和high有奇数个元素,则mid分割后左右两部分元素个数相等。 + +若当前low和high有奇数个元素,则mid分割后左部分元素个数小于右部分一个。 + +折半查找判定树一定是一个平衡二叉树。只有最下面一层不满,元素个数为n时树高与完全二叉树相等$h=\lceil\log_2(n+1)\rceil$。 + +且折半查找判定树也是一个二叉排序树,失败结点=n+1(成功结点的空链域节点数)。 + +ASL查找成功查找失败都一定小于折半查找树的树高,时间复杂度为$O(\log_2n)$。 + +## 动态查找 +