从 N 个数中找出最大和第二大的数

2023-11-29

给定 n 个数字,如何使用最多 n+log(n) 次比较找到最大和第二大数字?

请注意,这不是 O(n+log(n)),而是真正的 n+log(n) 次比较。


帕杰顿发表了评论。

让我详细说明一下。

正如帕杰顿所说,这可以通过锦标赛选择来完成。

可以将其视为淘汰赛单打网球锦标赛,其中球员的能力有严格的顺序,并且比赛的结果完全由该顺序决定。

第一轮就有一半人被淘汰。在下一轮中,还有一半等(可能会有一些轮空)。

最终获胜者将在最后一轮中决出。

这可以被视为一棵树。

树的每个节点都将是该节点的子节点之间的比赛的获胜者。

叶子是玩家。第一轮的获胜者是叶子的父母等。

这是一个有 n 个节点的完全二叉树。

现在,沿着胜利者的道路前进。获胜者已经参加了 log n 场比赛。现在考虑那些 log n 场比赛的失败者。第二好的一定是其中最好的。

在 n-1 场比赛中决出胜者(每场比赛淘汰一场),而 logn 中的胜者则在 logn -1 场比赛中决出。

因此,您可以在 n+logn - 2 次比较中确定最大和第二大。

事实上,可以证明这是最优的。在最坏情况下的任何比较方案中,获胜者都必须进行logn比赛。

为了证明这一点,假设采用积分制度,在比赛结束后,获胜者获得失败者的积分。最初,所有人都以 1 分开始。

最终获胜者获得n分。

现在给定任何算法,都可以安排为拥有更多分数的玩家总是获胜者。由于在这种情况下,任何人在任何比赛中的分数最多都会翻倍,因此在最坏的情况下,您至少需要获胜者参加的 n 场比赛。

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

从 N 个数中找出最大和第二大的数 的相关文章

  • 如何在构建持续时间和 RAM 使用方面优化 gradle 构建性能?

    我目前正在为我的多模块 Web 应用程序从 ant 切换到 gradle 目前看来当前版本的 Gradle M9 可能已经达到了极限 但也许 希望 这只是我对 Gradle 概念理解不够好或者不知道 神奇的性能提升开关 的问题 我很高兴收到
  • 我应该如何获取 IEnumerable 的长度? [复制]

    这个问题在这里已经有答案了 我正在编写一些代码 然后去获取 IEnumerable 的长度 当我写的时候myEnumerable Count 令我惊讶的是 它没有编译 看完之后IEnumerable Count 和 Length 之间的区别
  • 当我使用并行代码时,为什么我的计算机没有显示加速?

    所以我意识到这个问题听起来很愚蠢 是的 我使用的是双核 但我尝试了两个不同的库 Grand Central Dispatch 和 OpenMP 并且当使用 clock 来对带有和不带有使平行的话 速度是一样的 根据记录 他们都使用自己的并行
  • 我们是否需要使用 MappedByteBuffer.force() 将数据刷新到磁盘?

    我正在使用 MappedByteBuffer 来加速文件读 写操作 我的问题如下 我不确定是否需要使用 force 方法将内容刷新到磁盘 似乎没有 force getInt 仍然可以完美工作 好吧 因为这是一个内存映射缓冲区 我假设 get
  • 在 Golang 中生成固定长度的随机十六进制字符串的有效方法?

    我需要生成很多固定长度的随机十六进制字符串 我找到这个解决方案golang中如何生成固定长度的随机字符串 https stackoverflow com a 31832326 710955 我正在做这样的事情 const letterByt
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 使用排序函数按 NSDates 对数组进行排序[重复]

    这个问题在这里已经有答案了 我有一个名为的模型类Event import Foundation import MapKit public class Event let id Int var title String let status
  • 缓存感知树的实现

    I have a tree where every node may have 0 to N children 用例是以下查询 给定指向两个节点的指针 这些节点是否位于树的同一分支内 Examples q 2 7 gt true q 5 4
  • 如何找到给定顶点的所有多边形?

    我有一个顶点列表 并且我知道它们之间的连接 我试图找到顶点的所有多边形形状 这些多边形形状不应重叠 我做了一些研究 我认为如果我可以顺时针 或逆时针 没有区别 遍历顶点 我可以检测多边形形状 因此 我寻找顺时针遍历顶点的解决方案 我发现了一
  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • 优化算术编码器

    我正在优化名为的 C 库的编码步骤PackJPG http www elektronik htw aalen de packjpg 我使用 Intel VTune 对代码进行了分析 发现当前的瓶颈是 PackJPG 使用的算术编码器中的以下
  • Python 2.x 与 3.x 速度

    我是一名博士生 使用 Python 编写我的研究代码 我的工作流程通常包括对代码进行小的更改 运行程序 查看结果是否有所改进 然后重复该过程 因此 我发现自己等待程序运行的时间比实际处理它的时间要多 我知道 这是一种常见的经历 我目前在我的
  • 通过保留和复制来复制向量,还是通过创建和交换来复制向量更有效? [复制]

    这个问题在这里已经有答案了 我正在尝试有效地复制向量 我看到两种可能的方法 std vector
  • 归并排序究竟进行了多少次比较?

    我读到 在实践中 快速排序比合并排序快得多 其原因是隐藏常量 那么 随机快速排序复杂度的解是2nlnn 1 39nlogn 这意味着快速排序中的常数是1 39 但是合并排序呢 归并排序中的常数是什么 让我们看看能否解决这个问题 在合并排序中
  • 证明字符串算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么我的 CAOpenGLLayer 更新速度比之前的 NSOpenGLView 慢?

    我有一个在 Mac OS X 上渲染 OpenGL 内容的应用程序 最初它渲染到 NSOpenGLView 然后我将其更改为渲染到 CAOpenGLLayer 子类 当我这样做时 我看到了巨大的性能损失 帧速率减半 鼠标响应能力降低 卡顿
  • 如何在 Java 中对字符串的 ArrayList 进行排序?

    I have String被放入一个ArrayList随机的 private ArrayList
  • 对 C# 中的嵌套字符串列表进行排序

    我想要实现的是按字母顺序排序的嵌套列表 例如 我的输入 fat twat gat Line 1 cat hat bat Line 2 twat lack rat Line 3 我希望输出是 bat cat hat Line 2 fat ga
  • Grails 2.0 的性能真的那么低吗?

    我对基于 JVM 堆栈的 WEB 开发有点新手 但未来的项目将特别需要一些基于 JVM 的 WEB 引擎 所以我开始寻找一些可以快速完成事情的方法 并转向尝试 Grails 从书中看 事情看起来不错 但对很长的启动时间 grails run
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go

