排名好的锦州网站建设wordpress添加文章时可以上传视频

张小明 2026/1/9 7:10:16
排名好的锦州网站建设,wordpress添加文章时可以上传视频,专业搜索引擎优化电话,做一个营销型的网站多少钱给定n个权值作为n个节点#xff0c;构造一棵二叉树#xff0c;若该树的带权路径长度(wpl)达到最小#xff0c;这样的二叉树便成为最优二叉树#xff0c;也被称为赫夫曼树。节点的权#xff1a;将树中节点付给某一个具有某种含义的数值#xff0c;这个值便被称为节点的权。…给定n个权值作为n个节点构造一棵二叉树若该树的带权路径长度(wpl)达到最小这样的二叉树便成为最优二叉树也被称为赫夫曼树。节点的权将树中节点付给某一个具有某种含义的数值这个值便被称为节点的权。节点的带权路径长度便为从根节点到该节点之间的路径长度与节点的权的乘积。赫夫曼二叉树的构建从小到大对所有数据进行排序取出权值最小的两颗二叉树并组成一颗新二叉树新的二叉树的权值为这两颗二叉树的和对新二叉树以根节点的权值大小重新进行排序。重复上述步骤直到所有节点都经过处理。public class HuffmanTree { public static void main(String[] args) { int[] arr {13, 7, 8, 3, 29, 6, 1}; Node root createHuffmanTree(arr); root.preOrder(); } public static Node createHuffmanTree(int[] arr){ ListNode nodes new ArrayList(); for (int value : arr) { nodes.add(new Node(value)); } while (nodes.size() 1) { //对二叉树进行排序 Collections.sort(nodes); //取出两个最小的节点一个节点也可以看为最小的二叉树 Node left nodes.get(0); Node right nodes.get(1); //构建新二叉树 Node parent new Node(left.value right.value); parent.left left; parent.right right; nodes.remove(left); nodes.remove(right); //将最新构建的二叉树加入其中 nodes.add(parent); } return nodes.get(0); } } /** * 实现Comparable接口是为了方便节点的排序 */ class Node implements ComparableNode{ public Node left; public Node right; public int value; public Node(int value){ this.value value; } Override public String toString() { return Node{ value value }; } Override public int compareTo(Node o) { //当前节点小于 return this.value - o.value; } public void preOrder(){ System.out.println(this); if (this.left ! null){ System.out.print(左子树:); this.left.preOrder(); } if (this.right ! null){ System.out.print(右子树:); this.right.preOrder(); } } }赫夫曼编码赫夫曼编码被广泛用于数据文件的压缩压缩率一般在20%-90%之间。赫夫曼编码是可变长编码VLC的一种。并且赫夫曼编码是一种无损压缩编码。若赫夫曼树的排序方法不同对应的赫夫曼编码也不同但是wpl相同都是最小的。赫夫曼压缩代码public class Huffman { public static void main(String[] args) { String str i like like like java do you like a java; byte[] bytes str.getBytes(); ListNode codes getCodes(bytes); Node huffmanTree createHuffmanTree(codes); // huffmanTree.preOrder(); System.out.println(赫夫曼编码表); getHuffmanCodes(huffmanTree, , stringBuilder); System.out.println(huffmanCodes); byte[] zip zip(bytes, huffmanCodes); System.out.println(压缩结果 Arrays.toString(zip)); } //将赫夫曼编码表存入map中 private static MapByte,String huffmanCodes new HashMap(); //使用StringBuilder是为了方便获取这个字符的详细编码 private static StringBuilder stringBuilder new StringBuilder(); /** * 获取赫夫曼编码表 * 向左值为0向右值为1 * param node * param code * param stringBuilder */ public static void getHuffmanCodes(Node node,String code,StringBuilder stringBuilder){ //在原基础上获取 StringBuilder st new StringBuilder(stringBuilder); st.append(code); if (node.data null){ if (node.left ! null){ getHuffmanCodes(node.left, 0, st); } if (node.right ! null) getHuffmanCodes(node.right, 1, st); }else { huffmanCodes.put(node.data, st.toString()); } } //对内容进行压缩 public static byte[] zip(byte[] bytes, MapByte,String huffmanCodes){ StringBuilder builder new StringBuilder(); for (byte b : bytes) { builder.append(huffmanCodes.get(b)); } int len builder.length() % 8 0 ? builder.length()/8 : builder.length()/8 1; int index 0;//index用于记录byte的下标 byte[] fileZip new byte[len]; for (int i 0;i builder.length();i 8){ int end Math.min((i 8), builder.length()); //将builder.substring(i, end)转换为byte二进制转换为十进制 fileZip[index] (byte) Integer.parseInt(builder.substring(i, end), 2); } return fileZip; } //将文本内容转换为节点 public static ListNode getCodes(byte[] bytes) { ListNode nodes new ArrayList(); //查询并保存每个字节出现的次数 MapByte, Integer huffmanCodes new HashMap(); for (byte b : bytes) { Integer i huffmanCodes.get(b); if(i null){ huffmanCodes.put(b, 1); }else{ huffmanCodes.put(b, i1); } } //转换为Node集合 for (Map.EntryByte, Integer entry : huffmanCodes.entrySet()) { nodes.add(new Node(entry.getKey(), entry.getValue())); } return nodes; } //通过转换的节点集合转换为赫夫曼树 public static Node createHuffmanTree(ListNode nodes) { while(nodes.size() 1){ //进行排序 Collections.sort(nodes); //取出最小的两颗树 Node left nodes.get(0); Node right nodes.get(1); //进行构建最新的树 Node parent new Node(null, left.weight right.weight); parent.left left; parent.right right; //删掉原最小的两棵树 nodes.remove(left); nodes.remove(right); //将最新的树添加进去 nodes.add(parent); } return nodes.get(0); } } class Node implements ComparableNode{ public Byte data; public int weight; public Node left; public Node right; public Node(Byte data, int weight) { this.data data; this.weight weight; } public void preOrder(){ System.out.println(this); if (this.left ! null){ System.out.println(左); this.left.preOrder(); } if (this.right ! null) { System.out.println(右); this.right.preOrder(); } } Override public int compareTo(Node o) { return this.weight - o.weight; } Override public String toString() { return Node{ data data , weight weight }; } }赫夫曼编码压缩上述实例字符串后结果如下图赫夫曼编码解压赫夫曼编码解压操作是压缩操作的逆向操作即将上述压缩后结果进行还原为i like like like java do you like a java字符串。解压步骤将byte十进制数组还原为原二进制所对应的字符串根据二进制字符串通过创建的赫夫曼编码表进行还原。//这里的byte值为压缩过的值 public static byte[] decode(byte[] bytes, MapByte,String huffmanCodes){ // 添加空值检查 if (bytes null || huffmanCodes null || huffmanCodes.isEmpty()) { return new byte[0]; } // 构建二进制字符串 StringBuilder binaryStr new StringBuilder(); for (int i 0; i bytes.length; i) { boolean isLast (i bytes.length - 1); binaryStr.append(BinToString(!isLast, bytes[i])); } // 反转编码表 MapString, Byte reverseMap new HashMap(); for (Map.EntryByte, String entry : huffmanCodes.entrySet()) { reverseMap.put(entry.getValue(), entry.getKey()); } // 解码 ListByte result new ArrayList(); StringBuilder currentCode new StringBuilder(); for (int i 0; i binaryStr.length(); i) { currentCode.append(binaryStr.charAt(i)); Byte decodedByte reverseMap.get(currentCode.toString()); if (decodedByte ! null) { result.add(decodedByte); currentCode.setLength(0); } } // 转换为字节数组 byte[] source new byte[result.size()]; for (int i 0; i result.size(); i) { source[i] result.get(i); } return source; } //将压缩的byte转换为原字符串的byte //flag的作用是首先执行 bytes | 256将第9位设为1256的二进制是100000000 public static String BinToString(boolean flag,int bytes){ if(flag){ bytes | 256; } String binaryString Integer.toBinaryString(bytes); if(flag){ return binaryString.substring(binaryString.length() - 8); }else { return binaryString; } }
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

