从长度为 N 的数组中返回前 k 个值的最佳算法

2023-11-22

我有一个包含 n 个浮点的数组,我希望返回前 k 个 (在我的例子中,n ~ 100,k ~ 10)

该问题是否有已知的最佳解决路径?

谁能提供一个C算法吗?

编辑:实际上这里有两个问题:排序和未排序。我对未排序感兴趣,这应该更快!


Method 1

由于k很小,因此可以使用锦标赛方法来找到第k大的。此方法在 Knuth 的《编程艺术》第 3 卷第 212 页中进行了描述。

首先创建一个关于 n-k+2 个元素的锦标赛。就像网球淘汰赛一样。首先,您分成两人一组并比较各对的成员(就好像这两个人打了一场比赛,其中一个输了)。然后是获胜者,你们再次分成两人一组,依此类推,直到产生获胜者。您可以将其视为一棵树,获胜者位于顶部。

这需要 n-k+1 次比较。

现在这n-k+2的获胜者不可能是你的第k大元素。考虑一下它在锦标赛中的路径 P。

现在从剩下的 k-2 个中选择一个,然后沿路径 P 前进,这将为您提供一个新的最大值。基本上,您可以重做锦标赛,将前一个获胜者替换为 k-2 元素之一。令 P 为新获胜者的路径。现在从 k-3 中选择另一个并沿着新路径向上,依此类推。

最后,在您耗尽 k-2 后,将最大的替换为 -infinity,并且锦标赛中最大的将是第 k 大。你扔掉的元素是前k-1个元素。

这最多需要n - k + (k-1) [log (n-k+2)]比较以找到前 k 个。但它使用 O(n) 内存。

就比较次数而言,这可能会击败任何选择算法。

Method 2

作为替代方案,您可以维护一个包含 k 个元素的最小堆。

首先插入k个元素。然后对于数组的每个元素,如果小于堆的最小元素,则将其丢弃。否则,删除堆的最小值并从数组中插入元素。

最后,堆将包含前 k 个元素。这将需要O(n log k)比较。

当然,如果n很小,只需对数组进行排序就足够了。代码也会更简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从长度为 N 的数组中返回前 k 个值的最佳算法 的相关文章

  • 用 C++ 生成 AST

    我正在用 C 制作一个解释器 到目前为止我已经有了词法分析器来生成标记 问题是我不确定如何生成 行走 解析树 我正在考虑使用数组数组来制作解析树 但我不确定如何以正确的顺序将标记实际插入到解析树中 我不确定是自上而下 左右还是自下而上 左右
  • 在常数空间中创建 1..N 的随机排列

    我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 如何使用 PHP 查找目录中的前 5 个文件?

    如何使用 PHP 列出按字母顺序排序的目录中的前 5 个文件或目录 Using scandir array slice array filter scandir path to dir is file 0 5 The array filte
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 如何对 Data::Dumper 的输出进行排序?

    我想转储对象和散列的值 但它总是乱序打印键 如何按 递归 排序顺序转储键 use Data Dumper print Dumper obj Set Data Dumper Sortkeys 1获取 Perl 的默认排序顺序 如果要自定义顺序
  • Collections.sort(list) 和 list.sort(Comparator) 之间的区别

    有什么理由让我应该选择Collections sort list 方法而不是简单地调用list sort 内部Collections sort只是调用sort的方法List无论如何 上课 令人惊讶的是几乎每个人都告诉我使用Collectio
  • shell脚本中关联数组的时间复杂度

    我想知道在 shell 脚本中使用关联数组时如何构造 实现 另外 我想知道基于 shell 脚本的关联数组的时间复杂度是否是最佳的 因为我们可以使用字母和数字作为它们各自的键 编辑 他们使用什么哈希函数 如果您使用关联数组 则不能通过 使用
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • 需要一种将网络块范围折叠为超集范围列表的算法

    我的数学不及格 我需要一种有效的方法将网络范围缩小为超集 例如如果我输入 IP 范围列表 1 1 1 1至2 2 2 5 1 1 1 2至2 2 2 4 10 5 5 5至155 5 5 5 10 5 5 6至10 5 5 7 我想返回以下
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • jQuery 表格排序

    我有一个非常简单的 HTML 表格 有 4 列 Facility Name Phone City Specialty 我希望用户能够排序设备名称 and City only 我如何使用 jQuery 进行编码 我发现了这个 我想我应该投入
  • 照片马赛克算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?

    Hy 我要做的是创建一个程序 使用 C 或 C 它将 24 位 像素位图和图像集合作为输入 我必须创建一个马赛克图像 类似于使用库的输入图像给定的图像 创建与输入类似的马赛克照片 到目前为止 我可以访问输入的图像像素及其颜色 但我有点卡住了
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • 如何计算排列? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个关于 Java 排列的问题 Suppose I have five different elements in an arra
  • 首先对列表中最长的项目进行排序

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选

