列表中的前 n 项(包括重复项)

2023-12-10

尝试找到一种有效的方法来获取一个非常大的列表中的前 N ​​个项目,可能包含重复项。

我首先尝试了排序和切片,这很有效。但这似乎没有必要。如果您只想要前 20 名成员,则不需要对非常大的列表进行排序。 所以我写了一个递归例程来构建 top-n 列表。这也有效,但比非递归慢得多!

问题:我的第二个例程(精英2)比精英慢得多,我该如何让它更快?我的代码附在下面。谢谢。

import scala.collection.SeqView
import scala.math.min
object X {

    def  elite(s: SeqView[Int, List[Int]], k:Int):List[Int] = {
        s.sorted.reverse.force.slice(0,min(k,s.size))
    }

    def elite2(s: SeqView[Int, List[Int]], k:Int, s2:List[Int]=Nil):List[Int] = {
        if( k == 0 || s.size == 0) s2.reverse
        else {
            val m = s.max
            val parts = s.force.partition(_==m)
            val whole = if( parts._1.size > 1) parts._1.tail:::parts._2 else parts._2
            elite2( whole.view, k-1, m::s2 )
        }
    }

    def main(args:Array[String]) = {
        val N = 1000000/3
        val x = List(N to 1 by -1).flatten.map(x=>List(x,x,x)).flatten.view
        println(elite2(x,20))
        println(elite(x,20))
    }
}

经典算法称为 QuickSelect。它就像快速排序,只不过你只下降到树的一半,所以它最终的平均时间为 O(n)。

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

列表中的前 n 项(包括重复项) 的相关文章

