使用二分搜索改进插入排序的最坏情况运行时间

2023-12-08

while 循环使用线性搜索向后扫描。但是,我们知道 while 循环中的数组已经排序。所以我们可以用二分查找代替线性查找,这样O(n)就变成了O(lg n)。然而,我对此的看法是,它不会有助于减少总时间,因为我们仍然需要将元素向前移动一个索引,这总是需要 (向后步数 (n)) 次。因此,总体而言,运行时间保持为 O(n^2),并且在这种情况下无法实现 O(n lg n)。请告诉我我是否以错误的方式处理这个问题。

INSERTION-SORT(A)

 for j = 2 to length[A]
  do key = A[j]
     i = j - 1

  while i > 0 and A[i] > key
    A[i+1] = A[i]
    i = i - 1

  A[i+1] = key

插入排序会推送数组的元素,以便为行中的下一个元素释放空间。
因此,如果您使用二分搜索找到了输入新元素的位置,您仍然需要将该索引之后的所有元素向前推进一步(向右)。
所以给定一个向后排序的数组:10,9,8,7,6,5,4,3,2,1
您需要将 i-1 推到右侧才能插入第 i 个元素(即使您使用二分搜索) - 最坏情况时间:O(n^2)
如果您可以将元素一个接一个地插入到列表中,则不必推送元素,但您必须“付费”以搜索列表中的正确位置(因此在此实现中,W.C.T 是 O (n^2))。

这个问题的解决方案是使用列表和数组之间的某种协同作用,这样您就可以在 O(1) 时间内到达第 i 个元素(如数组中一样),并且可以将新元素推送到给定位置(例如在索引 j) 在 O(1) 时间内(如列表) - 如果你成功了,我相信你将赢得永恒的荣耀!

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

使用二分搜索改进插入排序的最坏情况运行时间 的相关文章

  • 固定大小集以包含给定集的最大数量

    我有大约 1000 组尺寸 1 4 1 3 3 5 6 4 5 6 7 5 25 42 67 100 是否有可能找到包含最大数量的给定集合的大小为 20 的集合 检查每一个100 80 20 集 效率低下 我不太确定这是 NP 完全的 考虑
  • 我需要一个支持高效随机访问和 O(k) 插入和删除的容器

    我再次尝试问同样的问题question https stackoverflow com questions 3808708 delete parts of a dynamic array and grow other 但我最终提出了一个不同
  • 解释一下从 N 个给定集合中的每一个中给出第 K 个最大数字的示例?

    今天我尝试解决一个Facebook 编程挑战赛 https facebook interviewstreet com recruit challenges 我遇到的挑战是 酒吧问题 可以找到here https github com alo
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 数组中连续元素的最大乘积

    我在现场面试的时候被问到了这个算法问题 由于没有要求我签署保密协议 我将其发布在这里寻求答案 给定一个数组REAL不包含 0 的数字 找到产生最大乘积的连续元素 该算法应在线性时间内运行 我考虑过以下方法 使用两个数组 第一个是利用DP思想
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 用 C++ 生成 AST

    我正在用 C 制作一个解释器 到目前为止我已经有了词法分析器来生成标记 问题是我不确定如何生成 行走 解析树 我正在考虑使用数组数组来制作解析树 但我不确定如何以正确的顺序将标记实际插入到解析树中 我不确定是自上而下 左右还是自下而上 左右
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 从一种数字系统转换为另一种数字系统后会有多少位数字

    主要问题 有多少位数字 让我解释 我有一个二进制数 11000000 十进制数是192 转换为十进制后 它有多少位 以十进制表示 在我的示例中 它是 3 位数字 但是 这不是问题 我在互联网上搜索并找到了一种用于整数部分的算法和一种用于小数
  • 两组点之间的最佳匹配

    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 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • n 或 nlog(n) 比常数时间或对数时间更好吗?

    在 Coursera 上的普林斯顿教程中 讲师解释了遇到的常见增长顺序函数 他说 线性和线性算术运行时间是 我们努力的目标 他的推理是 随着输入大小的增加 运行时间也会增加 我认为这是他犯了错误的地方 因为我之前听过他提到线性增长顺序对于高
  • 照片马赛克算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?

    Hy 我要做的是创建一个程序 使用 C 或 C 它将 24 位 像素位图和图像集合作为输入 我必须创建一个马赛克图像 类似于使用库的输入图像给定的图像 创建与输入类似的马赛克照片 到目前为止 我可以访问输入的图像像素及其颜色 但我有点卡住了
  • 动态规划 (DP) 中的重叠子问题是什么?

    为了使动态规划适用 问题必须具有两个关键属性 最优子结构 and 重叠子问题 1 https en wikipedia org wiki Dynamic programming 对于这个问题 我们只关注后一个属性 有各种不同的定义重叠子问题
  • 如何计算排列? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个关于 Java 排列的问题 Suppose I have five different elements in an arra
  • 我正在尝试寻找“调酒师算法”

    我正在解决旧编程竞赛中的一些示例问题 在这个问题中 我们输入了我们有多少调酒师以及他们知道哪种配方 每杯鸡尾酒的制作时间为 1 分钟 我们需要计算是否可以在 5 分钟内使用所有调酒师完成订单 解决这个问题的关键是尽可能高效地分配鸡尾酒 这就
  • 生产代码中的 LRU 实现

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

随机推荐

  • 无法安装 Grails MongoDB 插件

    我正在使用 GRails 2 4 3 每当我尝试安装 Grails MongoDB 插件时http grails org plugin mongodb我收到此错误 Configuring classpath Downloading org
  • 计算一个数字在数组中出现的次数

    我正在开发一个小程序 用于计算整数在数组中出现的次数 我设法做到了这一点 但有一件事我无法克服 我的代码是 include
  • 客户端分页[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 目前可用于客户端分页的最佳库是什么 jQuery 表排序器是一个不错的选择 因为在显示数据时您通常需要一个可排序的表格 并且它还内置分页 因此您可以
  • 使用 JPA 2.1 Criteria API 之间的 LocalDate

    在我的实体中 我有两个字段 private LocalDate startDate LocalDate of 1900 1 1 private LocalDate endDate LocalDate of 3000 1 1 使用 JPA C
  • 动态手势的隐马尔可夫模型训练?

    我知道有很多与隐马尔可夫模型相关的材料 我也阅读了与该主题相关的所有问题和答案 我了解它的工作原理以及如何训练它 但是我无法解决在尝试训练它进行简单的动态手势时遇到的以下问题 我在用OpenCV 的 HMM 实现我已经研究过之前提出的问题和
  • 如何打开不在同一文件夹中的文本文件?

    由于 C 它不是我用来编程的语言 所以我不知道如何做到这一点 我有一个项目文件夹 其中包含所有 c 和 h 文件 以及一个 conf 文件夹 其中有一个 config txt 文件可供读取 我怎样才能打开它 FILE fp fopen co
  • mongo DB集合、文档和数据库的大小限制

    过去几个月我一直在学习和工作 MongoDB 现在我对每个文档 16 MB 的最大大小限制感到非常困惑 我只是想知道 16 MB 大小限制是否适用于集合内的单个文档 或者此限制也适用于单个集合 由于我有一个包含酒店架构的集合 因此我将在其中
  • 实现我自己的打印预览?

    我开发了自己的报表控件 它只不过是在控件窗口的客户端 DC 的 CDC 上绘制文本 我也有打印功能 报告输出直接发送到打印机 不过 我想让用户在实际打印报告之前知道输出 我无法使用 MFC 的打印预览架构来执行此操作 因为我的项目未使用文档
  • Jquery 历史记录/后退按钮插件的当前状态?

    大约一年前我花了很长时间研究这个问题 我试过 Jquery 烧烤插件 Jquery 历史记录插件 jquery address 插件 我发现 jquery address 插件是最好的 但这些事情变化很快 最近有没有人彻底研究过这个选项 在
  • hibernate缓存(例如EHCache)是否可以与jpa特定代码一起使用(如果我使用EntityManager/EM Factory而不是Session/SessionFactory)?

    我有一个非常简单的查询 我想确保我没有任何困惑 我在规范中看到缓存不是规范的一部分 而是根据特定的orm工具提供商提供的 我在我的应用程序中使用 Hibernate 作为 ORM 工具 但为了独立于供应商 我使用 JPA javax per
  • 如何根据“<选项>”更改链接表单操作?

    该表格是搜索表格 当我点击
  • 在 ASP.NET 中实现 404 的最佳方法

    我正在尝试确定在标准 ASP NET Web 应用程序中实现 404 页面的最佳方法 我目前在 Global asax 文件中的 Application Error 事件中捕获 404 错误 并重定向到友好的 404 aspx 页面 问题是
  • 创建表,但如果表已存在则删除它

    我正在处理一个请求 我必须创建一个表来插入一些数据 所以 显然我首先要有一个删除表 在创建 st 之前但是当我第一次运行它时 在创建表之前 它会弹出一个错误 指出表未创建 然后创建表并从这里开始 因此 每次任何人第一次运行我的代码时 都会在
  • 使用 VB.net 的 Excel 文本转列

    我有一个 Excel 工作表 A 列中的条目数量可变 样本 402110000027547 97517161579 IDLE 402 11 150 402110000013260 97517117011 IDLE 402 11 190 40
  • 在 Java 中如何追加到文本文件而不是覆盖它?

    我正在尝试使用 Java 在文本文件中添加一行 当我运行程序时 我的意思是添加一行简单的行 但我的程序在写入新数据之前会删除文本文件中的所有旧数据 这是代码 FileWriter fw null PrintWriter pw null tr
  • php邮件总是进入垃圾邮件

    如何优化 php mail 而不将电子邮件发送到垃圾邮件 我的网页所做的一切都会将电子邮件发送到垃圾邮件 如何使其不发送到垃圾邮件 这取决于您拥有的垃圾邮件引擎 您无法为此优化 PHP 函数 只需尝试使用正确的标头创建电子邮件并从真实的电子
  • Orion API 通过 Keycloak 进行身份验证

    我想通过 Keycloak IdM 在 Orion API 上添加身份验证 我知道可以将 Orion 与 Pep Proxy Wilma 和 Keyrock 一起使用来完成此任务 并且可能的解决方法是将 keyrock 与 keycloak
  • 优化 Visual Studio 解决方案构建 - 在哪里放置 DLL 文件?

    我发现 如果您没有在任何地方启用 复制本地 则许多项目的 C 解决方案的构建时间会变得更快 我做了一些测试 似乎 至少对于我们的解决方案 我们只需删除 复制本地 就可以将构建时间增加 2 3 倍 这可能意味着我们必须将库存储在某个公共目录中
  • Laravel 中的 Composer 更新错误“无法将需求解析为一组可安装的软件包”[重复]

    这个问题在这里已经有答案了 我刚刚更新我的作曲家 它返回一些错误和问题 Your requirements could not be resolved to an installable set of packages Problem 1
  • 使用二分搜索改进插入排序的最坏情况运行时间

    while 循环使用线性搜索向后扫描 但是 我们知道 while 循环中的数组已经排序 所以我们可以用二分查找代替线性查找 这样O n 就变成了O lg n 然而 我对此的看法是 它不会有助于减少总时间 因为我们仍然需要将元素向前移动一个索