数据结构和算法 之 两种方式实现TOP K

RedisBloom 插件布隆过滤器,布谷鸟过滤器,Count-Min Sketch,TOPK使用详解 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 RedisBloom 是一款由 RedisLabs 提供的 redis 插件,提供了布隆过滤器、布谷鸟过滤器、Count-Min Sketch、TopK功能实现。通过 BitMap 这样的数据结果,以牺牲部分精度换取极高的内存效率和读写效率,适用于海量数据场景。该博客以下将对 RedisBloom 各个功能以及命令做详解。首先,先简单介绍这些功能的作用:布隆过滤器和布谷鸟过滤器主要用于判断海量元素是否存在的情况,通常可用于 阅读详情

​    目录

                          1、背景介绍

                          2、Redis实现

                          3、PriorityQueue实现


一、背景介绍

什么是 Top K 问题?简单来说就是在一堆数据里面找到前 K 大(也可以是前 K 小)的数。这个问题也是十分经典的算法问题,不论是面试中还是实际开发中,都非常具有代表性。

既然是要查询前 K 大的数,那么最容易想到的方法就是进行排序了,通过如快排(O(nlogn))等效率较高的排序算法对给定的序列进行排序,然后取k个最大数或者最小数。这种方式固然实现简单,但是我们只需要k(k<n)个数,排序却要对全部n个数进行操作,固然会增加时间复杂度,所以这里必然存在着优化的空间。

二、Redis实现

通过Redis提供的Sorted Sets可以非常容易地实现TOP K问题,Redis是通过Skip List(跳跃表)数据结构实现的,熟悉Skip List(跳跃表)的同学应该会知道Skip List(跳跃表)添加、修改元素的时间复杂度为O(log(N)),是一种高效的数据结构,当我们要求排序的时候,Redis根本不需要做任何工作了,早已经全部排好序了。Java中ConcurrentSkipListSet、ConcurrentSkipListMap均是由Skip List(跳跃表)实现的。

三、PriorityQueue实现

PriorityQueue也叫优先队列,是一种二叉树数据结构。其特点是不管左右相邻结点之间的关系,但是总是保证上面的结点元素大于下层结点(大顶堆)或者上面的结点元素小于下层结点(小顶堆)。

PriorityQueue类在Java1.5中引入。是一种基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。

其在Java中的类结构如下:

对于TOP K问题,可以使用最小堆进行实现,实现思路如下:

建立一个容量为k的小堆顶,并从数组中逐个取数,如果堆的容量小于k,则向堆中添加元素;如果堆的容量等于k,则比较取出的数和堆顶元素。堆顶元素始终是堆中k个元素中的最小值,如果取出的数比堆顶元素大,则删除堆顶元素而把该数加入堆中。直至数组中所有元素都访问一遍,当遍历完一次数组后,堆中的k个数即为数组中最大的k个数。

Java代码实现如下:

/**
 * @author: wenyixicodedog
 * @create: 2020-07-25
 * @description:
 */
public class TOPK {
​
    public static int[] findTOPK(int[] a, int k) {
​
        PriorityQueue<Integer> queue = new PriorityQueue<>(k);
​
        Arrays.stream(a).forEach((item) -> {
            if (queue.size() < k) {
                queue.offer(item);
            } else if (queue.peek() < item) {
                queue.poll();
                queue.offer(item);
            }
        });
​
        int[] result = new int[k];
        for (int i = 0; !queue.isEmpty(); i++) {
            result[i] = queue.poll();
        }
        return result;
    }
​
    public static void main(String[] args) {
        int[] a = new int[]{11, 61, 21, 33, 54, 4, 82, 77, 98};
        System.out.println(Arrays.toString(findTOPK(a, 3)));
    }
​
}

PriorityQueue凭借其本身独特的优势,在很多场景中都发挥着作用,例如处理海量数据中的TOP K 、海量数据中找出出现频率最高的数、堆排序等。

PriorityQueue源码实现中是一种没有加锁的实现方式,所以是非线程安全的,如果要使用线程安全的优先队列,可以使用PriorityBlockingQueue。

 

更多内容持续更新中,感兴趣的朋友请移步至个人公众号,谢谢支持😜😜......

公众号:wenyixicodedog

