- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
在构造哈夫曼树的过程中,首先将每个节点的双亲、左孩子、右孩子都初始化为-1,找出所有节点中双亲为 -1 且权值最小的两个节点 t1 和 t2,并合并为一棵二叉树,更新信息(双亲节点的权值为 t1、t2 权值之和,其左孩子为权值最小的节点 t1,右孩子为次小的节点 t2,t1、t2 的双亲为双亲节点的编号)。重复此过程,建成一棵哈夫曼树。
每个节点的结构都包括权值、双亲、左孩子、右孩子、节点字符信息五个域。如下图所示:
| <br>weight<br> | <br>parent<br> | <br>lchild<br> | <br>rchild<br> | <br>value<br> |
在结构体的编码过程中,bit[] 存放节点的编码,start 记录编码开始时的下标,在逆向编码存储时,start 从 n-1 开始依次递减,从后向前存储,当读取时,从start+1 开始到 n-1,从前向后输出,即该字符的编码。
package tree;
import java.util.Scanner;
public class Huffman {
static int MAXBIT = 100;
static int MAXVALUE = 10000;
static int MAXLEAF = 30;
static int MAXNODE = MAXLEAF * 2 - 1;
/* 构造哈夫曼树 */
static void HuffmanTree(HNodeType HuffNode[], int n) {
/*
i、j: 循环变量,
m1、m2:构造哈夫曼树不同过程中两个最小权值结点的权值,
x1、x2:构造哈夫曼树不同过程中两个最小权值结点在数组中的序号。*/
int i, j, x1, x2;
double m1, m2;
Scanner scanner = new Scanner(System.in);
/* 初始化存放哈夫曼树数组 HuffNode[] 中的结点 */
for (i = 0; i < 2 * n - 1; i++) {
HuffNode[i].weight = 0; // 权值
HuffNode[i].parent = -1;
HuffNode[i].lchild = -1;
HuffNode[i].rchild = -1;
}
/* 输入 n 个叶子结点的权值 */
for (i = 0; i < n; i++) {
System.out.println("请输入节点字符和节点权值:");
HuffNode[i].value = scanner.next().charAt(0);
HuffNode[i].weight = scanner.nextInt();
}
/* 构造 Huffman 树 */
for (i = 0; i < n - 1; i++) { // 执行 n-1 次合并
/* m1、m2 中存放两个无父结点且结点权值最小的两个结点 */
m1 = m2 = MAXVALUE;
x1 = x2 = 0;
/* 找出所有结点中权值最小、无父结点的两个结点,并合并之为一棵二叉树 */
for (j = 0; j < n + i; j++) {
if (HuffNode[j].weight < m1 && HuffNode[j].parent == -1) {
m2 = m1;
x2 = x1;
m1 = HuffNode[j].weight;
x1 = j;
} else if (HuffNode[j].weight < m2 && HuffNode[j].parent == -1) {
m2 = HuffNode[j].weight;
x2 = j;
}
}
/* 设置找到的两个子结点 x1、x2 的父结点信息 */
HuffNode[x1].parent = n + i;
HuffNode[x2].parent = n + i;
HuffNode[n + i].weight = m1 + m2;
HuffNode[n + i].lchild = x1;
HuffNode[n + i].rchild = x2;
//System.out.println("本轮中X1的权值:" + HuffNode[x1].weight + "\t本轮中X1的权值:" + HuffNode[x2].weight); // 用于测试
}
}
/* 哈夫曼树编码 */
static void HuffmanCode(HCodeType HuffCode[], HNodeType HuffNode[], int n) {
HCodeType cd = new HCodeType(); /* 定义一个临时变量来存放求解编码时的信息 */
int i, j, c, p;
for (i = 0; i < n; i++) {
cd.start = n - 1;
c = i;
p = HuffNode[c].parent;
while (p != -1) {
if (HuffNode[p].lchild == c)
cd.bit[cd.start] = 0;
else
cd.bit[cd.start] = 1;
cd.start--; /*前移一位 */
c = p;
p = HuffNode[c].parent; /* 设置下一循环条件 */
}
/* 把叶子结点的编码信息从临时编码 cd 中复制出来,放入编码结构体数组 */
for (j = cd.start + 1; j < n; j++)
HuffCode[i].bit[j] = cd.bit[j];
HuffCode[i].start = cd.start;
}
}
public static void main(String[] args) {
int i, j, n;
System.out.println("请输入n:");
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
/* 定义一个结点结构体数组 */
HNodeType HuffNode[] = new HNodeType[MAXNODE];
/* 定义一个编码结构体数组*/
HCodeType HuffCode[] = new HCodeType[MAXLEAF];
for (int i1 = 0; i1 < HuffNode.length; i1++) {
HuffNode[i1] = new HNodeType();
}
for (int i1 = 0; i1 < HuffCode.length; i1++) {
HuffCode[i1] = new HCodeType();
}
HuffmanTree(HuffNode, n); //构造哈夫曼树
HuffmanCode(HuffCode, HuffNode, n); // 哈夫曼树编码
// 输出已保存好的所有存在编码的哈夫曼编码
for (i = 0; i < n; i++) {
System.out.println(HuffNode[i].value + "哈夫曼编码是:");
for (j = HuffCode[i].start + 1; j < n; j++) {
System.out.printf(" " + HuffCode[i].bit[j]);
}
System.out.println();
}
}
}
// 节点的数据结构
class HNodeType {
public double weight;
public int parent;
public int lchild;
public int rchild;
public char value;
}
// 每个节点的编码
class HCodeType {
public int bit[] = new int[Huffman.MAXBIT];
public int start;
}
绿色为输入,白色为输出。
背景: 我最近一直在使用 JPA,我为相当大的关系数据库项目生成持久层的轻松程度给我留下了深刻的印象。 我们公司使用大量非 SQL 数据库,特别是面向列的数据库。我对可能对这些数据库使用 JPA 有一
我已经在我的 maven pom 中添加了这些构建配置,因为我希望将 Apache Solr 依赖项与 Jar 捆绑在一起。否则我得到了 SolarServerException: ClassNotF
interface ITurtle { void Fight(); void EatPizza(); } interface ILeonardo : ITurtle {
我希望可用于 Java 的对象/关系映射 (ORM) 工具之一能够满足这些要求: 使用 JPA 或 native SQL 查询获取大量行并将其作为实体对象返回。 允许在行(实体)中进行迭代,并在对当前
好像没有,因为我有实现From for 的代码, 我可以转换 A到 B与 .into() , 但同样的事情不适用于 Vec .into()一个Vec . 要么我搞砸了阻止实现派生的事情,要么这不应该发
在 C# 中,如果 A 实现 IX 并且 B 继承自 A ,是否必然遵循 B 实现 IX?如果是,是因为 LSP 吗?之间有什么区别吗: 1. Interface IX; Class A : IX;
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在阅读标准haskell库的(^)的实现代码: (^) :: (Num a, Integral b) => a -> b -> a x0 ^ y0 | y0 a -> b ->a expo x0
我将把国际象棋游戏表示为 C++ 结构。我认为,最好的选择是树结构(因为在每个深度我们都有几个可能的移动)。 这是一个好的方法吗? struct TreeElement{ SomeMoveType
我正在为用户名数据库实现字符串匹配算法。我的方法采用现有的用户名数据库和用户想要的新用户名,然后检查用户名是否已被占用。如果采用该方法,则该方法应该返回带有数据库中未采用的数字的用户名。 例子: “贾
我正在尝试实现 Breadth-first search algorithm , 为了找到两个顶点之间的最短距离。我开发了一个 Queue 对象来保存和检索对象,并且我有一个二维数组来保存两个给定顶点
我目前正在 ika 中开发我的 Python 游戏,它使用 python 2.5 我决定为 AI 使用 A* 寻路。然而,我发现它对我的需要来说太慢了(3-4 个敌人可能会落后于游戏,但我想供应 4-
我正在寻找 Kademlia 的开源实现C/C++ 中的分布式哈希表。它必须是轻量级和跨平台的(win/linux/mac)。 它必须能够将信息发布到 DHT 并检索它。 最佳答案 OpenDHT是
我在一本书中读到这一行:-“当我们要求 C++ 实现运行程序时,它会通过调用此函数来实现。” 而且我想知道“C++ 实现”是什么意思或具体是什么。帮忙!? 最佳答案 “C++ 实现”是指编译器加上链接
我正在尝试使用分支定界的 C++ 实现这个背包问题。此网站上有一个 Java 版本:Implementing branch and bound for knapsack 我试图让我的 C++ 版本打印
在很多情况下,我需要在 C# 中访问合适的哈希算法,从重写 GetHashCode 到对数据执行快速比较/查找。 我发现 FNV 哈希是一种非常简单/好/快速的哈希算法。但是,我从未见过 C# 实现的
目录 LRU缓存替换策略 核心思想 不适用场景 算法基本实现 算法优化
1. 绪论 在前面文章中提到 空间直角坐标系相互转换 ,测绘坐标转换时,一般涉及到的情况是:两个直角坐标系的小角度转换。这个就是我们经常在测绘数据处理中,WGS-84坐标系、54北京坐标系
在软件开发过程中,有时候我们需要定时地检查数据库中的数据,并在发现新增数据时触发一个动作。为了实现这个需求,我们在 .Net 7 下进行一次简单的演示. PeriodicTimer .
二分查找 二分查找算法,说白了就是在有序的数组里面给予一个存在数组里面的值key,然后将其先和数组中间的比较,如果key大于中间值,进行下一次mid后面的比较,直到找到相等的,就可以得到它的位置。
我是一名优秀的程序员,十分优秀!