把周末写了一半的东西继续补齐了,实现了完美的一天。
我们知道的一个事实就是IP地址实在太多了,根本就不可能统一的管理起来,无论从数据平面还是从控制/管理平面上说都是这样。所以,IP协议被设计出来就是可扩展的。对于IP路由来讲,路由计算是逐跳进行的,当然也支持“源路由”选项,源路由就是说数据在出发前就已经把路线规划好了,逐跳路由是IP路由的标准形式,也就是说,IP数据包是在路上即时规划路线的。
我比较喜欢IP路由是因为这也是我旅行的方式,我喜欢旅行,但是我不喜欢事先订酒店,事先规划路线,导航等,我的方式是在路上看路牌前行,到了临时停下的地方之后背着行囊找住处,然后走到哪算哪,这是一种说走就走且没有目的地的游荡...当然,IP数据包是有目的地的。

逐跳全局最优化

IP路由是在每一台路由器上逐跳路由的,那么就产生了一个问题,偌大一个互联网,该怎么相信这么多逐跳路由拼接起来的一条完整的路径确实是最优化的呢?答案显然是确定的,问题是怎么证明它。

路由算法

书上讲,路由算法基本分为距离矢量算法和链路状态算法,各自的协议代表作就是RIP和OSPF(我就是靠着这两个找到的第一份工作),确实是这样,但是从这些算法的正确性的证明过程中,你就会发现,确实是“逐跳的最优化路由真的就是全局的最优化路由”。本文中我仅仅给出基于链路状态路由协议的Dijkstra算法的证明,因为全网每台设备的链路状态数据库都是相同的,所以它是很好理解的。

Dijkstra算法正确性证明

首先要给出Dijkstra算法正确性的证明,才能进行后续的。毕竟,Dijkstra算法本身只是指导了step by step的操作步骤,并没没能证明这么折腾一圈得到的最短路径树中的每一条路径确实是最短的。而要想证明逐跳全局最优化原则,需要这个事实。
下面的示意图给出了Dijkstra算法正确性的简单证明,详细完备的数学证明可以参照这个思路:

逐跳全局最优化的问题

下面的示意图点名了逐跳全局最优化的问题所在:

逐跳全局最优化的证明

下面的示意图给出了逐跳全局最优化的简单证明,证明方式多种多样,我这里给出的仅仅是其中一种:

附:Dijkstra算法的贪心模型

如果我们在地上倒上一杯水,观察水摊开渗透的痕迹,就会理解Dijkstra算法,它确实是不证自明的。大自然是懒惰的,总是用最省力的方式行事,水分子在落地那个点开始,在崎岖不平的地上由于重力(暂时不考虑其它分子力)沿着一定的路径到达一系列点,这些路径一定是最短路径。我们可以把地面的崎岖程度视为路径的权值,这不就和Dijkstra算法模型一模一样吗?
在Dijkstra()中,有内外两层循环复杂度是O(v ^ 2 ),当数据规模v大于10000时一般采用 (1) 最优 队列优化,复杂度是nlogn (2)SPAF,复杂度达到KE,()一般当n超过10000都要优化) 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能...
在传统的 Dijkstra算法 中,我们不难发现,大量的时间被用于遍历d[]数组。 因此,我们可以通过一个小顶堆来替代这个遍历过程。优化后的算法复杂度为O(v*lgn)。#include <cstdio> #include <cstring> #include <queue> using namespace std; #define MAXN 10005 #define MAXM 500005
前段时间学习优秀的vue框架学到一招 路由 优化 路由 引入很多文件的时候会使页面阅读很不顺畅 很累赘 其次开发环境与生产环境的引入有时会有很大的不同 这时候就可以进行一下配置 优化 路由 router下配置三个文件index是 路由 文件 其他两个 分别是开发环境与生产环境的引入方式 开发环境的引入方式是: 生产环境的引入方式是: 然后在index里引入相应开发环境下的公共方法: 组件引入方式是: