`
kenny_chang
  • 浏览: 1240 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

图的路由查找

阅读更多
图的路由查找算法:
1、 STEP ONE
定义节点对象
package com.huawei.ams5000.util.routesearcher;

import java.util.ArrayList;
import java.util.List;

/**
*  节点对象
*
* @author zWX144601
*
*/
public class RouteSearcherNodeInfo
{
    /**
     * 节点ID
     */
    private int siteId;
   
    /**
     * TOPO图ID
     */
    private int topoId;
   
    /**
     * 节点名称
     */
    private String name = null;
   
    /**
     * 关联的站点
     */
    public List<RouteSearcherNodeInfo> relationNodes = new ArrayList<RouteSearcherNodeInfo>();
   
    /**
    * 关联的链路ID
    */
    public List<List<Integer>> relationNmsPGIDS = new ArrayList<List<Integer>>();
   
    public String getName()
    {
        return name;
    }
   
    public void setName(String name)
    {
        this.name = name;
    }
   
    public List<RouteSearcherNodeInfo> getRelationNodes()
    {
        return relationNodes;
    }
   
    public void setRelationNodes(List<RouteSearcherNodeInfo> relationNodes)
    {
        this.relationNodes = relationNodes;
    }
   
    public int getSiteId()
    {
        return siteId;
    }
   
    public void setSiteId(int siteId)
    {
        this.siteId = siteId;
    }
   
    public int getTopoId()
    {
        return topoId;
    }
   
    public void setTopoId(int topoId)
    {
        this.topoId = topoId;
    }

    public List<List<Integer>> getRelationNmsPGIDS()
    {
        return relationNmsPGIDS;
    }

    public void setRelationNmsPGIDS(List<List<Integer>> relationNmsPGIDS)
    {
        this.relationNmsPGIDS = relationNmsPGIDS;
    }  
}

2 STEP TWO
实现查找递归算法
package com.huawei.ams5000.util.routesearcher;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;

import com.huawei.ams5000.util.routesearcher.RouteSearcherNodeInfo;

public class RouteSearcher
{
   
    private Stack<RouteSearcherNodeInfo> stack;
   
    private List<List<String>> resultPath = new ArrayList<List<String>>();
   
    public RouteSearcher(Stack<RouteSearcherNodeInfo> stack)
    {
        this.stack = stack;
        stack.clear();
    }
   
    public boolean isNodeInStack(RouteSearcherNodeInfo node)
    {
        Iterator<RouteSearcherNodeInfo> it = stack.iterator();
        while (it.hasNext())
        {
            RouteSearcherNodeInfo node1 = (RouteSearcherNodeInfo)it.next();
            if (node == node1)
                return true;
        }
        return false;
    }
   
    public void savePath()
    {
        Object[] o = stack.toArray();
        List<String> asList = new ArrayList<String>(o.length);
        for (Object object : o)
        {
            RouteSearcherNodeInfo node = (RouteSearcherNodeInfo)object;
            asList.add(node.getName());
        }
        resultPath.add(asList);
    }
   
    /**
     * 查找路由
     * @param cNode 当前查找节点
     * @param pNode 前一个节点
     * @param sNode 开始节点
     * @param eNode 结束节点
     * @return [参数说明]
     *
     * @return boolean [返回类型说明] 是否超找通路
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public boolean getPaths(RouteSearcherNodeInfo cNode, RouteSearcherNodeInfo pNode, RouteSearcherNodeInfo sNode,
            RouteSearcherNodeInfo eNode)
    {
        RouteSearcherNodeInfo nNode = null;
        if (cNode != null && pNode != null && cNode == pNode)  //判断环的情况
            return false;
        if (cNode != null)
        {
            int i = 0;
            stack.push(cNode); //压入当前节点
            if (cNode == eNode) //递归结束条件  如果当前查找的节点为终结点,则stack中保存了一条通路
            {
                savePath();   //获取通路
                return true;  //标记找到通路
            }
            else
            {  //如果当前节点不是目标节点,则循环找当前节点的关联节点,视图找到关联节点的每一条通路
                nNode = cNode.getRelationNodes().get(i);
                while (nNode != null)
                {
                    /*
                     * pNode != null标记 pNode ,cNOde,nNode能组成通路,否则为断开的路,没必要处理;
                     * nNode == sNode标记关联节点是开始节点,开始节点没必要找通路,所有通路均由开始节点开始
                     * nNode == pNode标记关联节点已经所搜,没必要继续搜索
                     * isNodeInStack,标记nNode曾经搜索过,没必要继续搜索
                     */
                    if (pNode != null && (nNode == sNode || nNode == pNode || isNodeInStack(nNode)))
                    {
                        i++;
                        if (i >= cNode.getRelationNodes().size())
                            nNode = null;
                        else
                            nNode = cNode.getRelationNodes().get(i);
                        continue;
                    }
                    //以nNode出发,看能否找到一条通路,如果找到,再找下一个节点,stack.pop()即找下一个cNode的子节点
                    if (getPaths(nNode, cNode, sNode, eNode) && !stack.isEmpty())
                    {
                        stack.pop();
                    }
                    //下一个子节点
                    i++;
                    if (i >= cNode.getRelationNodes().size())
                        nNode = null;
                    else
                        nNode = cNode.getRelationNodes().get(i);
                }
                stack.pop();//相对应 cNode = eNode的判断,对于当前节点来说,如果不是end节点,以为这此路不通,此节点不保存(从stack中弹出)
                return false;//此路不通,return false
            }
        }
        else
            return false;
    }
   
    public Stack<RouteSearcherNodeInfo> getStack()
    {
        return stack;
    }
   
    public void setStack(Stack<RouteSearcherNodeInfo> stack)
    {
        this.stack = stack;
    }
   
    public List<List<String>> getResultPath()
    {
        return resultPath;
    }
   
    public void setResultPath(List<List<String>> resultPath)
    {
        this.resultPath = resultPath;
    }
   
}
分享到:
评论

相关推荐

    Linux IP路由查找算法研究.pdf

    "Linux IP路由查找算法研究" 本文研究了Linux操作系统中的IP路由查找算法,并提出了一个基于软件的高效路由查找算法。该算法解决了现有的路由查找机制的限制,提高了路由查找速度。 在Linux系统中,路由查找机制...

    路由查找算法

    自己做的路由查找算法ppt,上课用。主要从四个方面总结,1.Internet地址结构的发展2. 路由查找算法3. 路由查找算法的评价4. 相关进展

    IP地址分类以及路由查找算法

    在TCP/IP协议栈中,网络层扮演着至关重要的角色,主要负责数据包在网络中的传输路径选择,这涉及到IP地址的分类和路由查找算法。本文将深入探讨这些关键知识点。 首先,IP地址是互联网上的每一个设备(如计算机、...

    散列索引多分支Trie树快速路由查找算法

    ### 散列索引多分支Trie树快速路由查找算法 #### 一、引言 在互联网技术中,路由器作为核心设备之一,其主要任务是根据接收到的数据包中的目标地址进行转发。为了确保数据包能够高效准确地送达目的地,路由器必须...

    核心路由器的路由查找算法

    ### 核心路由器的路由查找算法 #### 一、引言 随着互联网的快速发展,核心路由器作为连接不同网络的关键设备,其性能直接影响到整体网络的效率和服务质量。特别是在当前高速网络环境下,核心路由器的接口速率已经...

    Inter LPM算法实现路由查找

    **Inter LPM算法实现路由查找** Inter LPM(Longest Prefix Match, 最长前缀匹配)算法是IP网络中路由查找的关键技术,广泛应用于路由器、交换机等网络设备中。在IP路由查找过程中,Inter LPM算法的目标是找到与...

    一种新的快速IPv6路由查找算法.pdf

    ### 一种新的快速IPv6路由查找算法 #### 摘要 本文介绍了一种新的快速IPv6路由查找算法。该算法结合了IPv6地址结构特点和骨干路由表特性,利用Hash表和多分支Trie树的数据结构来提高查找效率。算法能够有效地处理最...

    基于非重叠前缀集合的并行路由查找系统.pdf

    ### 基于非重叠前缀集合的并行路由查找系统 #### 摘要与背景 在高性能路由器的设计中,快速路由查找是至关重要的技术之一。传统的路由查找算法通常面临查找速度慢、资源消耗大的问题,尤其是在处理大规模路由表时...

    高端路由器路由查找算法分析与实现.pdf

    【路由器路由查找算法分析】 高端路由器在互联网基础设施中扮演着至关重要的角色,它们需要处理海量的数据包转发,因此路由查找算法的效率直接影响到路由器的性能。传统的路由查找算法,如AVL + Cache策略,虽然在...

    Linux系统策略性路由查找算法的分析与改进.pdf

    本文主要分析了Linux 2.4版本中策略性路由查找算法,并提出了一种改进方案,以提高路由查找效率并解决冲突漏洞。 Linux从2.1版本的内核开始引入策略性路由,它通过路由策略数据库(RPDB)替代传统的基于目的地址的...

    Trie树路由查找算法在网络处理器中的实现.pdf

    在现代网络处理器的设计与应用中,Trie树(又称前缀树或字典树)作为一种高效的数据结构,被广泛用于路由查找算法。Trie树的优势在于它能快速地进行字符串查找,尤其是对于IP地址这样的前缀匹配问题,Trie树能够显著...

    基于网络处理器IXP1200的路由查找功能的微码实现.pdf

    《基于网络处理器IXP1200的路由查找功能的微码实现》 网络处理器,尤其是Intel的IXP1200,是通信设备中的一种关键组件,它结合了ASIC的高速处理能力和CPU的可编程性,以满足现代网络对处理器处理速度和开发周期的...

    IPv6路由查找算法探究

    有关ipv6的所有的查找算法,软件方法硬件方法等等

    电信设备-AD+HOC+无线通信系统中的最小代价路由查找.zip

    本文将深入探讨AD-HOC无线通信系统中的最小代价路由查找算法,这是保证网络效率和稳定性的关键。 AD-HOC网络的特点在于其动态性,节点(通常是移动设备)可以自由加入或离开网络,这给路由策略带来了挑战。在这样的...

    [管理]路由查找算法大作业.doc

    [管理]路由查找算法大作业.doc

    IP路由查找最长匹配原则

    在wps中通过ip路由查找的最长匹配原则搜索ip地址所属的地址段。例如你是一位网络管理员,手头上有上百个已分配的地址段,当需要快速定位单个ip地址属于哪个网段时,那么这个工具可以帮你快速定位。

    有类别路由 和 无类别路由 区别

    有类别路由和无类别路由的区别在于路由表的查找和转发数据包的方式,有类路由协议查找路由表的行为是首先匹配主网络号,然后匹配子网号,而无类路由协议查找路由表的行为是按照最长匹配的原则进行查找路由。

    基于前缀扩展的三级索引路由查找算法

    《基于前缀扩展的三级索引路由查找算法》 随着互联网的飞速发展,网络传输量不断攀升,对高速路由器的性能提出了严峻挑战。在这样的背景下,路由查找速度成为提升路由器转发性能的关键因素。传统的路由查找算法已...

Global site tag (gtag.js) - Google Analytics