top k算法讲解 在实际工作中,我们时常会有寻找长度为n的数组中,排在前k的元素,对于top k的问题,最暴力的处理方式就是直接对数组进行排序,然后再去截取前多少个数字,从而达到自己的目的,这种算法的实现复杂度为O(nlogn),其实有O(n)的算法或者是O(nlogk)时间复杂度的算法。 基于快排的top k算法如果我们了解快速排序算法的话,知道其原理是每次寻找一个数值,将数组中所有小于这个数的值放在其左侧,所有大 阅读详情

相关推荐

【数据结构】堆的应用——TOP-K问题详解

在上节课中我们已经学习了二叉树的顺序存储结构,并且对于实际使用中所常用的顺序存储结构——堆的各个接口功能进行了理解与实现,而这节课我们将要对堆的实际应用进行更加深入的研究,而堆最重要的实际应用,就是用于处理 TOP-K 问题。

weixin_59392935的博客 1301

Redis入门到实战-第十八弹

Redis是一个开源的(采用BSD许可证),用作数据库、缓存、消息代理和流处理引擎的内存数据结构存储。

笑三年-Dylen 432

【数据结构】堆排序和Top-K问题(超详细)

堆排序和TopK

qq_74897518的博客 1579

redis8.0新特性:Top-K获取最高排名的数据

Top-K 是一种概率数据结构,允许您查找数据流中最常见的项目。Top K 是 Redis 开源版中的一种概率数据结构,用于估计数据流中排名最高的 K 个元素。在此语境中,“排名最高”是指“附加有最高数字或分数的元素”,其中分数可以是该元素在流中出现的次数计数,因此该数据结构非常适合查找流中出现频率最高的元素。一个非常常见的应用是检测网络异常和 DDoS 攻击,Top K 可以回答以下问题:来自同一地址或同一 IP 的请求流量是否突然增加?

秃了也弱了 1191

手把手拆解DGX GB200 NVL72:1个机柜如何塞进72块GPU?详解NVLink Switch铜缆背板设计

本文深度解析英伟达DGX GB200 NVL72系统如何通过NVLink Switch铜缆背板设计,在标准42U机柜中集成72块B200 GPU,实现1800GB/s的超高带宽。文章详细介绍了模块化架构、铜缆互连技术、液冷散热方案和高密度供电系统等核心创新,为AI算力需求提供突破性解决方案。

red88的博客 1592

【图像大模型】RIFE实战:如何通过中间流估计实现4K视频的实时插帧优化

本文深入解析了基于深度学习的RIFE视频插帧算法,重点探讨其核心的中间流估计技术如何实现高效精准的帧生成。通过实战教程,详细介绍了针对4K视频的实时处理优化方案,包括环境配置、参数调优及性能瓶颈分析,帮助用户利用消费级显卡将低帧率视频转化为流畅的高帧率体验。

weixin_29093017的博客 459

Topk问题和秒杀问题

(1)从1000个数据中找到k个最大数据首先看到这个题时,可能会想到先将这1000个数据进行降序排序,即取出的前k个元素最大。时间复杂度为O(N^2),使得程序效率低。思路: 可先创建一个数组topK[k],将1000中的前k个数据放入数组topK中,将topK中的数据建小堆,则可保证堆的第一个元素是最小的,将第k个元素与堆中第一个元素比较,若大于,则交换。对堆进行重新建小堆,取第k+1个元素与堆中第一个元素比较,以此类推,直至1000-k个元素比较完。则此时堆中的元素就是k个最大数据。时间复杂度为 k*l

weixin_57321519的博客 402

告别Vivado自带编辑器!手把手教你用Sublime Text 4 + Icarus Verilog搭建FPGA开发环境(Windows 10/11)

本文详细介绍如何在Windows 10/11系统下,使用Sublime Text 4和Icarus Verilog搭建高效的FPGA开发环境,替代Vivado自带编辑器。通过配置语法检查、代码高亮和智能补全等功能,提升Verilog开发效率,实现专业级工作流。

weixin_30684743的博客 428

redis实时计算TopK的想法

