堆的补充--Top-K问题

我们今天来学习二叉树的链式存储,但是在我们学习之前我们先来看一下我们昨天学习的顺序存储:二叉树;

我们之前说堆有两种方法:

1.向下调整建堆:

我们找到最后一个非叶子结点,把他作为起始下标;然后进行向下调整,完成后一i--;这样不断重复,直到i变成0,我们的堆就建完了;

我们来看这图片,我们的下标为2的结点是叶子节点,所以我们就要从1(叶子节点)开始,往前遍历,直到i变成0;

向下调整建堆的时间复杂度是O(n);

//在这里说明一下:向下调整方法的时间复杂度是O(log(n));//对于一个具有n个结点的堆来说,堆的高度就是我们的时间复杂度:log2^(n+1);这就可以化成log(n);所以这就是我们的向下调整的时间复杂度;

                           :向下调整建堆的时间复杂度是O(n);     

因为向下调整是除了叶子节点之外,所有的结点都要进行向下调整的;所以是n*log(n),直接化简成n了;

2.向上调整建堆:

从第一个结点我们进行排列,进行相声调整建堆;最后成堆;

我们今天来说一个新的东西:

TOP-K问题

TOP-K问题:即求数据结合中前K个最⼤的元素或者最⼩的元素,⼀般情况下数据量都⽐较⼤。 ⽐如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 对于Top-K问题,能想到的最简单直接的⽅式就是排序,但是:如果数据量⾮常⼤,排序就不太可取了 (可能数据都不能⼀下⼦全部加载到内存中)。最佳的⽅式就是⽤堆来解决;

因为这样排序的话,数据是非常多的,排序是不可取的,这里的话,我们就可以使用堆排序来解决;

我们要存储10亿个整数;需要4G的内存空间;但是我们现在只有1G,或者是跟小的空间;那么我们怎么才可以完成在10亿空间里面找数据呢?

我们可以把10亿的数据的四分之一拿出来存起来,然后对其进行建堆:

1.(我们把他的最后一个非叶子节点作为我们的第一个下标,进行循环直到我们的下标变成负数,我们的根节点也是要进行向下调整的)建堆完成以后;

2.我们遍历剩下来的数据,我们把每个数据进行遍历,看他是不是大于或者小于我们的堆顶,然后我们就根据我们是要这些个数据里面最大的那些数据,还是最小的数据;

如果想要大的部分的数据的话,我们就建小堆,我们的堆顶就是最小的数据,然后我们进行遍历,如果数据是大于我们的堆顶,我们就把他换进来,因为这时候除了我们的堆顶,我们的其他的堆都是正常的堆的数据结构,所以的话,这时候就满足我们的向下调整法,所以我们这时候就使用一个也向下调整;

这样不断地进行遍历,直到我们的数据遍历完,我们就结束了;然后这时候的堆,就是我们要求的,这时候的堆就是我们要的这些个数据里面最大的或者最小的那部分数据;

当我们想要一大片数据里面的最大的部分的时候,我们采用堆排序,我们创建小堆。

当我们想要一大片数据里面的最小的部分的时候,我们采用堆排序,我们创建大堆。

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

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

相关文章

放大器版图绘制全流程

版图的构成主要分为四部分。对于一般的电路来说,重点关注前三部分第一部分是电路中所对应的mos管电容电阻这些基本器件,一般都是由工艺产商提供标准的元件版图,这部分是我们不需要太关心的。第二部分是对器件进行连线第三部分是衬底的连接&am…

我谈概率论与数理统计的知识体系

学习概率统计二十多年后,在廖老师的指导下,厘清了各章之间的关系。本来就是一条线两个分支,脉络很清晰。 分支一:从随机现象到样本空间到随机事件再到概率。 从随机事件到随机变量:为了进行定量的数学处理&#xff0…

群晖Cloud Sync如何实现一键同步备份让数据更安全高效

文章目录 前言1. 群晖NAS安装Cloud Sync1.1 安装和配置 Cloud Sync 2. 功能演示3. 群晖安装cpolar内网穿透3.1 配置Cloud Sync公网访问地址 4. 配置固定公网地址 前言 在数字化时代,数据的管理和备份成为了我们日常生活中的一个关键任务。无论是个人还是企业&#…

探索Linux中的进程控制:从启动到退出的背后原理

个人主页:chian-ocean 文章专栏-Linux 前言: 进程控制是操作系统对进程的创建、运行、调度、中止等活动进行管理和协调的行为。它是操作系统中至关重要的一部分,保证多任务处理环境下的资源分配和系统稳定性。 进程创建 fork( ) fork() 调…

密码无关认证:金融机构如何解决密码问题

密码安全问题,依然是金融行业面临的重大挑战。尽管密码简单易用,但许多金融机构仍然依赖这种方式进行身份认证。幸运的是,随着技术的发展,密码无关认证已经成为一种更加安全、便捷的选择,它能够为数字银行带来更好的用…