随机推荐

  • 我可以使用 Laravel 5 中间件来允许包覆盖应用程序路由吗?

    我希望能够使用包中的路由覆盖 app Http routes php 中定义的路由 例如 在 app Http routes php 中我可能有这个 Route get search type as gt search uses gt Se
  • 如何在没有科学记数法的 R 数据框中显示数字列('e+07')

    我有一个 R 数据框 其中一列包含一串数字 但我想将它们视为一个因素 主要是为了阻止 R 使用 e 04 等缩短数字 我发现解决此问题的一种方法是编辑从中获取数据的 csv 文件 并添加一个在所需列中包含单词的虚拟条目 然后重新导入它 如何
  • 如何将 facebook、twitter 和 google plus 集成到 Android 应用程序中

    我喜欢将 Facebook Twitter 和 Google plus 集成到我的应用程序中 以便使用该应用程序的用户可以更新他们的状态 因此我想知道如何做到这一点 Thanks 我强烈建议不要使用这些 SDK 因为它们包含很多错误 而且据
  • 如何获取默认 NIC 连接名称

    重要编辑 再次回到这个话题 正如您所说不应该有默认的网卡 我试图了解是否有一种方法可以检测实际连接的所有网卡 有了我的物理接口的 MAC 地址 是否有一种编程方式来获取接口名称 接口状态 等 比如我的XP机器 设备 Realtek RTL8
  • 自动递增 bigint 列?

    我想要插入表中的每一行数据都有一个 bigint ID 列 我想要 Sql 服务器生成数字 我尝试创建一个具有 bigint 列 ID 的表 我希望这是自动增量 第一个值为 1 我尝试使用 ID bigint AUTO INCREMENT
  • 将数据从 Props 传递到 vue.js 中的数据

    我有以下 vue 组件
  • 在 Rust 中使用枚举实现动态多态性

    当人们已经知道某些需要动态多态性的代码中涉及的所有有限数量的类型时 使用enum与使用相比 可以更好地提高性能Box因为后者使用动态内存分配 并且您需要使用也具有虚拟函数调用的特征对象 也就是说 与 C 中使用的等效代码相比std vari
  • 如何配置 IIS,以便在连接到 SQL Server 时使用用户的域凭据?

    我们最近发布了最新版本的 Intranet 应用程序 该应用程序现在使用 Windows 身份验证作为标准 并且需要能够使用最终用户的域凭据连接到已配置的 SQL 服务器 最近我们发现 在一些客户部署中 尽管 IIS 可以看到用户的域凭据
  • 是否可以在 .NET 4 中动态创建路由?

    在我们的应用程序中 我们使用新的 NET 4 路由系统将某些请求路由到站点的其他部分 我们只允许在深夜发布我们的网站代码 这意味着我们必须加班到很晚才能发布任何代码更改 我们经常需要创建自定义路由来支持旧内容的旧链接并将其路由到新内容 这些
  • Adobe Media Encoder 是否可以使用 ExtendScript 编写脚本?

    Adobe Media Encoder AME 是否可以编写脚本 我听人们提到它是 官方可编写脚本的 但我找不到任何对其可编写脚本的对象集的引用 有人有编写 AME 脚本的经验吗 Adobe 媒体编码器 正式 不可编写脚本 但我们可以使用扩
  • Windows 窗体:如何更改禁用标签的字体颜色

    我正在尝试为标签控件设置禁用的字体特征 我可以设置所有字体特征 大小 粗体等 但颜色被默认的窗口行为覆盖 这似乎是这两种颜色之一 如果背景颜色是透明的 则前景色与文本框禁用颜色相同 如果背景颜色设置为其他颜色 则前景色为深灰色 下图演示了该
  • SQLAlchemy:将查询结果插入到另一个表中

    所以我得到了一些结果install表 像这样 install metadata tables install results session query install
  • Activiti / Camunda 用变量改变边界计时器

    我有一个关于 Activiti Camunda 中用户任务的计时器边界事件的特殊问题 启动流程时 我使用流程变量设置计时器持续时间 并使用边界定义中的表达式来解析该变量 边界事件是在用户任务上定义的
  • Javascript - .innerHTML 更改自动关闭标签

    我正在尝试使用 Javascript 动态地将元素放入其他元素中 而无需刷新页面 它的 AJAX 部分可以工作并且功能正常 然而 由于某种未知的原因 我的代码自动关闭 这是代码片段 您可以看到它实际上并未关闭 但是在浏览器中运行代码后它被关
  • 使用 iOS 的 ExtAudioFileWrite 将音频样本缓冲区写入 aac 文件

    更新 我已经弄清楚了这一点并发布了我的解决方案作为我自己的问题的答案 如下 我正在尝试使用 AAC 格式的 ExtAudioFileWrite 将简单的音频样本缓冲区写入文件 我已经通过下面的代码实现了这一点 将单声道缓冲区写入 wav 文
  • 如何向 HTTP 客户端传递客户端证书?

    我想在服务 A 和 B 之间使用相互 SSL 身份验证 我目前正在使用 Java 实现从服务 A 传递客户端证书 我正在使用 Apache DefaultHttpClient 来执行我的请求 我能够从内部凭证管理器检索服务 A 的客户端证书
  • 我可以使用 CGAffineTransform Rotation 将视图旋转超过 360 度吗?

    我正在编写一个 iPhone 应用程序 并且我有一张图像 我想将其向外旋转 目前我的代码如下所示 包装在 beginAnimations commitAnimations 块中 scale CGAffineTransformScale CG
  • 经典 ASP - ADO 执行传递参数的存储过程

    我需要使用经典 ASP 将参数传递到存储过程中 我确实看到有些人使用 Command 对象 而其他人则不使用它 我的存储过程参数是这样的 RECORD NUMBER decimal 18 0 ErrorType nvarchar 100 I
  • 如何让 Cobertura 因代码覆盖率低而导致 M2 构建失败

    如果行或分支覆盖率低于给定阈值 我正在尝试将 WAR 项目构建配置为失败 我一直在使用这本优秀书籍第455页提供的配置Java电动工具 但没有成功 这是我的项目 Maven 2 POM 的相关片段
  • 从长度为 N 的数组中返回前 k 个值的最佳算法

    我有一个包含 n 个浮点的数组 我希望返回前 k 个 在我的例子中 n 100 k 10 该问题是否有已知的最佳解决路径 谁能提供一个C算法吗 编辑 实际上这里有两个问题 排序和未排序 我对未排序感兴趣 这应该更快 Method 1 由于k