算法 - 如何在 O(K) 中查找 Kt'h 元素并构建 O(n)

2023-12-14

我需要在 O(k) 中找到包含无序 n 元素的数组输入的 K 元素,满足以下要求:

1)构建可以是O(n)(您可以使用给定的数组构建您想要的任何数据结构)

2)找到O(k)中的第k个元素


该算法在假设数组中没有重复元素的情况下工作。

预处理

找到中间元素,并以该元素为基础对数组进行旋转。然后继续对数组的较小一半应用此过程,直到只剩下一个元素。

对于某个 m,在每个步骤中调用数组的较大一半 A(m)、A(m-1)、....、A(0)。 A(0) 的大小始终为 1,并且每个连续数组的大小要么是前一个数组大小的两倍,要么加一。即,len(A(0)) = 1、len(A(n)) = len(A(n-1)) 或 len(A(n-1))+1。请注意,2^n

查找长度为 n 的数组的中值需要 O(n) 时间(使用众所周知的线性时间中值查找算法),并且旋转也需要 O(n) 时间。您正在递归地应用此方法(在较小的一侧),总共需要 n + n/2 + n/4 + ... = O(n) 时间。

查找第 k 个元素

将 S(n) 定义为 A(0)、A(1)、...、A(n-1) 的长度之和。 (S(0)= 0)。

找到 n 使得 S(n) k。您可以在 O(log k) 时间内完成此操作。

然后,找到A(n)中的k-S(n)个最大元素。这可以使用快速选择算法(的确定性变体)在 O(len(A(n))) 时间内完成。由于 len(A(n)) 是 Theta(k),因此在 O(log k) + O(k) = O(k) 时间内找到该元素。

理解注意事项

首先考虑 n 是 2 减 1 的幂的情况会更容易。然后子数组 A(i) 的大小加倍。例如,当 n 为 16,并且输入是按某种顺序排列的数字 0 到 15 时,子数组可能如下所示:

A(0) = [0]
A(1) = [2, 1]
A(2) = [6, 3, 4, 5]
A(3) = [15, 8, 11, 10, 7, 12, 13, 9, 14]

要找到第 7 大元素,我们发现它必须位于 A(2) 中,并且 A(0) 和 A(1) 中组合了 3 个元素,因此我们需要找到 A(2) 中的 7-3 = 4 大元素)。我们使用快速选择来做到这一点。

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

