数据结构(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;

}

 

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
赫夫曼树是一种用于编码的数据结构,其带权路径长度(WPL)是指树中所有叶子节点的权值乘上其到根节点的路径长度之和。求赫夫曼树的带权路径长度需要以下步骤: 1. 给定n个权值,将它们看作n棵只有一个节点的树。 2. 在森林中选择两棵根节点权值最小的树合并成一棵新树,新树的根节点权值为这两棵树根节点权值之和。 3. 把新树加入到森林中。 4. 重复步骤2和3,直到森林中只剩下一棵树,即为赫夫曼树。 5. 计算赫夫曼树的带权路径长度,即为树中所有叶子节点的权值乘上其到根节点的路径长度之和。 下面以一个示例进行详细说明: 假设有以下5个权值:{5, 6, 7, 8, 9} 1. 将它们看作5棵只有一个节点的树,如下所示: ``` | 5 | ----- / \ / \ / \ ``` ``` | 6 | ----- / \ / \ / \ ``` ``` | 7 | ----- / \ / \ / \ ``` ``` | 8 | ----- / \ / \ / \ ``` ``` | 9 | ----- / \ / \ / \ ``` 2. 选择两棵根节点权值最小的树合并成一棵新树,新树的根节点权值为这两棵树根节点权值之和。首先选择5和6合并,得到新树11,如下所示: ``` 11 ----- / \ / \ 5 6 ``` 再选择7和8合并,得到新树15,如下所示: ``` 11 15 ----- ----- / \ / \ / \ / \ 5 6 7 8 ``` 接着选择11和15合并,得到新树26,如下所示: ``` 26 ------- / \ / \ 11 15 ----- ----- / \ / \ / \ / \ 5 6 7 8 ``` 3. 把新树加入到森林中。此时森林中只剩下一棵树,即为赫夫曼树,如下所示: ``` 26 ------- / \ / \ 11 15 ----- ----- / \ | / \ | 5 6 | ----- / \ / \ 7 8 ``` 4. 计算赫夫曼树的带权路径长度,即为树中所有叶子节点的权值乘上其到根节点的路径长度之和。如下所示: ``` 5 * 3 + 6 * 3 + 7 * 2 + 8 * 2 + 9 * 3 = 99 ``` 因此,赫夫曼树的带权路径长度为99。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值