java-贪心算法

1. 霍夫曼编码(Huffman Coding)

描述
霍夫曼编码是一种使用变长编码表对数据进行编码的算法,由David A. Huffman在1952年发明。它是一种贪心算法,用于数据压缩。霍夫曼编码通过构建一个二叉树(霍夫曼树),树中的每个叶子节点代表一个字符,树的权重表示字符出现的频率。构建树的过程中,总是将两个权重最小的节点合并。

Java案例

import java.util.PriorityQueue;public class HuffmanCoding {static class Node {char data;int frequency;Node left, right;Node(char data, int frequency) {this.data = data;this.frequency = frequency;left = right = null;}}// 构建霍夫曼树static Node buildHuffmanTree(char data[], int frequency[]) {PriorityQueue<Node> minHeap = new PriorityQueue<>((a, b) -> a.frequency - b.frequency);for (int i = 0; i < data.length; i++) {minHeap.add(new Node(data[i], frequency[i]));}while (minHeap.size() > 1) {Node x = minHeap.poll();Node y = minHeap.poll();Node f = new Node('\0', x.frequency + y.frequency);f.left = x;f.right = y;minHeap.add(f);}return minHeap.poll();}// 打印霍夫曼编码static void printCodes(Node root, String s) {if (root.left == null && root.right == null && Character.isLetter(root.data)) {System.out.println(root.data + ": " + s);return;}printCodes(root.left, s + "0");printCodes(root.right, s + "1");}public static void main(String[] args) {char data[] = {'a', 'b', 'c', 'd', 'e', 'f'};int frequency[] = {5, 9, 12, 13, 16, 45};Node root = buildHuffmanTree(data, frequency);printCodes(root, "");}
}

2. 活动选择问题(Activity Selection Problem)

描述
活动选择问题是一个经典的贪心算法问题,给定一系列活动,每个活动都有开始时间和结束时间,目标是选择最大数量的互不重叠的活动。

Java案例

import java.util.Arrays;public class ActivitySelection {public static void selectActivities(int start[], int end[]) {Arrays.sort(end); // 按结束时间排序int i = 0, activities = 0;for (int j = 1; j < end.length; j++) {if (start[i] < end[j]) { // 如果当前活动的开始时间小于前一个活动的结束时间activities++;i = j; // 更新当前活动的索引}}System.out.println("Total activities selected: " + activities);}public static void main(String[] args) {int start[] = {1, 3, 0, 5, 8, 5};int end[] = {2, 4, 6, 7, 9, 9};selectActivities(start, end);}
}

3. 硬币找零问题(Coin Change Problem)

描述
硬币找零问题是一个典型的贪心算法问题,给定不同面额的硬币和一个总金额,目标是使用最少数量的硬币凑成总金额。

Java案例

public class CoinChange {public static int coinChange(int[] coins, int amount) {int[] dp = new int[amount + 1];Arrays.fill(dp, amount + 1); // 初始化为最大值dp[0] = 0; // 0元需要0个硬币for (int i = 1; i <= amount; i++) {for (int coin : coins) {if (i >= coin && dp[i - coin] != amount + 1) {dp[i] = Math.min(dp[i], dp[i - coin] + 1);}}}return dp[amount] > amount ? -1 : dp[amount];}public static void main(String[] args) {int[] coins = {1, 2, 5};int amount = 11;int result = coinChange(coins, amount);if (result != -1) {System.out.println("Minimum number of coins required: " + result);} else {System.out.println("Not possible to make the given amount");}}
}

这些案例展示了贪心算法在不同问题中的应用,包括霍夫曼编码、活动选择问题和硬币找零问题。贪心算法通过在每一步选择局部最优解来寻找全局最优解。

🌐 霍夫曼编码和哈夫曼编码有什么区别?

霍夫曼编码(Huffman Coding)和哈夫曼编码(Huffman Coding)实际上是同一个概念,只是翻译名称上的不同。在中文文献和技术社区中,这两种叫法都被广泛使用,但它们指的是同一种编码方法。

霍夫曼编码是一种广泛使用的无损数据压缩算法,由David A. Huffman在1952年发明。它是一种贪心算法,通过构建一个二叉树(霍夫曼树)来为输入字符分配可变长度的编码。树的叶子节点代表输入字符,而树的权重表示字符出现的频率。构建树的过程中,总是将两个权重最小的节点合并,直到构建出完整的霍夫曼树。然后,通过遍历树来为每个字符分配一个唯一的二进制编码,频率高的字符会被分配较短的编码,而频率低的字符则会被分配较长的编码。

因此,当你看到“霍夫曼编码”和“哈夫曼编码”时,可以认为它们是同一个算法的不同叫法。在英文中,这个算法统一被称为“Huffman Coding”。
在这里插入图片描述

🤔 霍夫曼编码在哪些场景下应用效果最好?

霍夫曼编码(Huffman Coding)在以下场景下应用效果最好:

  1. 文件压缩
    霍夫曼编码广泛应用于文件压缩领域,特别是在存储文件时,可以通过压缩来节省磁盘空间。虽然文件压缩后需要解压缩才能使用,但这通常是一次性的操作,因此空间和时间的权衡是可接受的。例如,在文件系统中存储不常使用的文件时,使用霍夫曼编码进行压缩可以显著减少存储空间的需求。

  2. 数据通信
    在数据通信领域,霍夫曼编码可以减少通信和I/O开销,特别是在高速流处理中。压缩原始模拟数据并在后处理前解压缩可以显著提高工作效率。

  3. 图像和视频压缩
    霍夫曼编码是许多图像和视频压缩标准的一部分,如JPEG。它用于对图像和视频数据进行无损压缩,是这些应用中不可或缺的一部分。

  4. 大规模科学数据集
    霍夫曼编码也被广泛用于压缩大型科学数据集,这些数据集对数据保真度有很高的要求。它在这些应用中表现出色,因为它可以有效地压缩数据,同时保持高数据保真度。

  5. 文本编码
    霍夫曼编码用于文本编码,特别是在不同字符使用频率差异较大的情况下。它通过为更频繁出现的字符分配较短的编码来实现空间效率,这在英语文档等文本中尤其有效,因为不同字母的使用频率差异很大。

  6. 通用无损压缩软件或库
    霍夫曼编码是许多通用无损压缩软件或库(如GZIP、Zstd和Blosc)中的关键步骤,它提供了一种有效的熵编码算法。

  7. 错误有界损失压缩
    在一些需要错误有界损失压缩的应用中,霍夫曼编码也被广泛使用,例如SZ和MGARD压缩器,这些压缩器在压缩大数据集时非常有效。

综上所述,霍夫曼编码在需要有效压缩数据以节省空间或减少传输时间的场景中效果最好,尤其是在字符使用频率不均的文本数据、图像和视频数据以及大规模科学数据集的压缩中。

📈 霍夫曼编码在减少网络带宽方面有哪些优势?

霍夫曼编码在减少网络带宽方面的优势主要体现在以下几个方面:

  1. 高效压缩
    霍夫曼编码为每个字符分配一个基于其出现频率的变长编码,高频字符使用较短的编码,低频字符使用较长的编码。这种优化可以显著减少数据的整体大小,从而减少网络传输所需的带宽。

  2. 适应性
    霍夫曼编码是自适应的,可以根据数据的实际内容动态构建最优编码树。这意味着它能够针对特定的数据集进行优化,与固定编码方案相比,能够更有效地压缩数据。

  3. 无损压缩
    霍夫曼编码是一种无损压缩算法,这意味着压缩和解压后的数据与原始数据完全相同。这对于必须确保数据完整性的应用场景(如文件传输、视频流等)至关重要。

  4. 广泛支持
    霍夫曼编码被广泛支持和实现在各种压缩工具和协议中,如HTTP压缩、ZIP文件格式、JPEG图像压缩等。这种广泛的支持意味着它可以很容易地集成到现有的网络通信系统中。

  5. 减少延迟
    通过减少数据的大小,霍夫曼编码可以减少数据在网络上的传输时间,从而降低延迟,特别是在高延迟网络环境中。

  6. 节省成本
    减少网络带宽的使用可以直接降低网络服务提供商的成本,尤其是在需要支付流量费用的场景下,如移动数据服务。

  7. 提高吞吐量
    在带宽受限的网络中,更有效地压缩数据可以提高网络的吞吐量,允许在同一带宽内传输更多的数据。

  8. 支持流式传输
    霍夫曼编码支持流式压缩和解压,这意味着数据可以边传输边解压,而不需要等待整个文件传输完成,这对于流媒体应用(如视频会议和在线视频流)非常有用。

  9. 易于实现
    霍夫曼编码算法相对简单,易于实现,并且有许多现成的库和工具可供使用,这使得它能够快速部署在各种网络应用中。

  10. 可扩展性
    霍夫曼编码可以应用于不同规模的数据,从小型文本文件到大型视频文件,都能有效地减少所需的网络带宽。

综上所述,霍夫曼编码在减少网络带宽方面的优势使其成为网络数据传输中不可或缺的技术之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…

实时数仓:Lambda架构和Kappa架构有什么联系和区别

Kappa 和 Lambda 架构是处理大数据和实时数据流的两种不同设计模式。以下是对这两种架构的概述和比较&#xff1a; Lambda 架构 定义&#xff1a; Lambda 架构的全称是 Lambda Architecture。这个架构旨在处理大规模数据&#xff0c;结合了批处理和流处理的优点&#xff0c;以…

vllm源码解析(一):整体架构与推理代码

vlllm官方代码更新频发,每个版本都有极大变动, 很难说哪个版本好用. 第一次阅读vllm源码是0.4.0版本,对这版圈复杂度极高的调度代码印象深刻 0.4.1对调度逻辑进行重构,完全大变样, 读代码速度快赶不上迭代的速度了。 现在已经更新到0.5.4, 经过长时间观察&#xff0c;发现主要的…

数据库index(索引)使用注释事项

1、索引类型&#xff0c;通常选择NORMAL或者UNIQUE. NORMAL&#xff1a;正常的一种索引吧。 UNIQUE:索引列必须是不能重复的。 2、索引方法&#xff1a;通常选择BTREE 3、使用SQL查询的时候&#xff0c;不需要特别处理索引的字段。数据库会自动的处理&#xff0c;提升SQL的查…

集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1

蓝牙模组 - RF-BM-2340B1是基于美国TI的CC2340R5为核心设计的一款SimpleLink 2.4 GHz 无线模块。支持Bluetooth 5.3 Low Energy、Zigbee 、IEEE 802.15.4g、TI 15.4-Stack (2.4 GHz)及私有协议。集成了高性能ARM Cortex-M0处理器&#xff0c;具有512 KB Flash、32 KB超低泄漏SR…

[QDS]从零开始,写第一个Qt Design Studio到程序调用的项目

前言 最近在使用Qt Design Studio进行开发&#xff0c;但是简中网上要不就是只搜得到Qt Designer(Qt Creator内部库)&#xff0c;要不就只搜得到一点营销号不知道从哪里搬来的账号&#xff0c;鉴于Qt Design Studio是一个这么强大的软件&#xff0c;自然是需要来进行一下小小的…

Spring Boot实现License生成和校验

Spring Boot实现License生成和校验 证书准备 # 1. 生成私钥库 # validity&#xff1a;私钥的有效期&#xff08;天&#xff09; # alias&#xff1a;私钥别称 # keystore&#xff1a;私钥库文件名称&#xff08;生成在当前目录&#xff09; # storepass&#xff1a;私钥库密码…

【大模型推理】vLLM 源码学习

强烈推荐 https://zhuanlan.zhihu.com/p/680153425 sequnceGroup 存储了相同的prompt对应的不同的sequence, 所以用字典存储 同一个Sequence可能占据多个逻辑Block&#xff0c; 所以在Sequence 中用列表存储 同一个block 要维护tokens_id 列表, 需要添加操作。 还需要判断blo…

核心速览12

研究背景 研究问题&#xff1a;这篇文章探讨了多模态人工智能&#xff08;Agent AI&#xff09;系统在理解和响应视觉和语言输入方面的潜力&#xff0c;特别是在物理和虚拟环境中的应用。Agent AI旨在通过感知和行动来增强人工智能系统的交互性和适应性。研究难点&#xff1a;…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

若依springboot 删除一直转 问题处理

src\main\resources\static\ruoyi\js\ry-ui.js submit方法1578行添加 $.operate.successCallback(result); 在线体验 admin/admin123陆陆续续收到一些打赏&#xff0c;为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 演示地址&#xff1a;http://ruoyi.vip 文档地址…

面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案

引言&#xff1a; 随着科技的飞速发展&#xff0c;智能视觉IoT已成为科技领域的热门话题&#xff0c;为智能家居、智慧城市等领域带来新机遇。然而&#xff0c;物联网市场的碎片化特性对智能视觉芯片设计构成挑战。同时&#xff0c;汽车行业正经历技术驱动的变革&#xff0c;软…

Multiple instance learning with graph neural networks文献笔记

基本信息 文章链接&#xff1a;[1906.04881] Multiple instance learning with graph neural networks 将每个包视为一个图&#xff0c;利用GNN学习包的嵌入&#xff0c;以探索包中实例之间有用的结构信息。最终的图表示被送入分类器进行标签预测。 具体方法 输入&#xff…

Elasticsearch是如何实现Master选举的?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch是如何实现Master选举的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch是如何实现Master选举的&#xff1f; Elasticsearch 使用 Zen Discovery 插件&#xff08;在较新的版本中是基于 Zen2&…

WEB-通用漏洞SQL注入CTF二次堆叠DNS带外

知识点&#xff1a; 1、数据库堆叠注入 根据数据库类型决定是否支持多条语句执行 数据库支持多条语句执行就是堆叠&#xff0c;如&#xff1a; 2、数据库二次注入 应用功能逻辑涉及上导致的先写入后组合的注入 3、数据库Dnslog注入 解决不回显&#xff08;反向连接&#…

上生产时连接mysql数据库总是被拒绝

背景&#xff1a; 本地项目连接数据正常 测试环境也正常 到生产上就一直报错 且生产上使用mysql连接工具可以正常连接 报错信息&#xff1a;Connections refused: connect 调查&#xff1a; 数据库版本&#xff1a; 本地 mysql5.7.24 测试 8.3 生产5.7.36 连接驱动&#xf…

20241121买深圳保障房还是租保租房小思考?

1. 我的买深圳保障房或租保租房的出发点&#xff1f; 我的需求&#xff1a;主要是小孩读书 如果买深圳保障房例如人才房和安居房&#xff0c;会有购房合同&#xff0c;则读书积分等同有红本积分&#xff0c;相当于可以选择一些不错的公办学校 如果租保租房&#xff0c;由于查…

鸿蒙生态崛起

1.鸿蒙生态&#xff1a;开发者的新蓝海 从开发者角度看&#xff0c;鸿蒙生态带来了巨大机遇。其分布式能力实现了不同设备间的无缝体验&#xff0c;如多屏协同&#xff0c;让应用能跨手机、平板、智能穿戴和车载设备流畅运行。开发工具也有显著提升&#xff0c;方舟编译器等极大…

使用Python3实现Gitee码云自动化发布

仓库信息 https://gitee.com/liumou_site/ip 实现代码 import osimport requests from loguru import loggerdef gitee(ver, message, prerelease: bool False):"""在 Gitee 上创建发布版本:param ver: 版本号:param message: 发布信息:param prerelease: 是…