英文:
How do I create a leaf node?
问题
这是一份作业。我已经卡在这里很久了...
我必须创建叶子节点。为此,我有LeafTreeNode
类。
LeafTreeNode.java:
import java.util.Map;
public class LeafTreeNode implements TreeNode {
private char symbol;
private int symbolCount;
public LeafTreeNode(char symbol, int symbolCount) {
this.symbol = symbol;
this.symbolCount = symbolCount;
}
public int symbolCount() {
return symbolCount;
}
public void getSymbolCodes(String prefix, Map<Character, String> symbolCodes) {
symbolCodes.put(symbol, prefix);
}
}
现在我必须使用characterHistogram(String s)
方法,并为字符串s
中出现的每个字符创建一个叶子节点。这个方法位于新类Huffman
中。
我必须在huffmanCode(String s)
方法中执行这个操作。
Huffman.java:
import java.util.Map;
public class Huffman {
private LeafTreeNode leafNode;
public int[] characterHistogram(String s) {
// 仅支持ASCII字符
int[] histogram = new int[256];
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c < 256) {
histogram[c]++;
}
System.out.println(s.charAt(i) + " <-> " + histogram[c]);
}
return histogram;
}
public void printHuffmanCoding(Map<Character, String> map) {
// for (Character c : map.keySet()) {
// System.out.println("'" + c + "': " + map.get(c));
// }
}
/**
* 计算字符串s的Huffman编码映射
*
* @param s
* 要编码的字符串
* @return Huffman编码映射
*/
public Map<Character, String> huffmanCode(String s) {
int[] histogram = characterHistogram(s);
System.out.println(1);
// leafNode.symbolCount();
// leafNode
// leafNode.getSymbolCodes(s, null);
// for( int i = 0; i < histogram.length;i++){
// histogram[i];
// }
// LeafTreeNode.getSymbolCodes(s, null)
// TODO 3.
return null;
}
/**
* @param s
* 要编码的字符串
* @param map
* Huffman编码映射
* @return s的Huffman编码的长度
*/
public long lengthHuffmanCoding(String s, Map<Character, String> map) {
// TODO 4.
return 42L;
}
/**
* @param s
* 要编码的字符串
* @return s的8位编码的长度
*/
public long length8BitCoding(String s) {
// TODO 4.
return 42L;
}
/**
* 计算给定Huffman编码映射与符号的8位编码之间的压缩比
*
* @param s
* 要编码的字符串
* @param map
* Huffman编码映射
* @return 压缩比
*/
public float computeCompressionRatio(String s, Map<Character, String> map) {
// TODO 4.
return 42.f;
}
public static void main(String[] args) {
Huffman h = new Huffman();
String s = "在此插入字符串";
Map<Character, String> map = h.huffmanCode(s);
h.printHuffmanCoding(map);
float cr = h.computeCompressionRatio(s, map);
System.out.println("压缩比率: " + (cr * 100) + "%");
}
}
我尝试使用LeafTreeNode
的方法,但这并没有起作用。我该如何创建一个叶子节点?
英文:
This is homework. I've been stuck on this a long time...
I have to create leaf nodes. For this I have the class LeafTreeNode
.
> LeafTreeNode.java :
import java.util.Map;
public class LeafTreeNode implements TreeNode {
private char symbol;
private int symbolCount;
public LeafTreeNode(char symbol, int symbolCount) {
this.symbol = symbol;
this.symbolCount = symbolCount;
}
public int symbolCount() {
return symbolCount;
}
public void getSymbolCodes(String prefix, Map<Character, String> symbolCodes) {
symbolCodes.put(symbol, prefix);
}
}
Now I have to use the method characterHistogram(String s)
and create a leaf node for each character occurring in s
.
This method is in a new class Huffman
.
I have to do this in the method huffmanCode(String s)
.
> Huffman
import java.util.Map;
public class Huffman{
private LeafTreeNode Blattknoten;
public int[] characterHistogram(String s) {
// Only ASCII
int[] histogram = new int[256];
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c < 256) {
histogram[c]++;
}
System.out.println(s.charAt(i) + " <-> " + histogram[c]);
}
return histogram;
}
public void printHuffmanCoding(Map<Character, String> map) {
// for (Character c : map.keySet()) {
// System.out.println("'" + c + "': " + map.get(c));
// }
}
/**
* Compute the Huffman coding map for s
*
* @param s
* String to encode
* @return Huffman coding map
*/
public Map<Character, String> huffmanCode(String s) {
int[] histogram = characterHistogram(s);
System.out.println(1);
// Blattknoten.symbolCount();
// Blattknoten
// Blattknoten.getSymbolCodes(s, null);
// for( int i = 0; i < histogram.length;i++){
// histogram[i];
// }
// LeafTreeNode.getSymbolCodes(s, null)
// TODO 3.
return null;
}
/**
* @param s
* String to encode
* @param map
* Huffman coding map
* @return the length of the Huffman coding of s
*/
public long lengthHuffmanCoding(String s, Map<Character, String> map) {
// TODO 4.
return 42L;
}
/**
* @param s
* String to encode
* @return the length of the 8-bit coding of s
*/
public long length8BitCoding(String s) {
// TODO 4.
return 42L;
}
/**
* Compute the compression ratio we can achieve for s given the Huffman
* encoding map as compared to 8-bit coding of the symbols.
*
* @param s
* String to encode
* @param map
* Huffman coding map
* @return compression ratio
*/
public float computeCompressionRatio(String s, Map<Character, String> map) {
// TODO 4.
return 42.f;
}
public static void main(String[] args) {
Huffman h = new Huffman();
String s = "Insert String here";
Map<Character, String> map = h.huffmanCode(s);
h.printHuffmanCoding(map);
float cr = h.computeCompressionRatio(s, map);
System.out.println("Compression ratio: " + (cr * 100) + "%");
}
}
I tried to use the methods from LeafTreeNode
but this didn't work. How I can create a leaf node?
答案1
得分: 0
遍历所有256个直方图条目,对于每一个计数不为零的条目,使用 new LeafTreeNode(i, histogram[i])
。
接下来的问题是:一旦每个叶子节点创建好了,你要做什么?
英文:
Go through all 256 histogram entries, and for each one whose count is not zero, you use new LeafTreeNode(i, histogram[i])
.
The next question will be: what do you do with each leaf once it's created?
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论