最糟糕的案例时间复杂性列表

时间:2014-01-13 00:47:38

标签: arrays algorithm sorting linked-list time-complexity

我知道二进制搜索的最佳,平均和最差情况时间复杂度为 最佳O(1); 平均O(log n); 最糟糕的O(log n);用于数组实现。同样,我知道插入排序的最佳,平均和最差情况时间复杂度为 最佳O(n); 平均O(n ^ 2); 最差的O(n ^ 2);用于数组实现。

但是,我如何解决二元搜索和插入单链表的时间复杂性;双重链表;和循环链表实现?

4 个答案:

答案 0 :(得分:0)

简要回答是查看算法完成的计算机步骤。您可能需要查看Algorithm Proofs,以及BigO,Omega和Theta符号。不同的算法具有不同的最坏情况和最佳情况。给定具有n个给定输入的函数F(n)。它有G(n)计算机步骤。让我们说G(n)= 5x ^ 2 + 3x + 1.大多数人通常会看Big-O.对于Big(O),您可以删除所有系数,然后选择主要的Term。所以你的Big-O将是x ^ 2

答案 1 :(得分:0)

您根本无法使用链接列表实现二进制搜索(既不是单个链接也不是任何其他链接)。它需要O(1)访问任何索引,这对于数组来说很简单,但是对于列表来说是不可能的。想一想如何从元素n/2传递到n/4,例如,不要遍历中间或从头开始的所有元素。

另一方面,插入排序是基于连续遍历元素,这在链表中不是问题,因此将保持相同的复杂性。请注意,即使您必须从头开始遍历每个元素(如果是单个链接列表),O(N ^ 2)仍然是这种情况,而不是像往常一样向后交换方式。阵列。然而,它确实需要修改算法,这会向您展示一个非常基础的教训 - 特定的算法决定数据结构,使用不同的数据结构通常需要更改算法,在某些情况下 - 也需要复杂性。

答案 2 :(得分:0)

是否可以使用二进制搜索取决于您是否可以随机访问项目(即按索引访问项目)。你永远不能从列表中访问项目(单链表;双重链表;和循环链表()通过索引,所以你不能在列表上实现二进制搜索。但是,您可以使用Skip List代替。您可以在跳过列表中获得O(1)(最佳情况)O(lnN)(平均值和最差值)搜索。

由于您不需要在插入排序中按索引访问,因此插入排序的数组和列表之间没有区别。通常,您需要访问上一个项目以插入当前项目,但是,您也可以按相反的顺序对项目进行排序,并从头开始查找位置(即列表的头部)并最后反转列表。它不会改变时间复杂性。

答案 3 :(得分:0)

二进制搜索: 需要随机访问元素,你能在喜欢的列表中获取它吗?不。 (虽然你可以使用额外的空间将其转换为数组,但这比你必须只使用链接列表更胜一筹)

插入排序:
你需要在特定索引之前访问元素,当然你不能在单独链接列表的O(1)中进行访问。
您可以从头开始遍历每个元素的列表,但这会使时间复杂度非常高。

在双向链表中,您可以轻松应用插入排序,因为您可以在O(1)时间内访问前一个元素。

在上面的讨论中,您也可以轻松地考虑循环列表。

希望这有帮助!