1、基于四叉堆优先级队列的OSPF算法梁志华,李东生,杜莉娜(太原理工大学信息工程学院山西太原030()24)摘要:通过比较已有的D钉kstra算法和基于四又堆优先级队列的D“kstra算法的时间复杂度得出,后者的执行效率高于前者;井在此基础上提出了基于四叉堆优先级队列的()sPF算法,以提高osPF的效率。关键词:路由选择;oSPF;四叉堆随着Pc主频的快速发展和上网人数的大幅增加,网络速度已成为人们关注的焦点,也是影响网络继续普及的关键。因此如何有效提高网络速度已成为当今网络技术的主要课题之一。路由选择协议是TCPIP协议族中重要的成员之一,选路过程实现的好坏会影响整个Internet网络的效
2、率。而路由选择算法在路由协议中起着至关重要的作用,采用何种算法往往决定了最终的寻径结果。因此选择路由算法需综合考虑以下几个设计目标:最优化,简洁性,坚固性,快速收敛,灵活性Internet是AS(Autonomous System,自治系统),每个As由不同的机构运营管理,在其内部使用自己的路由选择协议。按实现范围的不同,路由选择协议aJ分为内部网关协议和外部网关协议。仅就内部网戈协议而言,现正使用的路由协议有以下儿种:R1P 1(Routing Informatlon ProtocoI,选路信息系统);RIP 2;IGRP(Interior Gateway Routlng Protoc01,
3、内部网关路南选择协议);EIGRP(Extended Gateway Protoc01扩充的内部网关路由选择协议);Is Is(Intermediate system Intermedlate system,中间系统);OsPF“其中前4种路由协议采用的是距离向量算法,IsIs和osPF采用的是链路状态算法。对于小型网络,距离向量算法尚能胜任;而在面对大型网络时,不但其固有的无穷计数问题变得更为糟糕,所占用的带宽也迅速增长,以至于网络无法承受。对于大型网络,采用链路状态算法的IsIs和osPF较为有效,并得到了广泛的应用。IS一1S和OsPF在质量和性能上的差别不大,但OSPF更适用于IP,较
4、I孓IS更具有活力。IETF始终致力于osPF的改进工作,其修改节奏比I孓Is快得多。因此OSPF正在成为最为广泛的一种路由选择协议。oSPF属动态的路由协议,它可以迅速地检测AS内的拓扑变化,经过一个比较短的收敛期后,重新计算出无环路由。每个路由器维护一个相同的链路状态数据库,保存整个As的拓扑结构。一旦路由器有了完整的链路状态数据库,该路由器就可以以自己为根,构造最短路径树,然后再根据最短路径树构造路由表口。构造最短路径树采用Dijkstra算法,它的时间复杂度为O(n2)H。但本文提出的基于四叉堆优先级队列的OsPF算法的时间复杂度为协议的时间复杂度大大减少。1 Dikstra算法DIj
5、kstra算法由著名数学家EwDijkstra于1959年提出,是按路径长度递增的次序产生的单源最短路径算法,计算结果为一棵以起点为根的最短路径树。下面为基于邻接矩阵的DikStra算法的语言描述。设Di为砜到V的累计权值,s为最短路径节点的集合arcsi力为弧上的权值。DV。为。,s为空。1)找到从V。出发到其余各节点的最短路径长度的初值,记为D。(若可达,则Dz为v。到此节点弧上的权值;若不可达,则Dz为无穷)。2)找出最小权值。设此最小值对应的终止节点为U,则Dj一mtnDiV为图中的节点且S=S UV,3)若从y,出发到其余任一节点(设为V)弧上的权值与DD之和小于D,即D力+arcs
6、力阻D女,则修改D女的值为;D一D力+arcs力队4)重复2)、3)共“一1次,即可求得从Vo出发到其余各节点的最短路径。此算法的第一个循环的时间复杂度为O(n)第二个循环共进行n一1次,每次执行的时间是O(n),所以第二个循环的时闻复杂度是o(“。),故此算法的时问复杂度是O(舻)我们可以看出,造成此算法效率不高的主要原因在于算法中的二重循环。当节点总数n很大时,此二重循环将耗费大量的计算时间。欲降低此算法的时间复杂度,关键在于对第二个循环进行改造。2 基于四叉堆优先级队列的Dijkstra算法优先级队列是一种用来维护由组元素构成的集合的数据结构。实现优先级趴列的方法较多,但K叉堆是一种很优
7、秀的实现方法。K叉堆结构是一种数组对象,可以被视为一棵完全K叉树。堆结构必须满足以下|生质:对除了根节点以外的每个节点z,有Aparent(i)Ai或AParent(z)Az,即某个节点的值不小于(或不大于)其父节点的值。这样堆中的最小(或最大)元素就存在根节点中=L每一节点的子树中的节点值都不小于(或不大于)该节点的值。因为具有n个元素的K叉堆是基于一裸完全叉树的,则其高度为10即一对于K叉堆的操作,其作用时间至多与树的高度成正比为O(Iog”)+若采用基于K叉堆实现的优先级队列来存储D值(某个节点到其他节点的权值),则可降低算法的时间复杂度,提高算法效率。虽然对于一定大小的整数K,K叉堆操
8、作的运行时间界均为O(109 n),但是,K值不同,堆操作中的赋值、比较及交换操作的次数还是有很大差剐,当K=4时为最佳选择。以下为基于邻接表及四叉堆优先级队列的Dijl【stra算法(假设同前一算法)。此算治对旧算法的第二个子循环进行了改造,它的外层循环执行n次,但内层循环为树的高度log,所以此算法的时间复杂度为0(“log n)5。对于四叉堆,在节点数比较多的情况下,它的高度远小于节点总数。3 结论当n值较小时,已有的Dljkstra算法和基于四叉堆优先级队列的Dijkstra算法的时间复杂度差别不是很大。但当”值较大时,o(”109 n)会比0(n2)小很多。此时,基于四叉堆优先级队列的D1jkstra算法的运行效率会比已有的Dijkstra算法的效率高很多。可见基于四叉堆优先级队列的D-jkstra算法是对已有的Dikstra算法的一种改进。参考文献: