大家好,今天来为大家分享深入解析:高效编程的核心——数据结构详解的一些知识点,和的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
首先求出从源点到所有顶点的路径w(),并将到不能直接到达的顶点的路径设置为。找出这些路径()中长度最短的路径,并更新每条路径: 如果图中存在弧(),则w() + w() w(),将() 替换为路径(),并更新路径长度。在更新的路径中,找到长度最短的路径,以此类推,直到访问完所有顶点。时间复杂度:O()
C语言实现void Dijkstra(图G, int v){
//Visited数组用于表示该节点是否被访问过
int* 已访问=(int*)malloc(sizeof(int)*G-vexnum);
//距离数组用于表示起点到每个节点的最短距离
int* 距离=(int*)malloc(sizeof(int)*G-vexnum);
//Parent数组用于表示当前节点的前驱
int* 父级=(int*)malloc(sizeof(int)*G-vexnum);
for(int i=0; i G-vexnum; i++){//初始化三个数组
访问过[i]=0;
距离[i]=MAXINT;
父级[i]=-1;
}
访问过[v]=1;
距离[v]=0;
父级[v]=-2; //起点父节点设置为-2
int 访问次数=1, cur=v; //设置当前节点为v
while(visitednum G-vexnum){
//更新
for(int i=0; i G-vexnum; i++){//如果起点到当前节点的距离与边权重之和小于到本节点的距离,则更新
if(Visited[i]==0 (G-arcs[cur][i] + 距离[cur] 距离[i])){
距离[i]=G-arcs[cur][i] + 距离[cur];
父级[i]=cur;
}
}
//扫描
int 最小值=MAXINT,添加=-1;
for(int i=0; i G-vexnum; i++){//在未访问过的节点中找到距离最小的节点
if(访问[i]==0 距离[i]最小值){
最小值=距离[i];
添加=我;
}
}
//添加
Visited[add]=1;//设置未访问节点中距离最小的节点为已访问
visitnum++;//更新访问过的节点数
当前=添加;
}
for(int i=0; i G-vexnum; i++){//打印最短距离
printf("%d", 距离[i]);
}
printf("n");
for(int i=0; i G-vexnum; i++){//打印父节点信息
printf("%d", 父级[i]);
}
}
Floyd算法
算法思想从到的所有可能路径中逐一测试每个顶点,选择算法流程长度最短的路径。初始设一个n阶距离方阵,令其对角线元素为0,如果有弧,则对应元素为权重,否则为无穷大。逐渐尝试向原始直接路径添加中间顶点。如果添加中间顶点后路径变短,请修改它。否则,维持原值。测试完所有顶点后,算法结束。即对于图中每个顶点,检查w()+w()的长度是否小于w()。如果小于,则更新距离矩阵。时间复杂度:O()
C语言实现无效弗洛伊德(图G){
//分配空间
int** 距离=(int**)malloc(sizeof(int*)*G-vexnum);
for(int i=0; i G-vexnum; i++)距离[i]=(int*)malloc(sizeof(int)*G-vexnum);
int** 源=(int**)malloc(sizeof(int*)*G-vexnum);
for(int i=0; i G-vexnum; i++)Source[i]=(int*)malloc(sizeof(int)*G-vexnum);
for(int i=0; i G-vexnum; i++){
for(int j=0; j G-vexnum; j++){
距离[i][j]=G-arcs[i][j];
if(i !=j)Source[i][j]=j;
否则源[i][j]=-1;
}
}
//算法体
for(int k=0; k G-vexnum; k++){
for(int i=0; i G-vexnum; i++){
for(int j=0; j G-vexnum; j++){
if(距离[i][k] + 距离[k][j] 距离[i][j]){
距离[i][j]=距离[i][k] + 距离[k][j];
源[i][j]=源[i][k];
}
}
}
}
//打印距离矩阵
printf("距离矩阵:n");
for(int i=0; i G-vexnum; i++){
for(int j=0; j G-vexnum; j++){
printf("%5d", 距离[i][j]);
}
printf("n");
}
//打印路径矩阵
printf("源矩阵:n");
for(int i=0; i G-vexnum; i++){
for(int j=0; j G-vexnum; j++){
printf("%5d", Source[i][j]);
}
printf("n");
}
//释放空间
for(int i=0; i G-vexnum; i++){
自由(距离[i]);
免费(来源[i]);
}
自由(距离);
关于深入解析:高效编程的核心——数据结构详解和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
【深入解析:高效编程的核心——数据结构详解】相关文章:
用户评论
真沒想到數據結構這麼重要!
有14位网友表示赞同!
學了數據結構以後,寫程式真的比較快了。
有6位网友表示赞同!
我以前覺得數據結構很抽象,現在才了解它的實用性
有15位网友表示赞同!
打算學習一下不同的數據結構類型,像是堆和圖啊。
有11位网友表示赞同!
想了解更多關於高效算法的知識,好像跟數據結構有密不可分的關系?
有20位网友表示赞同!
難怪每次考試裡都出現數據構造題,它真是一個關鍵的概念!
有12位网友表示赞同!
感覺數據結構是程式設計的基礎,一定要牢固掌握。
有13位网友表示赞同!
最近在研究資料庫系統,發現數據結構在這裡應用得非常廣泛。
有14位网友表示赞同!
聽說有一些特殊數據結構專門用於人工智慧領域。
有16位网友表示赞同!
覺得學習一個新的數據結構就像解開了一個新的程式設計工具!
有12位网友表示赞同!
希望學到一些實用的數據结构演算法知識,可以幫助我更有效率地解決問題。
有20位网友表示赞同!
以前只知道陣列和 linked list,現在想拓展更多的學科知識!
有20位网友表示赞同!
好像每個程式設計語言都有自己專屬的數據結構類型?
有14位网友表示赞同!
感覺學習數據結構是一趟很有趣的探索之旅!
有17位网友表示赞同!
想要了解如何在实际编程中运用不同的数据结构。
有10位网友表示赞同!
最近在做些需要用到複雜算法的任務,可能要研究一下新的資料結構。
有13位网友表示赞同!
覺得学习数据结构可以提升我解决问题的思维能力!
有19位网友表示赞同!
希望找到一些學習數據結構的好資源和教程!
有20位网友表示赞同!
真想多了解一點關於數據結構的歷史發展以及演變!
有7位网友表示赞同!