想到这样的一个场景,你发了一个朋友圈,按照评论人评论的字数排序输出,字数越多表示越想想和你唠嗑。 场景1,一个人只能发一个评论的情况 使用redis的zset,假设需要排名前50个人,也就是Top50 思路 topk = 50 wordNum = len(user_id's comment) ZADD id wordNum user_id count = ZCARD id if (count > topk) { ZREMRANGEBYRANK 0, (topk - count) } ZRANGEBY

李习的博客 1527

STM32F103VET6实战:用W25Q64外部Flash实现Bootloader+Application双备份(含完整代码解析)

本文详细介绍了基于STM32F103VET6微控制器和W25Q64外部Flash实现Bootloader+Application双备份固件升级的完整方案。通过精心设计的Flash分区策略、可靠的Bootloader程序以及包含双重校验和自动回滚机制的升级流程,有效解决了远程升级过程中断电导致设备变砖的风险,确保了工业嵌入式系统的高可靠性与稳定性。

linux的博客 823

微信小程序 - 最新详细实现气泡菜单功能,点击任意元素在底部或附近周围弹出气泡菜单列表,仿微信气泡弹框显示菜单快捷功能收纳,自定义气泡弹窗/菜单气泡弹窗,小程序气泡框嵌套菜单组件插件,自动计算弹出定位

微信小程序,vue2,vue3,气泡列表,汽泡菜单,气泡框,泡泡框,悬浮框,悬浮菜单,点击菜单按钮弹出气泡,对话箭头气泡框,弹出的气泡准确定位并吸附在附近,弹出式气泡,弹窗菜单,气泡自定义HTML弹窗,带三角的气泡弹框,三角气泡框里面嵌套菜单,当点击一个按钮或元素时,会从附近弹出一个小气泡一样的菜单列表,自定义气泡框内的内容,点击一个元素在附近弹出一个气泡弹框功能效果,气泡弹框不准怎么办,被盖住了,挡住了,长按弹出,组件插件,微信,自定义气泡菜单组件,气泡弹出框,小程序自定义气泡框,菜单气泡,包裹列表的三角

🏆 前端领域优质创作者 3922

【数据结构初阶】堆排序和TOP-K问题

堆排序是八大经典排序之一,是非常好用的算法,而我们的Top-K是我们堆排序的应用,对于我们理解和学习堆的结构有更好的帮助。

m0_70088010的博客 390

第18章:Ingestion Pipeline 数据摄取流水线

本文介绍了LlamaIndex的IngestionPipeline如何解决合同文档处理中的四大核心问题:不可重复、无追溯、无容错和无法缓存。通过标准化数据处理流程,将手工操作升级为工厂流水线模式,实现数据的可复用、可追踪和高效处理。文章详细阐述了Pipeline的设计原理,包括Transformation的串行编排、缓存机制(基于输入和Transformation的哈希值)以及数据血缘追踪(通过Node的metadata记录处理过程)。

davidwang456的专栏 63

数据结构与算法:堆排序和TOP-K问题

交换根节点和最后一个节点之后,新的根节点可能破坏了大堆的性质,因此需要进行调整。

Quietcoder的博客 1215

国科大学习资料--图像处理(彭思龙、杨戈)--2020年期末考试题解析(学长整理分析)

在对20年卷子分析前,先看看19年卷子的解析(后面有20年的变化,由于从核心课调整到了普及课,20年的卷子相对简单,但是还是有很多细节) 解析:(字写的不好别嫌弃!!!!) 20年的卷子 第一题:和19年基本一致,但是加了高斯核计算费用,要算一个节省计算成本比率,所以去多看看PPT 第二题:和19年基本一致,加了证明两个高斯卷积仍然是高斯卷积,相当于19年题2和3结合 第三题:采样定理,和19年基本一致,但要注意加了证明 第四题:考了形态学提取图像边界 第五题:直方图,和19年一

无名何许人的博客 4364

LVGL iPhone Duo 开合过渡

环境:LVGL 9.x(需要软件模糊),窗口建议 1280×800。界面文案英文(默认 Montserrat 无 CJK)。

摸鱼专家 152

【数据结构】建堆算法复杂度分析及TOP-K问题

哈喽,各位小伙伴大家好!上期我们讲了堆排序和建堆算法。今天我们就来分析一下他们的时间复杂度。话不多说,咱们进入正题。向大厂冲锋!

大白的编程日记. 2256

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

《数据结构初阶》【堆 + 堆排序 + TOP-K】

博客内容主要划分为:数据结构的介绍+数据结构的实现+数据结构的应用。主要涉及的数据结构:堆(内容绝对详实!!!)

序属秋秋秋的博客 2105

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【数据结构】堆的实现,堆排序以及TOP-K问题

向堆中插入一个元素,我们可以将这个元素插入到堆的尾部,因为堆的实际存储结构是一个数组,我们可以将元素放到数组末尾,但如果仅仅是插入到数组末尾的话,会将堆的结构给破环,我们还需要调用一个向上调整的函数,来调整各个节点间的大小关系。弹出元素就是将堆顶的元素给删除,但我们不能直接进行删除,这样会将堆的结构给破坏,正确的方法是先将堆顶的元素和最后的元素进行交换,这样保证的首元素的左子树和右子树依然是堆的形态,然后将size自减,最后调用一个堆的向下调整函数。这里写的是小根堆,大根堆可以在小根堆的基础上稍作修改。

m0_73648729的博客 2549

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【数据结构】堆的实现及TOP-K问题

在正式讲堆之前,我们要先来讲一下二叉树的顺序结构:普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

weixin_73914025的博客 1090

【数据结构】用堆解决Top-K问题

目录 背景 处理策略 堆源码(C) 背景 生活中我们每每都会遇到Top-K问题,例如搜索附近前几的的奶茶店,频率前几的搜索字符串等等 如果只是数据比较少的,我们可以排序找到前几的数据 但是实际应用中我们时常都会面对海量的数据,大到内存无法全部加载,这就需要我们用数据结构中的堆来解决 处理策略 首先我们知道: 对于大堆,堆顶的数据一定是堆里面数据中最大的;对于小堆,堆顶的数据一定是堆里面数据中最小的 对于找最大前k: 利用小根堆维护一个大小为K的数组,目前该小根堆中的元...

~ 1532

【数据结构与算法】堆排序(向下和向上调整)、TOP-K问题(超详细解读)

C数据结构的堆排序,包含了向上调整以及向下调整的知识点,还有Top-K问题。

weixin_65186652的博客 1624

【数据结构与算法】之堆的应用——堆排序及Top_K问题!

向下调整建小堆,再将堆顶元素与堆的最后一个元素交换,那么数组中最小的那个元素就到最后面去了,最后一个数有序后,那我们就不再把它看作堆的元素了,最后再在堆顶进行向下调整保证小堆不变。对一个无序的数组,因为数组中的元素是连续的,那我们就可以将数组中的元素进行。2、再将后N-K个数据分别和堆顶数据比较,比堆顶数据大就将堆顶数据覆盖。4、将后N-K个数据比较完后,小堆里面的数据就是最大的前K个。假设我们要对一个数组中的元素进行降序,那我们就要先将其进行。1、我们先将全部数据的前K个建成小堆。我们下期不见不散~~

2301_80221228的博客 2019

DS:堆的应用——两种算法和TOP-K问题

本篇博客主要是讲解堆实现的过程中涉及到的两种算法——向上调整算法和向下调整算法,以及一个很重要 的应用场景——TOP-K!

白乐天_ξ( ✿>◡❛)的博客 1203

【数据结构】堆的实现和堆排序--TOP-K问题

在头文件中进行堆的定义和接口的声明int size;}HP;//堆的初始化//堆的销毁//堆的插入//堆的删除//取堆顶的数据// 堆的数据个数//堆的判空堆的实现堆是一种特殊的树形数据结构,通常实现为完全二叉树。堆分为最大堆和最小堆,最大堆的父节点值大于或等于其子节点值,而最小堆的父节点值小于或等于其子节点值。堆通常使用数组来实现,通过索引关系模拟树形结构,支持高效的插入、删除和查找最大/最小元素操作。堆排序堆排序是一种基于堆的排序算法。

2301_78724721的博客 1687

7. 【数据结构】堆排序的实现以及TOP-K的问题

【数据结构】堆排序的实现以及TOP-K的问题

分享C/C++/Linux/网络/数据库/数据结构 1383
上一篇: MySQL SQL insert update crash-safe 原理
下一篇: 数据结构和算法 之 LinkedHashMap实现LRU算法
wenyixicodedog
博客等级 码龄8年 87粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值