美文网首页
多路归并

多路归并

作者: Pober_Wong | 来源:发表于2018-09-02 23:42 被阅读45次

大概一年以前,接到同学面试头条之后讨论的请求,说是要在八分钟内手写出二路归并源码,我也没含糊,大概在八分钟内交出了源码,并且在 10 分钟内完成了边界调试,最终跑通了代码。只可惜最终同学因为没能现场写出这道决定性的题目被刷了下来。

二路归并

/*
 * time complexity = O(n)
 */
function twoWayMerge (arr1, arr2) {
    if (!arr1 || !arr2) {
        return 'illegal params'
    }
    
    if (arr1.length === 0 || arr2.length === 0) {
        return arr1.concat(arr2)
    }

    const result = []
    let i = 0, j = 0

    while (i < arr1.length && j < arr2.length) {
        if(arr1[i] <= arr2[j]) {
            result.push(arr1[i])
            i++
        } else {
            result.push(arr2[j])
            j++
        }
    }

    if (i > arr1.length - 1) {
        result.push(...arr2.slice(j))
    } else {
        result.push(...arr1.slice(i))
    }

    return result
}

/*
 * time complexity = O(n*(k-1))
 */
function multiWaysMerge (...args) {
    return args.reduce(twoWayMerge)
}

multiWaysMerge([0, 2, 4, 6, 8], [0, 2, 3, 5, 7], [0, 2, 4, 6, 8], [0, 2, 3, 5, 7], [0, 2, 4, 6, 8], [0, 2, 3, 5, 7])

思考

使用 reduce 函数很容易得将多路归并反复进行两两归并来实现。然而真的只能限制在平方级别的时间复杂度了嘛?换个思路,不以二路归并为核心子函数,尝试使用另外一种思路,把多路归并按照二路归并的方式来思考,二路归并是同步对比两路的同位置元素,小的放入结果数组,并指向下一个元素,反复之直到两个数组有一个遍历结束。我们可以把对比两路换成对比 k 路,接下来的思路和二路归并完全一致,不过由于不再是两个数的对比,在一个序列中寻找最值用循环的话需要 O(k),这样时间复杂度还是落在了 O(nk) 上。不过我们依然有了优化的切入点(寻找最值)。
关于胜者树,败者树

相关文章

  • 多路归并

    大概一年以前,接到同学面试头条之后讨论的请求,说是要在八分钟内手写出二路归并源码,我也没含糊,大概在八分钟内交出了...

  • 外排序-多路归并

    内排序的归并排序是采用二路归并。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有...

  • 排序算法☞java代码实现归并排序

    归并排序:归并的含义是将两个或两个以上的有序表合并成一个新的有序表。归并排序有多路归并排序、两路归并排序 , 可用...

  • 外部排序

    http://data.biancheng.net/view/77.html 多路归并排序: 对于外部排序算法来说...

  • Java归并排序,代码,优缺点

    一. 概念 归并的含义是将两个或两个以上的有序表合并成一个新的有序表。大体分成,两路归并排序,和多路归并排序。用于...

  • 1g内存如何处理10G文件内容

    思路: 文件进行拆分 每个小文件进行排序 多个小文件执行多路归并合成一个文件,只需要归并找出最小(最大的值)顺序写...

  • 多路归并 大数据处理

    问题一: 输入:给定一个文件,里面最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数),且其中每个数...

  • 多路平衡归并算法(基于败者树归并有序段)(归并中的归并)

    http://data.biancheng.net/view/77.html 如果毫无限度地增加 k 值,虽然会减...

  • 归并排序

    本来是要探究多路归并的最优解的,却无意间碰到了归并排序,那就深入了解一下吧。 先来了解一下什么是 分治法。 大体思...

  • 多路归并与胜者树败者树

    多路归并从 O(nk) 到 O(nlogn) 的优化切入点为在每次寻找最值上。我们可以利用堆、胜者树败者树这种每次...

网友评论

      本文标题:多路归并

      本文链接:https://www.haomeiwen.com/subject/nppvwftx.html