如何根据打分结果快速进行 Top K 检索?

简介: 如何高效实现Top K检索?文档打分后,无需全排序,利用堆排序可将时间复杂度从O(n log n)降至O(n + k log n),仅需返回用户关注的前K条结果,大幅提升性能,适用于千万级数据的搜索引擎场景。

在给所有的文档打完分以后,接下来,我们就要完成排序的工作了。一般来说,我们可以使用任意一种高效的排序算法来完成排序,比如说,我们可以使用快速排序,它排序的时间代价是 O(n log n)。但是,我们还要考虑到,搜索引擎检索出来结果的数量级可能是千万级别的。在这种情况下,即便是 O(n log n) 的时间代价,也会是一个非常巨大的时间损耗。

那对于这个问题,我们该怎么优化呢?

其实,你可以回想一下,我们在使用搜索引擎的时候,一般都不会翻超过 100 页(如果有兴趣,你可以试着翻翻,看 100 页以后搜索引擎会显示什么),而且,平均一页只显示 10 条数据。也就是说,搜索引擎其实只需要显示前 1000 条数据就够了。因此,在实际系统中,我们不需要返回所有结果,只需要返回 Top K 个结果就可以。这就是许多大规模检索系统应用的的 Top K 检索 了。而且,我们前面的打分过程都是非常精准的,所以我们今天学习的也叫作 精准 Top K 检索。

当然还有非精准的 Top K 检索,这里先卖个关子,我会在下一讲详细来讲。

那再回到优化排序上,由于只需要选取 Top K 个结果,因此我们可以使用堆排序来代替全排序。这样我们就能把排序的时间代价降低到 O(n) + O(k log n)(即建堆时间 + 在堆中选择最大的 k 个值的时间),而不是原来的 O(n log n)。举个例子,如果 k 是 1000,n 是 1000 万,那排序性能就提高了近 6 倍!这是一个非常有效的性能提升。

相关文章
|
数据库连接 数据库
kettle开发篇-流查询
kettle开发篇-流查询
688 0
|
人工智能 监控 供应链
AI技术创业有哪些机会?
本文探讨了AI技术创业的多个机会,包括提供行业解决方案、开发智能产品和服务以及教育和培训,为创业者在医疗保健、金融服务、零售、教育等多个领域提供了丰富的机遇。
912 2
|
Dubbo Java 应用服务中间件
项目中引进这玩意,排查日志又快又准
随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候,因为业务链路贯穿着很多微服务节点,导致定位某个请求的日志以及上下游业务的日志会变得有些困难。
|
5月前
|
监控 安全 数据安全/隐私保护
泄密事件高发频发,DLP/EDR/VDI等传统安全手段失效了吗?
近期台积电、华为等企业频发员工手机偷拍泄密事件,暴露传统DLP、EDR等安全体系在应对屏幕拍照泄露时的盲区。尽管部署多重防护,仍难阻“人”的主动泄密。新型“电-光-电”跨媒介隐形水印技术应运而生,通过无感嵌入、精准溯源,有效震慑内部泄密行为。该技术可与DLP、EDR协同,补齐“最后一公里”防护短板,构建事前预防、事中控制、事后溯源的纵深防御体系。安全无银弹,唯有传统手段与创新科技联动,方能筑牢数据防线。
205 26
|
8月前
|
缓存 自然语言处理 JavaScript
Github 3k+ star,中后台管理系统框架,支持多款 UI 组件库,兼容PC、移动端!比商业系统还专业!!
Fantastic-admin/basic 是基于 Vue3 与 TypeScript 的中后台管理系统框架,支持多款 UI 组件库,如 Element Plus、Arco Design、Naive-UI 等。它提供完整的项目结构、权限控制、国际化、多级缓存标签页等功能,兼容 PC、平板及移动端,适合快速搭建企业级后台应用。框架具备高度可定制性,拥有 3k+ GitHub Star,生态完善,适合中小团队和个人开发者提升效率。
462 2
|
存储 人工智能 弹性计算
AI计算加速渗透、基础设施全面升级…云栖大会重磅发布全览
阿里云全面展示了全新升级后的AI Infra系列产品及能力。通过全栈优化,阿里云打造出一套稳定和高效的AI基础设施,连续训练有效时长大于99%,模型算力利用率提升20%以上。
1005 28
|
算法 调度
贪心算法基本概念与应用场景
尽管贪心算法在许多问题中都非常有效,但它并不总是会产生最优解。因此,在应用贪心算法前,重要的是先分析问题是否适合采用贪心策略。一些问题可能需要通过动态规划或回溯等其他算法来解决,以找到确切的全局最优解。
616 1
|
JavaScript 数据库
Vue数据操作:如何在对象拷贝中正确选择深拷贝或浅拷贝?
Vue数据操作:如何在对象拷贝中正确选择深拷贝或浅拷贝?
316 0
|
机器学习/深度学习 算法框架/工具 Python
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
750 0
|
SQL 存储 Oracle
PostgreSQL 分页, offset, 返回顺序, 扫描方法原理(seqscan, index scan, index only scan, bitmap scan, parallel xx scan),游标
PostgreSQL 分页, offset, 返回顺序, 扫描方法原理(seqscan, index scan, index only scan, bitmap scan, parallel xx scan),游标
4135 0