随机推荐

  • Graphhopper 返回“未找到”

    我正在测试 graphhopper 有几天了 但是有一个奇怪的问题 当位置对于下一个街道 graphhopper 来说太远时 返回错误 未找到 奇怪的是它可以在 graphhopper demo server 上运行 我尝试了阿尔卑斯山 欧
  • PHP读取受保护的文件

    我在子域 a 上有一个 xml 文件 在子域 b 上有一个 php 脚本 我想通过 PHP 读取并使用 XML 文件中的数据 这就是问题所在 该文件使用 HTTP 身份验证进行保护 如何让PHP登录并读取文件内容 The 网址包装器支持表单
  • 配置 ruamel.yaml 以允许重复键

    我正在尝试使用ruamel yaml用于处理包含重复键的 Yaml 文档的库 在这种情况下 重复的键恰好是合并键 lt lt 这是 yaml 文件 dupe yml foo ref1 a 1 bar ref2 b 2 baz lt lt r
  • 未捕获的引用错误:jQuery 未定义[重复]

    这个问题在这里已经有答案了 我在我的网站上实现了一些 JavaScript 但我不断收到以下错误消息 未捕获的 ReferenceError jQuery 未定义 and 未捕获的语法错误 意外的标记 这是我在 header php 中使用
  • 在 Linux 上的 Eclipse RCP 应用程序中加载本机库

    我有一个 Eclipse RCP 应用程序 它通过 JNI 使用一些本机库 这些是动态链接到彼此的共享库 在 Windows 上我把这些库 如 dll文件 旁边的 RCP 启动器可执行文件 exe 文件并通过加载它们System load
  • 如何使用打字稿在第三方类上定义方法?

    我正在尝试扩展第 3 方课程 但无法让打字稿发挥良好作用 基本上 我不能在新方法中使用类中已定义的任何现有方法 解决方法是重新定义现有方法extensions ts 见下文 但必须有更好的方法 第三方index d ts export as
  • 为什么转置日期格式为 dd/mm/yy 的数组会将某些日期更改为 mm/dd/yy 格式?

    行为 当我转置包含日期的一维数组以便将它们完整地打印到一张纸上时 某些日期会从dd mm yy to mm dd yyyy 特别是当该月的某一天 小于或等于12 例如January 2 2016 02 01 16 or May 11 201
  • 如何在服务器无法访问存储库的情况下从 git 存储库进行部署?

    我在 BitBucket git 存储库中有一个 PHP 项目 我在一个名为 开发 的分支中工作以进行小修复 或者在临时功能分支中工作 当我准备好部署时 我将这些分支合并到 master 中 我想让部署到我的实时站点变得如此简单 合并到 m
  • 为什么 javac“-source”标志不起作用?

    我正在测试javac source标志 我对它应该如何工作有点困惑 请参阅此代码作为示例 这是一个不兼容Java5代码的方法isEmpty 在该版本的 JDK 中没有为 String 定义 public class TestJavac pu
  • 在 beforeunload 事件处理程序中停止页面卸载

    在用户导航页面之前 代码会检查他是否编辑了某些表单字段 如果他这样做了 我会显示一个模式窗口Yes and No纽扣 如果他单击 否 模式应关闭并且用户仍保留在该窗口上 如果是 保存更改并卸载 window bind beforeunloa
  • 在我的 Mac 上的 gdb 7.6 上运行 make 时出错

    我在运行 make for gdb 时遇到以下错误 这是在我的 Mac 上运行配置后的结果 该 Mac 运行 OS X 10 8 5 和 i7 内部处理器 海湾合作委员会版本是 gcc v Configured with prefix Ap
  • 如何在MySQL 5 .7中实现CTE功能?

    我有一个 USERSEARCH 表 应该用于快速搜索用户的子字符串 此功能用于在有人输入用户名或姓名时进行自动完成搜索 但是 我感兴趣的查询只会显示搜索者关注的用户子集的匹配项 这可以在 USERRELATIONSHIP 表中找到 USER
  • Spring @Autowired(required = true) 为 null [重复]

    这个问题在这里已经有答案了 我有一个带有 JSF 2 结束 Spring 4 3 的网络模块 在我使用的支持豆中 Autowired用于 JAR 服务的 DI 在 EAR 模块中有 WAR JAR 和 ServiceSpring 和带有 S
  • 使用的目的是什么? [复制]

    这个问题在这里已经有答案了 DUPE C 中 using 的用法 我看到人们使用以下内容 我想知道它的目的是什么 是不是对象在被垃圾回收使用后就被销毁了 例子 using Something mySomething new Somethin
  • Laravel 4 嵌套资源控制器 Route::resource('admin/photo', 'PhotoController');不工作

    在 Laravel 4 中 我尝试设置嵌套资源控制器 in 路线 php Route resource admin photo Controllers Admin PhotoController in 应用程序 控制器 管理 PhotoCo
  • 访问 iframe 功能

    这个问题似乎只发生在chrome中 这是 iframe 代码 p lalalalallalala p 这就是我创建 iframe 的方式
  • Google Appengine 上的 Google Guice:使用工作 _ah 进行映射

    我有一个 Google Appengine Guice Wicket 应用程序 我的问题是 由于映射 我无法再访问 ah admin 页面 我的 Servlet 模块说 serve with WicketServlet class getW
  • Flutter 蓝牙外部条码扫描器

    我需要使用通过蓝牙连接到我的设备的外部条形码扫描仪 它被识别为键盘 它运行良好 我可以获取文本字段内条形码的内容 问题是我需要将焦点设置到 TextField 才能获取条形码的内容 有没有办法让当前屏幕监听键盘事件 这样我就可以获取数据而无
  • 如何缩放整个div?

    我现在正在玩一个函数这一页 如果您单击 who 部分 div 就会旋转 我希望它能够缩放并使用页面 这可能吗 如何才能做到这一点 旋转后 将其宽度和高度设置为页面的宽度和高度 who rotate angle 90 bind click f
  • 列表中的前 n 项(包括重复项)

    尝试找到一种有效的方法来获取一个非常大的列表中的前 N 个项目 可能包含重复项 我首先尝试了排序和切片 这很有效 但这似乎没有必要 如果您只想要前 20 名成员 则不需要对非常大的列表进行排序 所以我写了一个递归例程来构建 top n 列表