Algorithm 在运行时合并两个排序数组的速度比O(N)快

Algorithm 在运行时合并两个排序数组的速度比O(N)快,algorithm,sorting,merge,linked-list,time-complexity,Algorithm,Sorting,Merge,Linked List,Time Complexity,我想我有一个解决办法,但我不完全确定 我的解决方案是将数组转换为链表。然后递归地合并和排序链表 我读到它将占用内存中的O(1)个空间。但我不确定运行时是否会比线性时间快 有什么建议吗?有一种特殊情况,您可以在固定时间内合并2个阵列: 数组是相邻的,即它们是同一数组的切片,第一个数组的最后一个元素正好位于第二个数组的第一个元素之前 第一个数组的最后一个元素小于或等于第二个数组的第一个元素 这种情况可以通过一次测试进行检查 这可能看起来很可笑,但这是mergesort的常见情况,对这种特殊情况的

我想我有一个解决办法,但我不完全确定

我的解决方案是将数组转换为链表。然后递归地合并和排序链表

我读到它将占用内存中的O(1)个空间。但我不确定运行时是否会比线性时间快


有什么建议吗?

有一种特殊情况,您可以在固定时间内合并2个阵列:

  • 数组是相邻的,即它们是同一数组的切片,第一个数组的最后一个元素正好位于第二个数组的第一个元素之前
  • 第一个数组的最后一个元素小于或等于第二个数组的第一个元素
这种情况可以通过一次测试进行检查

这可能看起来很可笑,但这是
mergesort
的常见情况,对这种特殊情况的测试首先会显著提高已完全或部分排序的阵列的
mergesort
性能。类似的测试可用于处理按相反顺序排序的数组,精心编制的代码可实现排序数组和反向排序数组的排序时间
O(N)
,同时在一般情况下保持相同数量的元素比较

我的解决方案是将数组转换为链表


这需要O(N)时间和内存。

如果没有代码,就无法确定。降低时间复杂度的唯一方法是有大量重复项。通过合并,您的意思是不应该有重复项吗?如何在小于O(N)的时间内将数组转换为链表?不,不可能在小于O(N)的时间内合并2个排序数组,n是最大数组的大小不可能比O(n)更快地读取两个排序数组,更不用说对它们做任何操作了。这绝对是100%不可能的。正是我所想的!例如,如果两个列表是小段的像素,也可能发生这种情况:每个列表中可能有很多像素,但从统计上看,在大多数情况下不会有重叠。即使有重叠,因为它们是排序的,您可以使用二分法查找重叠部分,然后只检查重叠段:操作,该操作将花费少于O(n)LSNED的
mergesort()
实现。@DJClayworth我是否误解了这个问题?我认为这相当直接地回答了OP的算法是否比O(N)快。