数据结构(9)之带权图

1.        带权图中,边带有一个数字,叫做权,它可能代表距离、耗费、时间或其他意义。

2.        带权图用来最常解决的问题是最短路径问题(pps)。

3.        带权图的最小生成树中有所有的顶点和连接它们的必要的边,且这些边的权值最小。

4.        优先级队列的算法可用于寻找带权图的最小生成树。

5.        解决无向带权图的最小生成树的方法

1)        找到从最新的顶点到其他顶点的所有边,这些顶点不能在树的集合中,把这些边放如优先级队列。

2)        找出权值最小的边,把它和它所到达的顶点放入树的集合中。

3)        重复以上步骤,直到所有顶点都在树的集合中。

6.        带权图的最短路径问题可以用Dijkstra算法解决。这个算法基于图的邻接矩阵表示法,它不仅能找到任意两点间的最短路径,还可以找到某个指定点到其他所有顶点的最短路径。

Dijkstra算法的思想:

以解决寻找一条从一个城市到另一个城市的费用最低的路线为例(假设不能直接指导所有路线的费用,只能直接知道到邻接城市的费用)

1)        每次派一个代理人到新的城市,用这个代理人提供的新信息修正和完善费用清单,在表中之保留从源点到某个城市现在一直的最低费用

2)        不断向某个新城市派代理人,条件是从源点到那个城市的路线费用最低。

如图

7.        有时为了看出某条路线是否可能,需要创建一个连通表。在带权图中,用一张表给出任意两个顶点间的最低耗费,这对顶点可能通过几条边相连。这种问题叫做每一对顶点之间的最短路径问题。Warshall算法(此算法在图章节中详述)能很快创建这样的连通表。在带权图中类似的方法叫做Floyd算法。

Floyd算法与Warshall算法的区别。在Warshall算法中当找到一个两段路径时,只是简单的在表中插入1,在Floyd算法中,需要把两端的权值相加,并插入它们的和。

8.        关于各种图的算法的效率:

图的表示法有两种:邻接矩阵和邻接表

算法                     时间级

邻接矩阵(所有)        O(V²)

无权邻接表              O(V + E)

带权邻接表              O((E+V)logV)

Warshall和Floyd算法      O(V³)

其中V是顶点数量,E是边的数量

java排序算法的比较

import java.util.*;

import java.io.*;

public class SortAlgorithm

{

static Random rand = new Random();

void bubbleSort(int[] numlist) // 冒泡排序算法

{

int temp;

for(int j=1;j<numlist.length;j++)

for(int i=0;i<numlist.length-j;i++)

if(numlist>numlist[i+1])

{

temp = numlist[i+1];

numlist[i+1] = numlist;

numlist = temp;

}

}

void selectionSort (int[] numlist) //选择排序算法

{

int temp;

for(int i=0;i<numlist.length-1;i++)

for(int j=i+1;j<numlist.length;j++)

if(numlist>numlist[j])

{

temp = numlist[j];

numlist[j] = numlist;

numlist = temp;

}

}

void insertSort (int[] numlist) //插入排序算法

{

int temp,in,out;

for(out=1;out<numlist.length;out++)

{

temp=numlist[out];

in=out;

while(in>0 &&numlist[in-1]>=temp)

{

numlist[in]=numlist[in-1];

--in;

}

numlist[in]=temp;

}

}

void display (int[] num) // 打印出排序结果

{

for(int i = 0;i<num.length;i++)

System.out.print(num+" ");

System.out.println("");

}

static int pRand(int mod) // 生成随即数组

{

return Math.abs(rand.nextInt())%mod;

}

public static void main(Stringargs[])throws IOException

{

SortAlgorithm sortAlgorithm = newSortAlgorithm();

int[] numList = new int[10];

for(int i = 0;i<numList.length;i++)

numList = pRand(100); //调用pRand方法,把随即生成的数据输入到

// 数组中

System.out.println("随即生成的数组是:");

// 打印出原数组,

for(int j =0;j<numList.length;j++)

System.out.print(numList[j]+" ");

System.out.println("");

long begin = System.currentTimeMillis(); //排序开始时间,调用系统的当前时间

sortAlgorithm.bubbleSort(numList); //执行冒泡排序

long end = System.currentTimeMillis(); //排序结束时间,调用系统当前时间

System.out.println("冒泡排序用时为:" + (end-begin)); //排序用时

System.out.println("排序后的数组为:");

sortAlgorithm.display(numList);

begin = System.currentTimeMillis();

sortAlgorithm.selectionSort(numList);

end = System.currentTimeMillis();

System.out.println("选择排序用时为:" +(end-begin));

System.out.println("排序后的数组为:");

sortAlgorithm.display(numList);

begin = System.currentTimeMillis();

sortAlgorithm.insertSort(numList);

end = System.currentTimeMillis();

System.out.println("插入排序用时为:" + (end-begin));

System.out.println("排序后的数组为:");

sortAlgorithm.display(numList);

}

}

题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。

static int[] bits = new int[] { 1, 2, 3, 4,5 };

/**

* @param args

*/

public static void main(String[] args) {

sort("", bits);

}

private static void sort(String prefix,int[] a) {

if (a.length == 1) {

System.out.println(prefix + a[0]);

}

for (int i = 0; i < a.length; i++) {

sort(prefix + a, copy(a, i));

}

}

private static int[] copy(int[] a,intindex){

int[] b = new int[a.length-1];

System.arraycopy(a, 0, b, 0, index);

System.arraycopy(a, index+1, b, index,a.length-index-1);

return b;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值