四十三、贪心——Huffman树、排序不等式

算法主要内容

  • 一、Huffman树
    • 1、题目内容——合并果子
    • 2、算法思路
      • (1)“合并果子”中的Huffman树
      • (2)算法步骤
      • (3)状态转移
    • 3、题解
  • 二、排序不等式
    • 1、题目内容——排队打水
    • 2、算法思路
      • (1)分析
      • (2)思路
      • (3)证明
    • 3、题解

一、Huffman树

  • 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树,且为完全二叉树。
    • 所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。
    • 树的带权路径长度记为WPL=(W1L1+W2L2+W3L3+…+WnLn),N个权值Wi(i=1,2,…n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,…n)。
    • 可以证明哈夫曼树的WPL带权路径长度是最小的
  • 贪心思想:
    • 选最小的两堆进行合并

1、题目内容——合并果子

在这里插入图片描述

2、算法思路

(1)“合并果子”中的Huffman树

  • 叶子结点为我们要进行合并的节点
  • 合并代价为下方两个“代价总和”相加
  • 从下向上开始合并
    在这里插入图片描述
  • 总和:(a + b)+ (c + d) +(a + b + c + d ) + e + f + a +b + c + d + e + f
  • 优化:直接计算当前根节点到根节点距离
    • 3a(到根节点的距离) + 3b + 3c + 3d + 2e + 2f

(2)算法步骤

  • 方法: 每次选出最小的两堆进行合并,寻找局部最优解的过程
    • 数最小的两个点,在树中一定是深度最深的,可以互为兄弟(不一定非得是兄弟节点)
    • 数最小,但并未在最深的一层,则需要交换,这样将使整体权值变小(2f + 3b + -(3f + 2b) = b - f > 0)

(3)状态转移

在这里插入图片描述

3、题解

import java.util.*;
import java.io.*;public class Main{public static void main(String[] args) throws IOException {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));Queue<Integer> heap = new PriorityQueue<>();String str1 = in.readLine();int n = Integer.parseInt(str1);String[] str2 = in.readLine().split(" ");for(int i = 0; i < n; i++){int x = Integer.parseInt(str2[i]);heap.add(x);}int res = 0;while(heap.size() > 1){int a = heap.poll();        // 选最小的两个点int b = heap.poll();res += a + b;               // 合并代价更新heap.add(a + b);            // a + b变成了新的节点}System.out.println(res);}
}

二、排序不等式

  • 排队问题 + 排队代价,如何让总体代价最小
  • 贪心思想:
    • 让代价越大的排序越靠后

1、题目内容——排队打水

在这里插入图片描述

2、算法思路

(1)分析

在这里插入图片描述

(2)思路

  • 按照从小到大的顺序排队,总时间最小

(3)证明

在这里插入图片描述

3、题解

import java.util.*;
import java.io.*;public class Main{static int N = 100010;static int[] time = new int[N];public static void main(String[] args) throws IOException {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));String str1 = in. readLine();int n = Integer.parseInt(str1);String[] str2 = in.readLine().split(" ");for(int i = 0; i < n; i++){time[i] = Integer.parseInt(str2[i]);}Arrays.sort(time, 0 , n);long res = 0;for(int i = 0; i < n; i++){res += time[i]*(n - i - 1);}System.out.println(res);}
}

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

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

相关文章

科研论文中SCI,SSCI ,CSSCI是什么

目录 1 SCI 2 SSCI 3 CSSCI 什么是SCI&#xff0c;SSCI &#xff0c;CSSCI 目前&#xff0c;在国际科学界&#xff0c;如何正确评价基础科学研究成果已引起越来越广泛的关注。而被SCI、SSCI收录的科技论文的多寡则被看作衡量一个国家的基础科学研究水平、科技实力和科技论文水平…

STM32——关于时钟源的实际使用及解释

