迪雷杰斯特拉算法,会统计所有路由器吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迪雷杰斯特拉算法,会统计所有路由器吗相关的知识,希望对你有一定的参考价值。

迪雷杰斯特拉算法,会统计所有的路由器,首先先来说一下迪杰斯特拉算法,从大概念上来说,该方法属于一种贪心算法,即当加进一个点后,算其相邻所有点的最短路径
路由算法有很多,本篇采用迪杰斯特拉最短路径法实现简单的路由算法。可能很多人一看到这个就会想到数据结构了,想到数据结构中必须要建立图的结构就很头疼,今天这种写法可以先不采用数据结构书上的写法,也可以实现相同的功能,毕竟,咱们的重点是要学习使用迪杰斯特拉算法,而不是构建图结构。
首先先来说一下迪杰斯特拉算法,从大概念上来说,该方法属于一种贪心算法,即当加进一个点后,算其相邻所有点的最短路径。详细过程如下:
如下图,要计算其中 点1 到其余各点的最短路径
总的计算过程见下表
表中红颜色代表当前行未加入到点集中的最小值,蓝颜色代表和上一个新加入点集中的点相邻的点,可能这样说还不是很清楚,就看下面的具体过程了。
第一步:初始化,把和 点1 相连的所有点的D(i)初始化,从图中可以看出,1和2、4、5相连,所以D(2)=10,D(4)=30,D(5)=100,点1和点3不直接相连,所以D(3)=65535,代表无穷大(在java里,可以用Integer.MAX_VALUE来表示无穷大)。由于现在点集中只有点1,所以找出刚才步骤1那行中D(i)最小的点,为点2(图中红色标明),将其加入到点集中。
第二步:此时点集中新加入了点2,则以点2为出发点,从图中看到只有点3与其相连,所以这一步中只需要更新D(3)即可,D(3)= minD(3), D(2)+ d(2,3),即D(3)= min65535, 10+ 50 = 60,更新D(3)=60,其余点不变。这行更新完毕,发现未加入到点集中的D(4)最小,所以将点4加入到点集中。

第三步: 此时点集中新加入了点4,则以点4为出发点,从图中看到点3和点5与其相连,所以这一步需要更新D(3)和D(5)的值,D(3)= minD(3), D(4)+ d(4,3) ,即D(3) = min60, 30+20 = 50;D(5) = minD(5), D(4)+ d(4,5) = min 100, 30 + 60 = 90。此时这一行其他数据不用变,此行更新完毕,找出未加入到点集中的 点3、点5 中的最小值,应该是点3,加入到点集中。
第四步,此时点集中新加入了点3,则以点3为出发点,发现点5与其相连,只需要更新D(5)即可。D(5) = minD(5), D(3)+ d(3,5) = min 90, 50 + 10 = 60,此时这行更新完毕,只有最后一个 点5 未加入到点集中了,所以将其加入。
第五步,此时点集中新加入了点5,则以点5为出发点,发现根本没有点与其相连,甚好,此行就不用再更新了。
第六步,机智的我发现所有点都被包含在了点集中,所以本次迪杰斯特拉算法就到此结束了。剩下的就是代码实现了。
用一个二维数组d[i][j]来存从第i个点到第j个点的路径权重,其中65535为无穷大; 用一个一维数组f[i]才表示从第1个节点到第i个节点的最短路径。
参考技术A 不会。这种情况是不会统计所有的路由器的。

迪杰斯特拉算法-简单容易理解

1.最短路径算法

画一张图:简单

首先是连通图,单向连通图

 1-4找到最短路径  first-last

遍历所有节点

  1-所有节点判断,如果有的话前继节点就是1                      2,5

这个时候我们就需要判断这几个节点2,5

但是我们还得遍历,因为我们不知道       这个时候找2的前继节点是

1吗?可能有其他路径在2没关系局部最优,因为如果有其他节点到2的话说明这个节点可以到2

如果距离更小,那么就选择这个节点为前继节点,但是必须是已经连接的节点,

复杂也就是这个原理

public int[,] matirx()
       

            int[,] a = new int[5,5];
            //int[][] a = a;
            //Console.WriteLine(a);
            for(int i = 0; i < 5; i++)
           
                for (int j = 0; j < 5; j++)
                    a[i,j] = 10000;
           
            a[0,0] = 6;
            a[0,1] = 5;
            a[0, 4] = 1;
            a[4, 3] = 1;
            a[3, 1] = 1;
            a[1,2] = 7;
            return a;
       
        public void dijiesitela()
       
            int dis;
            int[,] a = matirx();
            //dis = a[0,2];
            int[] value = new int[5];
            int[] arr = new int[5];
            bool[] flag1 = new bool[5];
            //b[0]=
            int first = 0;
            int last = 2;
            int count = 0;
            int flag = 10000;
            for(int xu = 0; xu < 5; xu++)
           
                for(int xu1 = 0; xu1 < 5; xu1++)
               
                    Console.Write(a[xu, xu1] + "   ");
               
                Console.WriteLine();
           
            for (int i = 0; i < 5; i++)
           
                value[i] = 10000;
                flag1[i] = false;
           
            value[first] = 0;

            for (int i = 0; i < 5; i++)
           
                for (int ii = 0; ii < 5; ii++)
               
                    if (!flag1[ii] && value[ii] < 10000)
                   
                        first = ii;
                        //Console.WriteLine(first);
                   
               
                flag1[first] = true;
                //里面   判断first节点的后继节点
                //first要改变
                for (int j = 0; j < 5; j++)
               
                    if (j != first && value[first] + a[first,j] < value[j])
                   
                        arr[j] = first;
                        value[j] = value[first] + a[first,j];
                   
               
           
            int[] last1 = new int[5];
            last1[0] = 0;
            last1[last] = 2;
            /*for (int intint = 0; intint < arr.Length; intint++)
                Console.WriteLine(arr[intint]);*/
            int count1 = 1;
            while (arr[last] != 0)
           
                Console.WriteLine(arr[last]);
                last = arr[last];
                last1[count1]= arr[last];
                   
            //sleep(1000);
            while (true)
           
                Console.Write("");
           
       

以上是关于迪雷杰斯特拉算法,会统计所有路由器吗的主要内容,如果未能解决你的问题,请参考以下文章

sdn默认路由算法与拥塞相关问题

一个拓扑,搞定BGP13条路径选择算法 - 案例分析

路由器重启以后ip是不是会改变

迪杰斯克拉算法是怎样的?

OSPF高级设置实现全网互通

6,路由选择都有哪些算法?