arrays - 为什么合并排序空间复杂度 O(log(n)) 与链表?

标签 arrays algorithm sorting linked-list

数组上的归并排序具有 O(n) 的空间复杂度,而链表上的归并排序具有 O(log(n)) 的空间复杂度,已记录 here

我相信我理解数组的情况,因为我们在合并两个子数组时需要辅助存储。但是,链表合并排序不会就地合并两个子链表吗?我认为创建新头部的空间复杂度为 O(1)。

就地合并(无辅助存储):

public Node merge(Node a, Node b) {
    Node dummyHead, curr; dummyHead = new Node(); curr = dummyHead;
    while(a !=null && b!= null) {
        if(a.info <= b.info) { curr.next = a; a = a.next; }
        else { curr.next = b; b = b.next; }
        curr = curr.next;
    }
    curr.next = (a == null) ? b : a;
    return dummyHead.next;
}

最好有解释。

最佳答案

归并排序算法是递归的,因此对于数组和链表情况,它需要 O(log n) 堆栈空间。但是数组的情况还分配了一个额外的 O(n) 空间,它支配了堆栈所需的 O(log n) 空间。所以数组版本是O(n),链表版本是O(log n)。

关于arrays - 为什么合并排序空间复杂度 O(log(n)) 与链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24171242/

相关文章:

arrays - Golang问题数组数独-网格[i] [j] [0]

c - 将具有重复值的整数数组部分排序到存储桶中的最快方法

c - 寻找一种快速轮廓线渲染算法

arrays - 添加/删除单元格时保持数组排序的最佳方法

c - 每次执行计数排序都会使我的程序崩溃,无法发现 malloc/free 错误

c - 为什么 char *str = "anything"的大小总是 8?

javascript - 使用 ramda 展平各种数组

algorithm - 具有 BFS 的强连通分量

algorithm - 一个偏序集的元素是最大的概率?

c++ - 在 C++ 中对数字数组进行排序时,是否必须将字符串转换为 double ?