如何比较数组的大0时间复杂度,通过索引找到值与数组切片找到值



我有以下数组,我只是想确保我在时间复杂度方面是正确的,每个解决方案将运行

arr = [3,6,8,10,34]
# case one
result_one = [arr[-1], arr[-2], arr[-3]] 
# result = [34, 10, 8]
# case two
result_two = arr[-3:]
# result = [8, 10, 34]

基于case one常数O(1)在时间复杂度方面,result_two切片方法线性0 (n)case_one将运行得更快。这两种算法的假设和时间复杂度是否正确?

Big-O运行时是n增加时的生长行为。在这种情况下,n可以被视为arr的长度或提取的项数:

  • 就提取的项目数量而言,如果数量是可变的(而不仅仅是常数3),两个解决方案都是O(n)。如果数字是常数,那么大0就没有意义;你做的是固定数量的工作,这不会改变,所以增长甚至不适用。
  • arr的长度而言,当3的元素提取数一定时,两种解均为O(1);除了长度为0-2的arr,所有长度为3或更大的arr都需要相同的工作量来提取三个元素;将arr的大小增加一倍使工作保持不变。

不管你怎么看,对于任何具有O(1)索引的序列类型,这两个解决方案在定义上都是相同的大0;在底层,切片必须执行与显式索引完全相同的工作,因此它们必须执行相同的工作量。

与非O(1)项查找序列类型(如链接列表或类似,O(n)查找),切片将优于重复提取为大0的索引条目的数量(因为它只有找到片曾经的起点,不是n时期,使它O(m+n)m链表的大小和n提取物品的数量,从而简化O(m)既然你不能比你提取更多的条目,虽然重复索引将是O(m*n),支付O(m)的代价n倍),但对于具有O(1)索引的简单数组类数据结构,这两者将始终是大0等效的,尽管切片可能会更快,因为它可以批量执行操作,而无需反复在Python级别的代码中来回跳。对于短输入,它们的行为也会有所不同;如果输入少于3个元素,切片会静默地返回短输出,而索引将以IndexError结束。

最新更新