1、STM32内部有5个时钟源&#xff0c;分别为HSI、HSE、LSE、LSI、PLL。 HSE&#xff1a;高速外部时钟&#xff0c;可接石英谐振器、陶瓷谐振器&#xff0c;或者接外部时钟源&#xff0c;其频率范围为4MHZ~16MHZ。 LSE&#xff1a; 低速外部时钟&#xff0c;接频率为32.768KHZ…

基于深度学习的高精度Caltech行人检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度Caltech数据集行人检测识别系统可用于日常生活中或野外来检测与定位行人目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv…

电源频率检测器/采用555时基电路的过流检测器电路设计

电源频率检测器 对于某些电子仪器和电气设备&#xff0c;对见六电源的频率有着一定的要求&#xff0c;电源频率高于或低于 50Hz&#xff0c;都会影响设备的正常工作&#xff0c;甚至造成仪器和设备的损坏。因此&#xff0c;对于此类设备需要装设电源频率检测装置&#xff0c;当…

软件工程师,学习下JavaScript ES6新特性吧

概述 作为一名软件工程师&#xff0c;不管你是不是前端开发的岗位&#xff0c;工作中或多或少都会用到一点JavaScript。JavaScript是大家所了解的语言名称&#xff0c;但是这个语言名称是Oracle公司注册的商标。JavaScript的正式名称是ECMAScript。1996年11月&#xff0c;JavaS…

【后端面经-Java】I/O多路复用 简录

【后端面经-Java】I/O多路复用 简录 0. Java 线程IO模型1. BIO2. NIO3. I/O多路复用&#xff08;主要&#xff09;3.1 概念3.2 实现1. select2. poll3. epoll 4. AIO5. 技术对比5.1 BIO、NIO、I/O多路复用、AIO对比5.2 select、poll、epoll对比 6. 面试模拟参考资料 0. Java 线…

我国新能源汽车存量已突破1620万辆,登记数量创历史新高

根据公安部发布的最新数据&#xff0c;截至2023年6月底&#xff0c;全国的机动车数量达到4.26亿辆&#xff0c;其中汽车数量为3.28亿辆&#xff0c;新能源汽车数量为1620万辆。与此同时&#xff0c;机动车驾驶人口达到5.13亿人&#xff0c;其中汽车驾驶人口为4.75亿人。在2023年…

从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145

目录 606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 解析代码&#xff1a; 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 解析代码&#xff1a; 107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 解析代码&…

Microsoft 宣布今年底关闭开源软件托管平台 CodePlex

Microsoft 宣布&#xff0c;将关闭开源软件托管平台 CodePlex。Microsoft 2006 年推出这项服务&#xff0c;并决定在今年 12 月 15 日将其关闭。 Microsoft 公司副总裁 Brian Harry 在网上博客中写道&#xff0c;人们将可以下载他们的数据档案&#xff0c;Microsoft 正与面向开…

CMake之CPack

文章目录 一、CPack1.用CPack打包成为deb包2.如何确定的Depends依赖包?3.如何确定编译Build-Depends&#xff1f;4.Cpakc打包RPM包 二、deb的简单使用三、deb包相关文件说明1.control文件2.preinst文件3.postinst文件4.prerm文件5.postrm文件 一、CPack CPack 是 CMake 2.4.2…

(转载)支持向量机(SVM)的回归拟合(matlab实现)

与传统的神经网络相比&#xff0c;SVM具有以下几个优点&#xff1a; (1)SVM是专门针对小样本问题而提出的&#xff0c;可以在有限样本的情况下获得最优解。 (2)SVM算法最终将转化为一个二次规划问题&#xff0c;从理论上讲可以得到全局最优解&#xff0c;从而解决了传统神经网…

linux 信号原理 信号处理设置signal, 信号发送kill,信号等待sigsuspend,信号阻塞sigprocmask,一网打尽信号使用

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 信号是一种软中断的方式&#xff0c;让进程陷入中断处理调…