随机推荐

  • 无法从浏览器查看在 docker 容器中运行的 Rails 应用程序

    我正在 docker 容器中运行 Rails 应用程序 执行后docker compose up我在浏览器中查看并看到ERR CONNECTION REFUSED 我尝试过端口转发docker run p 3000 3000 docker
  • 使用 React.js 实现 SlideToggle 功能

    我想用我的下拉菜单完成以下任务 1 单击时显示 2 第二次单击时隐藏它 3 单击外部任意位置时将其隐藏 4 使用幻灯片效果完成所有这些 我已经覆盖了 1 3 个 我4号就被堵住了 如何创建幻灯片效果以及下面发生的以下单击事件 我已经使用 j
  • 如何在这个 ubuntu 终端命令中仅引用一次 Main:“javac Main.java && java Main”?

    我正在审查许多不同的 java 程序 并试图找出如何仅更新对程序名称的引用一次而不是两次 有没有办法在单个终端命令中使用变量 S 我试图改进的命令是这种形式 javac Main java java Main 我只想更改对 Main 的引用
  • 异步加载 - UITableView 和 Firebase

    我正在开发一个从 Firebase 加载列表数据并填充 UITableView 的项目 虽然我看到从我的 firebase 实例调用快照 但它们不会填充表 而本地同步 NSMutableArray 显示内容 如何让 UITableView
  • 使用 Python 3.x 还是 2.x? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 几个月前我开始学习 Pyt
  • python3.x 多处理循环没有“if __name__ == '__main__':”

    我有这个文件 它没有任何有用的工作 仅用于学习 import multiprocessing sys def parent numproc 2 print at start childs print bfore Pipe parentEnd
  • @ManagedBeans 在 JavaEE6 中是否因为 CDI/Weld 中的 @Named 而过时?

    由于 CDI 及其实现 Weld JEE6 中的每个 POJO 都可以用 Named 这使得视图可以访问 POJO 这是否意味着 ManagedBeans 现在已经完全过时了 或者我错过了什么地方 ManagedBean还有道理吗 简而言之
  • 通过键连接多个 Kafka 主题

    如何编写一个以可扩展的方式加入多个 Kafka 主题的消费者 我有一个主题发布带有密钥的事件 第二个主题发布与具有相同密钥的第一个主题的子集相关的其他事件 我想编写一个订阅这两个主题并为两个主题中出现的子集执行一些附加操作的消费者 我可以使
  • Spark:将大文件写入 HDFS 时不允许自我抑制

    我正在使用 Spark 将一个大文件写入 HDFS 基本上我所做的就是加入 3 个大文件 然后使用 toJSON 将结果数据帧转换为 json 然后使用 saveAsTextFile 将其保存到 HDFS 最终写入的文件大约为 4TB 应用
  • Java 8 LocalDate 不会解析有效的日期字符串[重复]

    这个问题在这里已经有答案了 这里是 Java 8 我有以下代码 final String createdDateStr 20110920 final DateTimeFormatter formatter DateTimeFormatter
  • Mac OS X 中的应用程序更新

    要在 Windows 中提供应用程序更新 我们只需下载安装程序并运行它即可 应用程序安装在 PROGRAMFILES 中 快捷方式放置在不同的地方 键和值被添加到注册表中 以在系统的程序列表中提供一个条目 为了在Linux中提供应用程序更新
  • 使用条件逻辑从 pandas df 创建多个列表[重复]

    这个问题在这里已经有答案了 我有一个看起来像这样的 df var1 var2 var3 0 a 1 0 b 7 0 c 5 0 d 4 0 z 8 1 t 9 1 a 2 2 p 3 60 c 3 我正在尝试创建每组值的列表var2对应于给
  • Swift 4:计时器崩溃 - 无法识别的选择器发送到实例

    我试图调用 Timer 的一个实例 并在每一秒过去时打印 一秒已过去 我正在关注 Udemy 上的完整 iOs 11 和 Swift 开发人员课程 教练确实这样做了 他的代码可以工作 但我的代码却崩溃了 这是代码 var timer Tim
  • 将csv数据转换为数组格式

    我正在尝试使用jquery 形成一个wordCloud 我有一个 csv 文件需要读取并使用该数据形成一个 wordCloud 我的 csv 文件中有列 text weight Lorem 15 Ipsum 9 等等 但输入数据需要采用以下
  • Protobuf-net .proto 文件生成用于继承

    我正在对 Protobuf net 进行原型设计 以替换我们现有的一些 C 代码 该代码当前正在使用 Datacontract 将对象序列化为 Xml 使用protobuffer我们可以轻松地与Java共享数据 因此 我对 Protobuf
  • scipy.spatial.ckdtree 运行缓慢

    我一直在使用spatial cKDTree in scipy计算点之间的距离 对于我的典型数据集 查找约 1000 个点到约 1e6 点数组的距离 它总是运行得非常快 约 1 秒 我在 Ubuntu 14 10 的计算机上以 python
  • iPhone 本地化 - 某些本地化的 XIB 无法加载

    我制作了一个具有本地化版本的 iPhone 应用程序 它大部分工作正常 但有两个视图无法加载本地化 NIB 使用标准 NIB 英文 我确信我正确地进行了本地化 获取信息 使文件可本地化 添加本地化 添加 pl 波兰语 然后编辑创建的 NIB
  • 替换嵌套数组 ruby​​ 中的元素

    我无法在代码中找到问题所在 如果特定元素出现在宾果板上 我想用 X 替换它们 class BingoBoard def initialize board bingo board board end def number letter let
  • 如何在C++中默认初始化内置类型的局部变量?

    如何在 C 中默认初始化原始类型的局部变量 例如 如果 a 有一个 typedef typedef unsigned char boolean that s Microsoft RPC runtime typedef 我想更改以下行 boo
  • 从 N 个数中找出最大和第二大的数

    给定 n 个数字 如何使用最多 n log n 次比较找到最大和第二大数字 请注意 这不是 O n log n 而是真正的 n log n 次比较 帕杰顿发表了评论 让我详细说明一下 正如帕杰顿所说 这可以通过锦标赛选择来完成 可以将其视为