算法 - 如何在 O(K) 中查找 Kt'h 元素并构建 O(n) 的相关文章

  • 快速查找具有最大总不同元素的列表列表的子集

    给定元组列表的列表 我想找到列表的子集 该子集最大化不同整数值的数量 而不重复任何整数 该列表看起来像这样 x 1 2 3 8 9 10 15 16 2 3 10 11 9 10 11 17 18 19 20 21 22 4 5 11 12
  • Python求矩阵动态规划中最大的平方

    我有一个矩阵如下 Python matrix o o o oo o o o ooo o o oo o o oo 其中 o 是一个障碍 我需要找到这个矩阵中最大的正方形 并替换相应的 带有 x 如下所示 xxxo o o xxxoo xxxo
  • 绘图:仅保留最相关的数据

    为了节省带宽并且不用自己生成图片 图表 我计划使用 Google 的图表 API http code google com apis chart http code google com apis chart 它的工作原理是简单地发出一个
  • 在 Perl 中确定范围重叠的最快方法

    我有两组范围 每个范围都是一对整数 开始和结束 表示单个较大范围的某些子范围 两组范围的结构与此类似 当然 将替换为实际数字 a ranges a 1 gt start gt end gt a 2 gt start gt end gt a
  • Haskell:先进先出队列算法的复杂性

    这是我对 FIFO 队列的尝试 type Queue a a gt a empty Queue a empty id remove Int gt Queue a gt a Queue a remove n queue take n queu
  • 给定一个数字 0-9 的数组和一个整数 n,找到可由输入数组组成且小于 n 的所有整数

    问题是这样的 给你一个数字 0 9 的数组和一个整数n 该数组可能包含任何给定数字的重复项 找到所有可以通过连接输入数组中的数字形成的整数并且小于n 输入数组中的数字可以在输出的元素中重复 例如 输入为 2 5 8 且 n 223 则输出应
  • 数独生成器算法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我制作了一个生成数独的算法 但效率非常低 每个谜题都需要几分钟才能生成 所以现在我正在尝试以最佳方式重新编写它 但我遇到了一些问题 需
  • 为什么在我的遗传算法中添加交叉会给我带来更糟糕的结果?

    我已经实现了遗传算法来解决旅行商问题 TSP 当我仅使用突变时 我找到了比添加交叉更好的解决方案 我知道普通的交叉方法不适用于 TSP 所以我实现了有序交叉 http www permutationcity co uk projects m
  • 在数组中出现超过 n/3 次的数字

    我读过这个问题查找数组中最常见的条目 https stackoverflow com questions 278488 puzzle find the most common entry in an array 乔恩 斯基特的回答真是令人兴
  • 使用对象列表构建树

    我有一个带有属性 id 和parent id 的对象列表 我想建造一棵树来连接那些孩子和父母 1 个父对象可以有多个子对象 并且有一个对象将成为所有对象的祖先 实现该功能最快的算法是什么 我使用 C 作为编程语言 但其他语言也可以 像这样的
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • 在skiena的书中给出的关于应用dfs在图中查找循环的代码中存在错误

    这是dfs的代码 bool processed MAXV 1 which vertices have been processed bool discovered MAXV 1 which vertices have been found
  • 在 Celery 中,我如何运行一个任务,然后让该任务运行另一个任务,并保持下去?

    tasks py from celery task import Task class Randomer Task def run self kwargs run Randomer again return random randrange
  • 快速算法可以快速找到一组范围中某个数字所属的范围?

    场景 我有几个数字范围 这些范围不重叠 由于它们不重叠 逻辑结果是任何时候任何数字都不能属于多个范围 每个范围都是连续的 单个范围内没有空洞 因此范围 8 到 16 将真正包含 8 到 16 之间的所有数字 但两个范围之间可能存在空洞 例如
  • 单源最短路径,包含每条边的距离和权重

    假设有一个无向图 连接任意两个节点的每条边都有两个权重 即距离和成本 我想要获得最短路径 但也要确保不超出一定的成本 我尝试过实现 Djikstra 如果超出成本 则简单地回溯 由于缺乏更好的术语 直到遍历整个图表 但是 我正在寻找比这更快
  • 创建简单和弦进行的算法

    我正在制作一个程序 根据 C 大调音阶的随机基本和弦进行生成随机简单的旋律 从这个音阶生成 4 个三和弦的和弦进行的好方法是什么 从音阶中生成 4 个完全随机的三元组 从 7 个现有的三元组中 通常听起来不太好 我需要一种方法来生成听起来不
  • 在逻辑回归中使用排名数据

    当我努力学习这些概念时 我将对此给予最大赏金 我正在尝试在逻辑回归中使用一些排名数据 我想使用机器学习来制作一个简单的分类器来判断网页是否 好 这只是一个学习练习 所以我不期望有很好的结果 只是希望学习 过程 和编码技术 我已将数据放入 c
  • 面试问题 - 在排序数组 X 中搜索索引 i,使得 X[i] = i

    昨天面试时 我被问到了以下问题 考虑一个 Java 或 C 数组X它已排序并且其中没有两个元素是相同的 如何最好地找到索引i这样该索引处的元素也是i 那是X i i 作为澄清 她还给了我一个例子 Array X 3 1 0 3 5 7 in
  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • 在最小堆中查找 k 个最小元素 - 最坏情况复杂度

    我有一个最小堆n元素并想要找到k该堆中的最小数字 最坏情况的复杂性是多少 这是我的方法 在 stackoverflow 上的某个地方 我读到在最小堆中查找第 i 个最小数字的复杂性是O i 所以如果我们想找到n 1最小的数字 n 毫无意义

