algorithm - 合并排序数组和未排序数组
问题描述
将已排序的数组与未排序的数组合并,得到最终的排序数组。能不能做得更好,不是很明显的方法。
final_sorted_array=merge(sort(unsorted_array), sorted_array)
我假设合并步骤类似于合并排序中的合并步骤
我们知道任何最好的通常都受到 O(n log n) 的限制。我试图了解有序数据(了解有关数据的信息)通常在多大程度上有用。
解决方案
假设您的第一个数组称为 A1n1
元素,而您的第二个数组称为 A2n2
元素:
以 为代价扩展 A1 的长度并将 A2 附加到其上O(n2 + c)
,其中c
是一个常数。应用快速排序并以O( (n1+n2)*log(n1+n2) )
. 您提到您不想要明显的方式,但是,您希望以最好的方式完成工作。这可能是最好的方法,因为它允许您仍然使用通常是最快的数据结构的常规数组(当然,这具体取决于您正在处理的任务)。
但是,另一种可能性是使 A1 成为规则数组的链表 insetad,出于分析的目的,我们将不考虑将 A1 从规则数组转换为链表的成本。因此,该方法是将 A2 的有序每个元素插入到 A1 中。插入有序的明显方法是验证 A1 的每个元素,然后决定在哪里插入,以O(n1 + c)
每次插入为代价。然而,更聪明的方法是对 A1 进行二分搜索,以决定 A2 的每个元素应该插入的位置,代价是O(log(n1) + c)
每次插入。在这种情况下,会有n2
插入,即总成本n2*O(log(n1) + c)
. 在这种方法中,您不需要移动任何 A1 元素,因为我们假设您使用链表,您只需检查这些元素。这就是为什么这个渐近函数看起来更好的原因,这个数据结构让你能够只查看 A1 原始元素而不实际移动它们。
要决定应该使用哪种方法,我建议您分析数组合并后的算法,选择最适合您需要的选项。
推荐阅读
- typescript - 限制接口字段选择的条件
- elasticsearch - 如何统计弹性搜索查询结果中关键字出现的次数
- bundle - 在环境之间转移开发包
- node.js - nodejs:数据库不存在
- python - 问题:相关性总是给出 nan 值
- selenium - 有没有办法使用 maven 而不是整个套件来运行单个机器人框架测试用例?
- html - 在简单的 Spring Boot 应用程序中,图像未显示在网页上
- python - 如何停止模型迁移的无限循环,“模型具有尚未反映的更改” - makemigrations > migrate。相同的消息
- php - OOP PHP 未定义变量
- java - 如何查询事件驱动数据库表中所有对象的当前状态?