SPF算法
1.Dijkstra算法解释(来自E.W.Dijkstra原稿)
构造一棵树[a],使n个节点之间的总长最小(树是一个在每两个节点之间仅有一条路径的图)。
在我们给出构造过程中,分支被分成3个集合:
Ⅰ:被明确分配给构造中的树的分支(他们将在子树中);
Ⅱ:这个分支的隔壁分枝被添加到集合1;
Ⅲ:剩余的分支(抛弃或不考虑);
节点被分成两个集合:
A: 被集合1中的分支连接的节点;
B:剩余的节点(集合2中有且仅有一个分支将指向这些节点中的每一个节点);
下面我们开始构造树,首先选择任意一个节点作为集合A中仅有的成员,并将所有拿这个节点做端点的分支放入集合Ⅱ中。开始集合Ⅰ是空的。然后我们重复执行下面两步。
- 步骤一:集合Ⅱ中最短的分支被移出并加入集合Ⅰ。结果,一个节点被从集合B传送到集合A。
- 步骤二:考虑从这个节点(刚才被传送到集合A中的节点)通向集合B中节点的分支。如果构建中的分支长于集合Ⅱ中相应的分支,那么分支被丢弃;否则,用它代替集合Ⅱ中的相应的分支,并且丢弃后者。
接着我们回到算法的第一步并重复此过程直到集合Ⅱ和集合B为空。集合Ⅰ中的分支形成索要的树
2.路由器中的最短路径优先算法
在Djikstra算法中描述了3个分支集合:Ⅰ、Ⅱ、Ⅲ。在路由器的算法中用三个数据库来表示这三个分支集合。
-
最短路径树数据库——表示集合Ⅰ。通过向数据库中添加分支实现向最短路径树中添加链路。当算法完成时,这个数据库将可以描述最短路径树。
-
候选对象数据库——表示集合Ⅱ。按照规定的顺序从链路状态数据库向该数据库中复制链路,作为向树中添加的候选对象。
-
链路状态数据库——表示集合Ⅲ。这里保存所有链路。
Djikstra中还指定了两个节点集合——A、B。这里的节点时=是路由器。这写路由器被明确地哟个路由器三元组(路由器ID、邻居ID、代价)中的邻居ID表示。集合A中的是最短路径树数据库中链路所连接的路由器。而集合B中的是所有其他的路由器,所以当算法收敛完成时集合B应该为空。
以下是一台路由器中的最短路径优选算法的版本:
- 步骤1:路由器初始化最短路径树数据库,将自己作为树的根。就是路由器作为它自己的邻居,代价为0。
- 步骤2:在链路状态数据库中,所有描述通向根路由器邻居链路的三元组被添加到候选对象数据库中。
- 步骤3:计算从根到每条链路的代价,候选对象数据库中代价最小的链路背移到最短路径树数据库中。如果两条或更多链路离根的代价相同,随机选择其中一条移到最短路径树数据库中。
- 步骤4:检查添加到最短路径树数据库中的邻居ID。除了邻居ID已经在最短路径树数据库中的三元组之外,链路状态数据库中描述路由器邻居的三元组被添加到候选对象数据库中。
- 步骤5:如果候选对象数据库中还有剩余的项,就回到第3步。如果候选数据库为空,终止算法。算法终止时,在最短路径树数据库中,每一个单一的邻居ID表将表示1台路由器,到此算法收敛完毕,最短路径树构造完毕。