HarmonyOS基于ArkTS卡片服务

卡片服务 前言 Form Kit(卡片开发框架)提供了一种在桌面、锁屏等系统入口嵌入显示应用信息的开发框架和API,可以将应用内用户关注的重要信息或常用操作抽取到服务卡片(以下简称“卡片”)上,通过将卡片添加…

Django 多环境配置实战指南

在现代 Web 开发中,一个项目通常需要在多个环境中运行,例如开发环境、测试环境和生产环境。每个环境的配置可能不同,比如数据库连接、调试模式、密钥等。为了确保项目在不同环境中的灵活性和安全性,我们需要合理地管理多环境配置。 本文将详细介绍如何在 Django 项目中实现…

运算放大器应用电路设计笔记(六)

6.1输出失调电压发生的原因与计算 6.1.1用噪声增益进行评价 若运算放大器两个输入端接地,则理想运放输出为零,但实际的运放输出不为零,有一定的直流输出电压。这种直流电压称为输出失调电压。发生的原因是,运算放大器内部元件尤…

【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项

文章目录 S10L45 Working with Multiple Windows1 水平分割窗口2 在水平分割的新窗口中显示其它文件内容3 垂直分割窗口4 窗口的关闭5 在同一窗口水平拆分出多个窗口6 关闭其余窗口7 让四个文件呈田字形排列8 光标在多窗口中的定位9 调节子窗口的尺寸大小10 变换子窗口的位置11…

【算法】经典博弈论问题——巴什博弈 python

目录 前言巴什博弈(Bash Game)小试牛刀PN分析实战检验总结 前言 博弈类问题大致分为: 公平组合游戏、非公平组合游戏(绝大多数的棋类游戏)和 反常游戏 巴什博弈(Bash Game) 一共有n颗石子,两个人轮流拿,每次可以拿1~m颗…

电脑如何访问手机文件?

手机和电脑已经深深融入了我们的日常生活,无时无刻不在为我们提供服务。除了电脑远程操控电脑外,我们还可以在电脑上轻松地访问Android或iPhone手机上的文件。那么,如何使用电脑远程访问手机上的文件呢? 如何使用电脑访问手机文件…

【设计模式-行为型】状态模式

一、什么是状态模式 什么是状态模式呢,这里我举一个例子来说明,在自动挡汽车中,挡位的切换是根据驾驶条件(如车速、油门踏板位置、刹车状态等)自动完成的。这种自动切换挡位的过程可以很好地用状态模式来描述。状态模式…

CTF随题思路—简单的base编码

打开是一大段base64编码,多次解码后再用base92解码

顺序表和链表(详解)

线性表 线性表( linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。…

C# 解析 HTML 实战指南

在网页开发和数据处理的场景中,经常需要从 HTML 文档里提取有用的信息。C# 作为一门强大的编程语言,提供了丰富的工具和库来实现 HTML 的解析。这篇博客就带你深入了解如何使用 C# 高效地解析 HTML。 一、为什么要在 C# 中解析 HTML 在实际项目中&…

Spring 是如何解决循环依赖问题

Spring 框架通过 三级缓存 机制来解决循环依赖问题。循环依赖是指两个或多个 Bean 相互依赖,形成一个闭环,例如 Bean A 依赖 Bean B,而 Bean B 又依赖 Bean A。Spring 通过提前暴露未完全初始化的 Bean 来解决这个问题。 以下是 Spring 解决…

vxe-table和element表尾合计行

1、vxe-table vxe-table的表尾合计&#xff0c;需要show-footer和footer-method搭配使用。 <vxe-table:data"tableData"ref"vxeRef"border resizable :footer-method"footerMethod":show-footer"true" >…

监控与调试:性能优化的利器 — ShardingSphere

在分布式数据库系统中&#xff0c;监控和调试是确保系统高效运行的关键。ShardingSphere 提供了多种监控和调试工具&#xff0c;帮助开发者实时跟踪和优化性能&#xff0c;识别瓶颈&#xff0c;进行故障排查&#xff0c;从而提升系统的稳定性和响应速度。本文将介绍如何使用 Sh…

上位机知识篇---ROS2命令行命令静态链接库动态链接库

文章目录 前言第一部分&#xff1a;ROS2命令行命令1. 基础命令&#xff08;1&#xff09;ros2 run&#xff08;2&#xff09;ros2 launch&#xff08;3&#xff09;ros2 node&#xff08;4&#xff09;ros2 topic&#xff08;5&#xff09;ros2 service&#xff08;6&#xff0…

Browser-Use WebUI项目启动指南

摘要 此前发布《Browser - Use WebUI 使用体验》博文后&#xff0c;鉴于部分朋友运行时出现问题&#xff0c;重新运行并整理相关内容。本文详细记录 Web UI 项目启动全过程&#xff0c;涵盖 Python 3.11、Chrome 浏览器及 API Keys 等环境要求&#xff0c;Python 环境检查、依赖…