数据结构与算法分析
czitroad
这个作者很懒,什么都没留下…
展开
-
迪克斯特拉算法(Dijkstra)
无权图的最短路径问题可以用简单的广度优先算法求解,当对路径赋权后,问题就变得复杂了。 此时可用迪克斯特拉算法求解,该算法为一个贪婪算法。 该算法类似无权最短路径,按节点处理。在每个阶段的节点选取上体现贪婪算法,即每次都选取临时路径长最短的节点,并标记为known。容易证明被标记为known的节点均已得到从起始节点到该节点的最短路径长,因此被标记为known的节点在后续阶段中路径信息将不再更新。代原创 2017-01-18 22:00:44 · 642 阅读 · 0 评论 -
最短路径算法-广度优先搜索
考虑如下图: 当路径没有权重时,从v1到v7的最短路径代码如下:#include<iostream>using namespace std;int main(){ int input[8][8] = { {0,0,0,0,0,0,0,0}, {0,0,1,0,1,0,0,0}, {0,0,0,0,1,1,0,0},原创 2017-01-18 20:37:22 · 232 阅读 · 0 评论 -
图论定义
一个图G由顶点V和边E组成,每一条边就是个点对(v,w),有时也把边称作弧(arc)。如果点对是有序的,则图就叫做有向图。当E中存在(v,w)时,我们称顶点v和顶点w是邻接的。在无向图中如果v和w是邻接的,则w和v也是邻接的。有时候边还具有第三种成分,叫做权(weight)。 从一个顶点到它自身可以看成是一条路径,称为环(loop)。 如果一条路径上所有顶点都是互异的,我们称之为简单路径,但第一原创 2017-01-18 15:04:48 · 301 阅读 · 0 评论 -
桶排序(bucket sort)
任何使用比较的排序算法时间复杂度通常为O(N log N),但是在某些特殊情况下,以线性时间进行排序还是有可能的。 桶排序假设输入的数据均为小于M的正整数,然后声明一个大小为M的数组L,数组值均初始化为0,读取输入数据i,并执行L[i]++,则L数组中不为0的元素值的下标序列就是排序后的序列。 实现代码如下:#include<iostream>using namespace std;void B原创 2017-01-18 12:11:07 · 118 阅读 · 0 评论 -
快速排序(Quick Sort)
正如名字一样,快速排序是实践中最快的排序算法,平均运行时间为O(N log N)。最坏情形为O(N^2),但最坏情况很容易规避。 排序步骤如下: 1. 如果集合S中只有0个或1个元素,则返回。 2. 取S中任一元素p,称为轴(pivot)。 3. 将S - {p} 这个集合分成两个子集合,集合S1中的元素小于v,集合S2中的元素大于v。 4. 继续对子集合S1和S2进行如上3个步骤。由以上原创 2017-01-18 11:10:50 · 286 阅读 · 0 评论 -
希尔排序(shell sort)
希尔排序是以发明者Donald Shell来命名的。它通过比较相距一定间隔的元素并对其排序来工作。各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。初始: 9 8 7 6 5 4 3 2 以4为距离进行sort: 5 4 3 2 9 8 7 6 以2为距离进行sort原创 2017-01-17 20:38:55 · 114 阅读 · 0 评论 -
插入排序(insertion sort)
插入排序可以说是最简单的排序算法了。 插入排序对数组或子数组做了N - 1次排序,因此时间复杂度为O(N*N)。 对于P = 1次到P= N - 1次,插入排序保证数组位置0到位置P上的元素都为已排序状态。 实现代码如下:#include<iostream>using namespace std;void InsertionSort(int input[], int n);int main()原创 2017-01-17 20:22:49 · 168 阅读 · 0 评论 -
具有负边的图最短路径算法
不带赋权的图最短路径算法参考前面的最短路径算法-广度优先搜索 带赋权但不含负边的图最短路径算法参考迪克斯特拉算法 这里考虑带赋权且具有负边的最短路径(但不考虑负值圈)。由于存在负值边,因此可能存在路径v->u->s路径长小于v->s,因此迪克斯特拉算法不再成立。这里我们需要做个改变,首先将起始节点放入一个列表,取出一个节点v1,对于v1的某个邻接节点v2,记起始节点到v2的距离目前为d2,起始节原创 2017-01-19 13:49:30 · 574 阅读 · 0 评论