我试图找出哪种是执行以下任务的最快方法:
编写一个函数,接受两个数组作为参数——每个数组都是一个排序的严格升序的整数数组,并返回一个新的严格升序的整数数组,其中包含两个输入数组中的所有值。
例如,合并[1,2,3,5,7]和[1,4,6,7,8]应该返回[1,3,4,5,6,7,8]。
由于我没有受过正规的编程教育,我觉得算法和复杂性有点陌生:)我有两种解决方案,但我不确定哪一种更快。
解决方案 1(它实际上使用第一个数组而不是创建一个新数组):
function mergeSortedArrays(a, b) {
for (let i = 0, bLen = b.length; i < bLen; i++) {
if (!a.includes(b[i])) {
a.push(b[i])
}
}
console.log(a.sort());
}
const foo = [1, 2, 3, 5, 7],
bar = [1, 4, 6, 7, 8];
mergeSortedArrays(foo, bar);
和解决方案2:
function mergeSortedArrays(a, b) {
let mergedAndSorted = [];
while(a.length || b.length) {
if (typeof a[0] === 'undefined') {
mergedAndSorted.push(b[0]);
b.splice(0,1);
} else if (a[0] > b[0]) {
mergedAndSorted.push(b[0]);
b.splice(0,1);
} else if (a[0] < b[0]) {
mergedAndSorted.push(a[0]);
a.splice(0,1);
} else {
mergedAndSorted.push(a[0]);
a.splice(0,1);
b.splice(0,1);
}
}
console.log(mergedAndSorted);
}
const foo = [1, 2, 3, 5, 7],
bar = [1, 4, 6, 7, 8];
mergeSortedArrays(foo, bar);
有人能帮我解决这两个解决方案的时间复杂度吗?还有,是否有另一个更快的解决方案?我应该使用减少()吗?
复杂性还取决于您在代码中使用的方法。
1)通常用于排序的算法是Quicksort (introsort是Quicksort的变体)。
它的复杂度为O(n log n),但是在输入已经排序的情况下,最坏的情况可能仍然是O(n^2)。因此,您的解决方案具有O(长度(b)长度(a)长度(b)log(长度(a)长度(b)))运行时复杂度。
2)根据这个关于splice()复杂性的问题,javascript函数最坏需要O(n)步骤(将所有元素复制到大小为n 1的新数组中)。因此,您的第二个解决方案将数组 b 的长度乘以在拼接期间复制元素所需的 n 步加上 push() 的时间。
对于在线性时间O(n m)内工作的好的解决方案,请参考此Java示例并将其移植(即创建一个大小-长度(a)-长度(b)的数组,并通过所示的索引步进)。或者看看答案下面非常紧凑甚至更快的实现。
您的第一个函数修改传递的参数,这是错误的做法。您可以通过以下方式完成:
function mergeSortedArrays(a, b) {
return a.concat(b.filter(el => !a.includes(el))).sort();
}
我想写一个时间O(n*lgk)的算法,将k个排序数组合并成一个排序数组,其中n是所有输入数组的元素总数。 你能告诉我怎么做吗? 编辑:我编写了以下算法: 你能告诉我这是否正确吗?
问题内容: 这是在采访中问我的,这是我提供的解决方案: 有没有更有效的方法可以做到这一点? 编辑:更正的长度方法。 问题答案: 稍有改进,但是在主循环之后,当到达另一个输入数组的末尾时,可以用来复制其中一个输入数组的结尾。但是,那不会改变你解决方案的性能特征。
问题内容: 给定两个排序数组,如下所示: 我希望输出为: 要么: 我知道我可以执行以下操作: 我只是想知道是否有一种更快的方法,因为我要处理的数组具有数百万个元素。 任何想法都欢迎。谢谢 问题答案: 由于您使用numpy,因此我怀疑bisec根本不会对您有所帮助。因此,我建议您做两件事: 千万 不能 使用,使用方法,而不是这种种取代阵列,避免了复制。 必须使用没有到位的。因此,不要手动使用逻辑。I
问题是== 将nums1和nums2合并到一个按非递减顺序排序的数组中。 最终排序的数组不应由函数返回,而应存储在数组 nums1 中。为了适应这种情况,nums1 的长度为 m n,其中前 m 个元素表示应合并的元素,最后 n 个元素设置为 0 并应忽略。nums2 的长度为 n。 我的代码中有什么错误??? 您的意见 我的产出 预期产出
在处理接近排序的数组时,哪种算法的快速排序或合并排序性能更好?为什么?我意识到,在这种情况下,其他算法可能会比这些算法表现得更好。