【问题标题】:Which approach to storing items in a linked-list is faster?将项目存储在链表中的哪种方法更快?
【发布时间】:2013-12-08 04:35:12
【问题描述】:

我的算法教科书中有一个问题我不确定,希望有人能详细说明/解释:

当您设计一个分而治之的算法以将项目存储在大小为 n 的链表中时,在最坏的情况下,将问题一分为二会比将列表分成大小为 1 的单个子问题的算法更快,并且另一个大小为 n-1 的?

【问题讨论】:

  • 在链表中存储项还是在链表中排序项?
  • 在链表中存储项目

标签: algorithm linked-list divide-and-conquer


【解决方案1】:

将流程视为树形结构,如:

          [1,          n]
         /               \
 [1,     n/2]             [n/2,       n]
 /           \             /            \
[1, n/4] [n/4, n/2]  [n/2, n*3/4] [n*3/4, n]

时间成本取决于您在每个级别上进行的计算量。

例如找出数组中的最大数。

int f1(int a[], int n){
    if (n == 1) return a[0];
    return max(a[0], f1(a + 1, n - 1));
}


int f2(int a[], int n){
    if (n == 1) return a[0];
    return max(f2(a, n / 2), f2(a + n / 2, n - n / 2));
}

您在每个级别上进行的计算是O(1),所以f1f2 的总和是O(n)

或者如你所说的quicksort算法,你在每一层做的计算是O(n),所以总成本取决于有多少层。

如果我们将其分为[1, n/2][n/2, n],则将有O(logn) 级别,总时间成本为O(nlogn)

如果我们把它分成[1, 1][2, n],就会有O(n)的等级,所以总的时间成本就是O(n^2)

【讨论】:

    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 2013-11-02
    • 2021-11-15
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多