繁体   English   中英

最坏情况下的时间复杂度列表

[英]Worst case time complexity lists

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

但是,如何计算二进制搜索和单链表插入类型的时间复杂性? 双向链表; 和循环链表的实现?

一个简单的答案是查看您的算法完成的计算机步骤。 您可能需要查看算法证明以及BigO,Omega和Theta表示法。 不同的算法具有不同的最坏情况和最佳情况。 给定具有n个给定输入的函数F(n)。 它具有G(n)个计算机步骤。 假设G(n)= 5x ^ 2 + 3x +1。大多数人通常看着Big-O。 对于Big(O),您删除所有系数,然后取前导项。 所以你的大O将是x ^ 2

您根本无法使用链接列表(单链接或其他任何链接)都无法执行二进制搜索。 它要求O(1)访问任何索引,这对于数组而言很简单,但对于列表而言则不可能。 想一想如何从元素n/2n/4进行传递,例如不遍历中间或从开始的所有元素。

另一方面,插入排序基于连续遍历元素,这在链表中不是问题,因此将保持相同的复杂性。 请注意,即使您必须从头开始遍历每个元素的整个列表(对于单个链接列表),也仍然是O(N ^ 2),而不是像以前那样使用数组。 但是,它确实需要修改算法,这向您展示了一个非常基础的课程-特定算法规定了数据结构,使用不同的数据结构通常将需要对算法进行更改,在某些情况下还需要更改其复杂性。

是否可以使用二进制搜索取决于是否可以随机访问项目(即按索引访问项目)。 您永远都无法访问列表中的项目(单链接列表; 双向链表; 和循环链接列表)按索引,因此您无法在列表上执行二进制搜索。 但是,您可以改用“ 跳过列表” 您可以在“跳过列表”中获得O(1)(最佳情况)O(lnN)(平均和最差)搜索。

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

BinarySearch:需要随机访问元素,可以在喜欢的列表中找到它吗? 不行 (尽管您可以使用额外的空间将其转换为array,但这克服了您仅需使用链表的事实)

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

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

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

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM