合并排序初学者问题

2024-02-17

我现在有一个关于归并排序算法的问题。因为在原始算法中,将要排序的列表分为两个子列表并递归排序。 现在我想将长度为 n 的列表分为 3 个长度为 n/3 的子列表,然后对这三个子列表进行递归排序,然后合并,怎么样? 我只是简单地修改了原始算法,将所有地方的 2 替换为 3,想知道这是否有意义。

让它更通用怎么样?我们可以将列表分成K个子列表,然后对它们进行排序并组合吗?

感谢您与我分享您的想法。


如果您有 n (n > 2) 个列表,则不需要在每个合并步骤上执行 (n-1) 次比较。然而,实现变得更加复杂。

假设你有三个列表,list[0..2],并假设为简单起见,您正在合并它们,并且它们仍然非空(即您还没有运行到任何列表的末尾)。为了简单起见,进一步假设所有元素都是不同的,即当您比较两个元素时它们永远不会相同。然后,您有六种可能的“状态”,它们对应于三个列表的六种排列,按列表中第一个元素的递增顺序排列,即,如果

list[0] = [5, 7, 11, 15]
list[1] = [3, 4, 20, 21]
list[2] = [9, 10, 12, 19]

那么列表对应的排列是[1,0,2],即list[1]具有最少的前部元素并且list[2]具有最大的前部元件。

当您现在弹出下一个元素 (4) 时list[1]你已经知道了list[0].front < list[2].front基于您所在的状态 [1, 0, 2]。所以现在您需要执行 1 或 2 次比较:

if (list[1].front < list[0].front) // (A)
   --> move to state [1, 0, 2], next to pop is list[1]
else if (list[1].front < list[2].front)
   --> move to state[0, 1, 2], next to pop is list[0]
else
   --> move state[0, 2, 1], next to pop is list[0]

假设某种均匀性,比较 (A) 返回 true 的概率为 1/3,即删除前一个元素的列表中的下一个元素小于其他两个列表中的最小元素,因此平均而言,您有 (1/3 x 1 + 2/3 x 2) = 5/3 次比较,而不是 2 次(这将是 n-1)。

这显然更糟糕,每次插入需要 2/3 次比较,而普通合并排序只需要每个弹出元素进行 1 次比较。

通过考虑部分有序状态,我们可以获得更好的结果。可以进行三种不同的比较(list[0] -- list[1]、list[1] -- list[2] 和 list[0] -- list[2])。如果我们允许用“不知道”(?)来增强已知结果(),则有以下可能的状态:

0/1  1/2  0/2
  <    <    <   (total order) [0,1,2]
  <    ?    <   (0 is least but don't know if 1 < 2) [0,1,2] [0,2,1]
  <    ?    ?   (0 is < 1, but 2 can't be positioned) [2,0,1] [0,2,1] [0,1,2]
  ?    ?    ?   (no information about ordering) (all six permutations)

然后是关于排列和在矩阵中不同位置交换 的所有变体。

现在,如果处于 (

现在在 (

为了完整起见,这里是算法(显示片段):

state_1_lt_2: /* known list[1].front < list[2].front */
  if (list[0].front < list[1].front):
    merge_from(0)
    goto state_1_lt_2 /* 1 insert 1 comp prob 1/3 */
  else
    merge_from(1)
    if (list[0].front < list[1].front)
      if (list[1].front < list[2].front)
        merge_from(0)
        goto state_1_lt_2 /* 2 inserts 3 comps prob 2/3*1/2*1/3 = 1/9 */
      else if (list[0].front < list[2].front)
        merge_from(0)
        goto state_2_lt_1 /* 2 inserts 4 comps prob 2/3*1/2*2/3*1/2 = 1/9 */
      else
        merge_from(2)
        goto state_0_lt_1 /* 2 inserts 4 comps prob 1/9 */
    else if (list[2].front < list[1].front)
      merge_from(2)
      goto state_1_lt_0 /* 2 inserts 3 comps 2/3 x 1/2 x 1/3 = 1/9 */
    else if (list[2].front < list[0].front)
      merge_from(1)
      goto state_2_lt_0 /* 2 inserts 4 comps prob 1/9 */
    else
      merge_from(1)
      goto state_0_lt_2 /* 2 inserts 4 comps prob 1/9 */

这总计为每次插入的预期比较次数

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

合并排序初学者问题 的相关文章

  • 运行时间为 O(n) 且就地排序的排序算法

    有没有运行时间为O n 并且还分类到位 在某些情况下 最好的情况是 O n 但这可能是因为项目集合已经排序 你正在看 O nlogn 一些较好的平均值 话虽如此 排序算法的 Wiki 还是相当不错的 有一个表格比较了流行的算法 说明了它们的
  • 如何检查无向图是否有奇数环

    我试图找到一个 O V E 时间算法来检查是否已连接 无向图有或没有奇数环 我正在考虑对图进行广度优先搜索 并尝试将顶点标记为黑色和白色 以便没有两个标记为相同颜色的顶点相邻 是否有任何已知的更简洁的算法可以在线性时间内解决这个问题 你的方
  • 查找文本中所有关键字的有效算法

    我有很多字符串 其中包含许多不同拼写的文本 我通过搜索关键字来标记这些字符串 如果找到关键字 我将使用该关键字的关联文本 假设搜索字符串可以包含文本 schw schwa 和 施瓦茨 我有三个关键字 全部解析为文本 schwarz 现在我正
  • 在 3d 网格中转发(绘制)线

    我需要类似 Bresenham 算法的东西 但是 对于 3d 网格空间来说不完全是这样 我需要 3d 单元网格 边缘尺寸 1 0 从 S 点开始 前进到 K 点 接触 该线接触的所有单元格 即使只有边缘 点被触摸我需要触摸所有 8 个单元
  • 线段树java实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你知道 二进制 的良好实现吗线段树 http en wikipedia org wiki Segmen
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • 数独算法,暴力破解[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 如何计算 3D Morton 数(交织 3 个整数的位)

    我正在寻找一种快速计算 3D Morton 数的方法 这个网站 http www graphics stanford edu seander bithacks html InterleaveBMN有一个基于幻数的技巧来处理 2D Morto
  • 贝尔曼福特算法可以有任意的边顺序吗?

    我刚刚开始学习新算法 但当我阅读 极客为极客而写的贝尔曼福特算法 时 我陷入了困境 http www geeksforgeeks org dynamic programming set 23 bellman ford algorithm h
  • c# GDI边缘空白检测算法

    我正在寻找解决方案检测边缘空白c 位图 来自 c 托管 GDI 库 图像将是透明的 or white 大多数 400x 图片的尺寸为 8000x8000px 边缘周围有大约 2000px 的空白 找出边缘的最有效方法是什么 x y 高度和宽
  • 使用什么算法来确定使系统达到“零”状态所需的最小操作数?

    这是一种更通用的问题 不是特定于语言的 有关要使用的想法和算法的更多信息 系统如下 它登记朋友群体之间的小额贷款 Alice and Bill要去吃午饭 比尔的卡坏了 所以爱丽丝支付了他的餐费 10 美元 第二天Bill and Charl
  • 我如何开始玩五子棋?

    我读到Gomoku http en wikipedia org wiki Gomoku它可以使用 Minimax 和 Alpha Beta 剪枝算法来实现 所以 我阅读了这些算法 现在了解了游戏将如何解决 但是当我坐下来编写代码时 我面临着
  • Java 中旅行商问题的暴力算法

    我正在学校的数学课上做一个项目 我选择做旅行商问题 这是我一直想进行更多研究的问题 但是 我的暴力求解算法遇到了问题 请前往底部更新查看最新版本代码 如果您知道旅行推销员问题是什么 请跳过本段 尽可能概括地说 TSP 是这样的 您是一名推销
  • 实时战略战争游戏人工智能算法

    我正在设计一款实时策略战争游戏 其中 AI 将负责控制大型六边形地图上的大量单位 可能超过 1000 个 一个单位有许多行动点 可以用于移动 攻击敌方单位或各种特殊行动 例如建造新单位 例如 一辆拥有 5 个行动点的坦克可以花费 3 个行动
  • 高度并行化的Levenshtein距离算法

    实际上 我必须实现一个字符串比较 最后得到匹配百分比 不仅仅是布尔结果匹配 不匹配 为此 我找到了 Levenstein 距离算法 但现在的问题是性能 例如 我有 1k 个字符串需要相互比较 现在大约需要 10 分钟 对于每个算法 我已经并
  • 使用递归返回嵌套列表中第二小的数字

    我必须归还第二小的使用递归的 python 列表中的数字 以及no loops 我所做的是创建一个辅助函数 它返回列表中 最小 第二小的 值的元组 然后我只取tuple 1 in my second smallest func def s
  • 确定一组日期的事件重复模式

    我正在寻找一种模式 算法或库 它将采用一组日期并在退出时返回重复的描述 即集合 11 01 2010 11 08 2010 11 15 2010 11 22 2010 11 29 2010 会产生类似 十一月的每个星期一 的结果 有没有人以
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • TDD 如何处理模拟对象中的更改

    在编写单元测试时 对于单元与之交互的每个对象 我正在采取这些步骤 从我对 JBrains 的理解中窃取 集成测试是一个骗局 http www infoq com presentations integration tests scam 在单
  • Grunt cssmin / CleanCSS 源映射变基

    我使用 cssmin 和以下 内容 文件夹结构 src dir1 style1 css images image1 png dir2 style2 css images image2 png dist styles min css styl
  • Chrome 不显示网站图标

    我无法显示该网站的图标http www lowcoupling com http www lowcoupling com在铬上 我已经用 Safari 检查过 图标显示正确 我应该如何修复它 UPDATE 这是我的 css 的第一部分
  • 用于执行外部 MSBuild 文件的 MSBuild 任务

    我正在尝试设置一个 MSBuild 文件 该文件将调用另一个 MSBuild 文件 我想知道实现此目的的最佳方法是什么 我们在构建服务器下载 MSBuild 文件的情况下使用它 然后根据参数执行相应的第二个文件 我知道我可以使用
  • 针对 Windows Phone ARM 目标的 Clang 交叉编译

    我想使用 Clang 为 Windows Phone ARM 目标编译一个用 C 编写的程序 有人有这方面的经验吗 什么是更好的方法 1 使用 Clang for Windows 和 MinGW 在运行 Windows 8 的主机上构建 C
  • 确定分发这些优惠券的最佳方式的算法是什么?

    这是我的问题 假设我要购买 3 种不同的商品 并且我最多有 5 张优惠券 优惠券可以互换 但用于不同商品时价值不同 以下矩阵给出了在不同商品上花费不同数量的优惠券的结果 coupons 1 2 3 4 5 item 1 10 off 15
  • Flutter Google 地图无法确定设备的当前位置

    我使用 Flutter 的 Geolocator 和 Google Maps 包来确定设备的位置 我利用圆形进度条来等待确定当前位置 一旦确定 Google 地图就会加载已识别的设备位置 当应用程序加载时 会显示圆形进度条 但尽管显示并接受
  • Symfony + Doctrine - 定义完整性约束错误时的错误消息

    当我尝试删除项目时出现完整性约束错误时 我试图显示一条不错的错误消息 我只想显示如下消息 而不是出现错误 500 您无法删除此内容 因为某些项目已链接到它 我已经搜索了一段时间 但我总是找到 如何解决此错误 的解决方案 我不想解决它 我只是
  • 跟踪表中的更改

    我的同事向我提出了一个我无法回答的问题 由于缺乏经验 该问题与跟踪表上相关字段的更改有关 假设我们有 3 个表 每个表有 20 个字段 让我们考虑一下这个示例 其中每个表都有 2 个字段 一个名为 LastUpdatedOn 另一个名为 L
  • 如何在字符串中存储颜色?

    如果颜色是人类可读格式 我想将颜色存储在字符串中 如果不是 则将其存储在 ToArgb 中 颜色是红色 然后将其存储在 Red 字符串中 如果颜色是绿色的某种变体 则将其存储为 ff40ff80 在运行时我想将此字符串转换回 Color 类
  • Rails 路由 - 如何将范围参数添加到 url_for 帮助器?

    我有资源生物 在视图和添加新生物的链接中是 link to Add new bio new admin bio 如果我将资源 bio放入这样的范围 namespace admin do scope bio type defaults gt
  • 使用 AutoMapper 映射字典

    鉴于这些类 我如何映射它们的字典 public class TestClass public string Name get set public class TestClassDto public string Name get set
  • Spring boot - 不是托管类型

    我使用 Spring boot JPA 并在启动服务时遇到问题 Caused by java lang IllegalArgumentException Not an managed type class com nervytech dia
  • sqlite3,IntegrityError:插入值时唯一约束失败

    为了防止我的数据库变得太大 我希望 sqlite 只插入尚未插入的值 我做了一些搜索 并认为最好的方法是使用 UNIQUE 约束 在我看来 插入不唯一的值时 sqlite 会崩溃 如何避免此错误并继续下一次提交 下面是一些相关代码 sql
  • Android 的自签名证书和 Loopj

    我正在尝试使用loopj http loopj com android async http制作async HTTP要求 效果很好 除了当我尝试使用自签名证书访问 https 网站时 我明白了 javax net ssl SSLPeerUn
  • 无法从 ArrayList 中删除[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions import java util c
  • .git/branches 文件夹的用途是什么?

    我一直认为 git branches目录用于遗留目的 并且 git 曾经使用该目录 但现在使用 git refs目录代替 这是真的 如果没有 那么该目录的目的是什么 因为我从未见过它被使用或引用 EDIT 我正在使用 git 版本 1 7
  • Cassandra静态列设计[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 静态列如何在 cassandra 内部存储 有人可以发布一个示例来讨论 cassandra 中静态列的
  • simd_float4x4 列

    我想平移平面而不旋转图像 出于某种原因 我的图像正在旋转 var translation matrix identity float4x4 translation colum 0 2 let transform simd mul curre
  • 合并排序初学者问题

    我现在有一个关于归并排序算法的问题 因为在原始算法中 将要排序的列表分为两个子列表并递归排序 现在我想将长度为 n 的列表分为 3 个长度为 n 3 的子列表 然后对这三个子列表进行递归排序 然后合并 怎么样 我只是简单地修改了原始算法 将