优秀设计集锦网站营销推广有哪些方式

如何在浏览器中快速解锁加密音乐文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gitcode.com/gh_mirrors/u…

张小明 2026/1/7 5:12:05 网站建设

哪个网站做ppt模板赚钱电子商务网站策划书模板

在工业设备、医疗终端和自动化控制等领域,显示模组不仅仅是“输出信息”的窗口,更是系统交互与监测的关键组件。友达光电(AUO)推出的 G150XTN03.4 正是一款针对 工业控制、机械仪表及信息显示终端 打造的高可靠性液晶屏。它在 亮度…

张小明 2026/1/7 5:15:59 网站建设

昆明网站seo技术厂家网页设计与制作教程第五版答案

颠覆传统!微软VibeVoice语音合成框架:90分钟长音频一键生成指南 【免费下载链接】VibeVoice-1.5B 项目地址: https://ai.gitcode.com/hf_mirrors/microsoft/VibeVoice-1.5B 还在为语音合成中的长文本处理效率低下而烦恼吗?微软研究院…

张小明 2026/1/7 0:47:37 网站建设

自己怎样做优惠券网站软件开发培训学费

CH340芯片在Win10/Win11下驱动安装全攻略:从识别失败到稳定通信 你有没有遇到过这样的情况——手里的STM32开发板插上电脑,设备管理器里却只显示“未知设备”?或者明明装了驱动,串口助手一打开就报错“无法打开COM端口”&#xff…

张小明 2026/1/9 4:34:01 网站建设

深圳网站建设售后服务做网站建设最好学什么

1.并行集合 1.并行集合 a.在C#中, 并行集合(Concurrent Collections)是.NET 为多线程/并行编程设计的线程安全集合b.位于System.Collections.Concurrent命名空间, 专门解决普通集合(如List<T>、Dictionary<TKey, TValue>)在多线程读写时的线程安全问题(普通集合非…

张小明 2026/1/7 6:15:33 网站建设

甘肃临夏州建设局网站9 1短视频安装

工商业企业能源困境&#xff1a;①电费飙升随着电力市场化改革持续深化&#xff0c;代理购电价格上涨&#xff0c;峰谷价差扩大&#xff08;如江苏峰谷价差超0.8元/度&#xff09;&#xff0c;企业用电成本陡增。工商业10kV及以上用户超200万户&#xff0c;若按1-2MW规模部署微…

张小明 2026/1/7 6:55:33 网站建设