知识大全 JAVA编程语言程序开发技术Dijkstra
Posted 路径
篇首语:最强的人并不一定都是成功的人,却一定是在他们失去之时不放弃的人。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JAVA编程语言程序开发技术Dijkstra相关的知识,希望对你有一定的参考价值。
JAVA编程语言程序开发技术Dijkstra 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法 用于计算一个节点到其他所有节点的最短路径 主要特点是以起始点为中心向外层层扩展 直到扩展到终点为止
Dijkstra一般的表述通常有两种方式 一种用永久和临时标号方式 一种是用OPEN CLOSE表方式
用OPEN CLOSE表的方式 其采用的是贪心法的算法策略 大概过程如下
声明两个集合 open和close open用于存储未遍历的节点 close用来存储已遍历的节点
初始阶段 将初始节点放入close 其他所有节点放入open
以初始节点为中心向外一层层遍历 获取离指定节点最近的子节点放入close并从新计算路径 直至close包含所有子节点
代码实例如下
Node对象用于封装节点信息 包括名字和子节点
[java]
public class Node
private String name;
private Map<Node Integer> child=new HashMap<Node Integer>()
public Node(String name)
this name=name;
public String getName()
return name;
public void setName(String name)
this name = name;
public Map<Node Integer> getChild()
return child;
public void setChild(Map<Node Integer> child)
this child = child;
MapBuilder用于初始化数据源 返回图的起始节点
[java]
public class MapBuilder
public Node build(Set<Node> open Set<Node> close)
Node nodeA=new Node( A )
Node nodeB=new Node( B )
Node nodeC=new Node( C )
Node nodeD=new Node( D )
Node nodeE=new Node( E )
Node nodeF=new Node( F )
Node nodeG=new Node( G )
Node nodeH=new Node( H )
nodeA getChild() put(nodeB )
nodeA getChild() put(nodeC )
nodeA getChild() put(nodeD )
nodeA getChild() put(nodeG )
nodeA getChild() put(nodeF )
nodeB getChild() put(nodeA )
nodeB getChild() put(nodeF )
nodeB getChild() put(nodeH )
nodeC getChild() put(nodeA )
nodeC getChild() put(nodeG )
nodeD getChild() put(nodeA )
nodeD getChild() put(nodeE )
nodeE getChild() put(nodeD )
nodeE getChild() put(nodeF )
nodeF getChild() put(nodeE )
nodeF getChild() put(nodeB )
nodeF getChild() put(nodeA )
nodeG getChild() put(nodeC )
nodeG getChild() put(nodeA )
nodeG getChild() put(nodeH )
nodeH getChild() put(nodeB )
nodeH getChild() put(nodeG )
open add(nodeB)
open add(nodeC)
open add(nodeD)
open add(nodeE)
open add(nodeF)
open add(nodeG)
open add(nodeH)
close add(nodeA)
return nodeA;
图的结构如下图所示
Dijkstra对象用于计算起始节点到所有其他节点的最短路径
[java]
public class Dijkstra
Set<Node> open=new HashSet<Node>()
Set<Node> close=new HashSet<Node>()
Map<String Integer> path=new HashMap<String Integer>() //封装路径距离
Map<String String> pathInfo=new HashMap<String String>() //封装路径信息
public Node init()
//初始路径 因没有A >E这条路径 所以path(E)设置为Integer MAX_VALUE
path put( B )
pathInfo put( B A >B )
path put( C )
pathInfo put( C A >C )
path put( D )
pathInfo put( D A >D )
path put( E Integer MAX_VALUE)
pathInfo put( E A )
path put( F )
pathInfo put( F A >F )
path put( G )
pathInfo put( G A >G )
path put( H Integer MAX_VALUE)
pathInfo put( H A )
//将初始节点放入close 其他节点放入open
Node start=new MapBuilder() build(open close)
return start;
public void putePath(Node start)
Node nearest=getShortestPath(start) //取距离start节点最近的子节点 放入close
if(nearest==null)
return;
close add(nearest)
open remove(nearest)
Map<Node Integer> childs=nearest getChild()
for(Node child:childs keySet())
if(ntains(child))//如果子节点在open中
Integer newCompute=path get(nearest getName())+childs get(child)
if(path get(child getName())>newCompute)//之前设置的距离大于新计算出来的距离
path put(child getName() newCompute)
pathInfo put(child getName() pathInfo get(nearest getName())+ > +child getName())
putePath(start) //重复执行自己 确保所有子节点被遍历
putePath(nearest) //向外一层层递归 直至所有顶点被遍历
public void printPathInfo()
Set<Map Entry<String String》 pathInfos=pathInfo entrySet()
for(Map Entry<String String> pathInfo:pathInfos)
System out println(pathInfo getKey()+ : +pathInfo getValue())
/**
* 获取与node最近的子节点
*/
private Node getShortestPath(Node node)
Node res=null;
int minDis=Integer MAX_VALUE;
Map<Node Integer> childs=node getChild()
for(Node child:childs keySet())
if(ntains(child))
int distance=childs get(child)
if(distance<minDis)
minDis=distance;
res=child;
return res;
Main用于测试Dijkstra对象
[java]
public class Main
public static void main(String[] args)
Dijkstra test=new Dijkstra()
Node start=test init()
putePath(start)
test printPathInfo()
打印输出如下
D:A >D
E:A >F >E
F:A >F
G:A >C >G
B:A >B
C:A >C
cha138/Article/program/Java/hx/201311/26170相关参考
JAVA编程语言开发下载文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! [java] /*
JAVA编程语言开发DES算法理论 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! [java]
Java编程语言程序的认识误区 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 越来越多人开始使用
针对Java开发人员的C#编程语言(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 此程序的
现在的软件开发语言太多了尤其现在的所有软件都基本是B/S结构的所以对WEB开发语言的使用也就越来越多搞了几年的JAVA开发 这段时间也抽了点时间玩玩dotnetperlphp等其它WEB
扫雷程序(Java语言) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! importjavaaw
从Java语言编程谈软件开发流程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 你我的生活周遭已
C#语言与Java语言程序的比较 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 迈入二十一世纪以
JAVA线程编程----两个线程的程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 于Java
Rails开发与Java编程的比较 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 年月日&nbs