随机推荐

  • Laravel 复选框过滤器 ajax

    我需要实现一个基于ajax的空缺复选框过滤器 因此 我在页面上有一些类别 当用户标记某些复选框时 结果块仅显示所选类别中的空缺 如果没有选中复选框 页面将显示所有类别中的所有职位空缺 现在我有了当前的变体 但它不适用于复选框值数组 并且每次
  • 如何静态断言函数末尾无法到达

    我有一个相当复杂的match语句 带有嵌套ifs 等 位于函数末尾 每个分支都应该显式地从函数返回 或者调用一些 gt 函数 例如process exit 为了与其他程序员进行通信 并保护自己免受自己的伤害 我想告诉编译器断言此后的任何内容
  • Cassandra - 重叠数据范围

    我在 Cassandra 中有以下 任务 表 Task ID UUID 分区键 Starts On TIMESTAMP 聚类列 Ends On TIMESTAMP 聚类列 我想运行 CQL 查询来获取给定日期范围内的重叠任务 例如 如果我传
  • 在 Powershell 中,如何将消息框带到前台,并将焦点更改为消息框中的按钮

    在我的脚本中 当我打开消息框时 消息框始终在后台打开 位于运行的所有其他应用程序和窗口之后 我正在尝试做两件事 如果它们应该是两个问题 我很抱歉 但我认为密切相关 1 我希望消息框在需要呈现时显示在所有应用程序的前面 2 我想要将焦点更改为
  • 特征名称后面的特征是什么意思?

    我在阅读 Rust 时遇到了这个特征定义 trait Enchanter std fmt Debug 由此我了解到该特征的名称是Enchanter 但我不明白什么std Format Debug部分暗示 因为它也是一种特质 我认为 这是宣告
  • Jsoup div[class=] 语法有效,而 div.class 语法无效 - 为什么?

    对于以下 HTML 片段 div class class one class two class three classfour classfive classsix some inner content div 以下 Jsoup 选择器w
  • 为什么10000000*1000在java中给出141006540​​8? [复制]

    这个问题在这里已经有答案了 class a public static void main String arg int a 10000000 int b 1000 int c a b System out println c 输出是 14
  • windows:获取监视器的数量,包括禁用的监视器

    EnumDisplayMonitors列出当前激活的所有监视器 但是 它似乎不会返回禁用的 即未选中 将我的桌面扩展到此显示器 的那些 我如何获得包括残疾人在内的计数 好的 首先您必须创建一个设备上下文 http msdn microsof
  • Windows 任务计划程序的问题

    我在使用 Windows 任务管理器时遇到两个问题 一 我有一个 Python 脚本 可以在运行结束时通过 gmail 发送电子邮件通知 当我运行脚本本身时 这工作正常 但是当我通过 Windows 任务计划程序运行脚本时 脚本运行良好 但
  • Struts 2 jQuery 网格从 JSON 字符串加载数据

    我发现我们可以加载jqGird与 JSON 字符串 请参阅将 JSON 数据映射到 jqGrid 是否可以使用此功能sjg grid tag 我查看标签属性 只发现可以从 URL 加载数据 该 URL 将调用 Struts 操作 并且该操作
  • 在 Android 中以编程方式切换到开发者模式

    我想创建一个工具 允许在 Android 版本低于 4 2 的 Android 设备上切换到开发人员模式 我想创建一个 apk 来激活和停用开发者模式 这可能吗 如何 开发人员 模式是一种系统设置 因此只能从系统应用程序进行修改 即使用制造
  • 为什么当我转换为“long”时会调用“operator bool()”?

    我有以下课程 class MyClass public MyClass char what controlled what MyClass delete controlled operator char const return contr
  • 如何在渲染时为 React 组件设置动画?

    我正在尝试为包含从其他地方获取的数据的 React 组件设置动画 将其放置在ReactCSSTransitionGroup工作得很好 也就是说 直到我改变了组件的render 返回方法false直到数据被获取 到防止在没有数据的情况下渲染它
  • 如何从 C# 显示文件的“属性”对话框?

    如何打开文件的特性通过按钮进行对话框 private void button Click object sender EventArgs e string path C Users test Documents tes text how t
  • Java 9、10、11、12...等中的 javax.smartcardio

    从 Java 9 开始 javax smartcardio 库发生了什么 有替代方法或某种方式在 JAR 中获取它吗 在网上搜索了几个小时后 感谢上面的答案 据我了解 Java 9 及更高版本是模块化的 这是几年前计划的语言改进 此外 在新
  • 将两个导航控制器添加到一个选项卡栏项目

    我希望将 2 个导航控制器附加到一个选项卡栏项目 基本上 这个想法是在单个选项卡项上有 2 个视图 并且应该有一个导航栏来推动和弹出屏幕 与 iPad 中的设置应用程序相同 已编辑 看起来左侧有一个带有自己的导航控制器的视图 而右侧有另一个
  • 如何在 Swift 中增加 plus 设备上的字体和大小?

    我观察了一些流行的应用程序 当我们比较 iPhone Plus 设备和普通设备时 字体和图像是不同的 iPhone Plus 设备中稍大一些 我们如何在 iOS 应用程序中实现同样的目标 我已经使用过闪屏了 但字体仍然是相同的 在 plus
  • 为IE6中新打开的窗口设置OnLoad事件

    我需要为新弹出的窗口设置 onload 属性 以下代码适用于 Firefox a href www google com 但是 当我在 IE 中尝试此操作时 出现错误 printwindow document body null 或未定义
  • 从屏幕坐标查找世界坐标

    这个问题有很多答案 但我不确定它们都适用于 XTK 例如在 Three JS 中看到了多个答案 但显然 XTK 和 Three JS 没有相同的 API 使用射线和Matrix似乎与其他框架的许多其他解决方案非常相似 但我仍然没有掌握可能的
  • 算法 - 如何在 O(K) 中查找 Kt'h 元素并构建 O(n)

    我需要在 O k 中找到包含无序 n 元素的数组输入的 K 元素 满足以下要求 1 构建可以是O n 您可以使用给定的数组构建您想要的任何数据结构 2 找到O k 中的第k个元素 该算法在假设数组中没有重复元素的情况下工作 预处理 找到中间