【问题标题】:Sorted array Big o notation有序数组大 o 表示法
【发布时间】:2009-11-07 00:41:10
【问题描述】:

我只有一个简单的问题,为什么排序数组的大 O 表示法是 O(log N)?它将是一个排序数组。

【问题讨论】:

  • 这对 java 有什么特殊的影响?或者为什么在标题中提到java而不在标签中?
  • 你说的是排序数组上的哪个操作?在谈论“大 O”时,您必须谈论算法,因此请指定它。是插入吗?抬头?种类?什么?

标签: arrays complexity-theory big-o sorted


【解决方案1】:

大 O 表示法通常在算法的上下文中有意义。当你说大 O 表示法是 O(log n) 时,你在考虑什么操作。

如果你的意思是搜索,那么它是 O(log n),因为你可以使用二进制搜索。这实质上意味着您查看数组的中间元素,如果它大于您要搜索的元素,则搜索较大的一半(以相同的方式),反之亦然(假设您还没有当然找到了你的元素)。您可以在wikipedia 上阅读更详细的说明。

在搜索的每一步(查看中间元素),您都将必须搜索的数组大小减半,因为您现在可以知道您的搜索元素必须位于中间元素的哪一侧。当然,这只适用于排序数组。对于未排序的数组,您可以使用的唯一搜索算法是线性搜索,您可以在其中检查数组中的每个元素,平均需要 n/2 次检查。

一般来说,大O描述的是算法的运行时特性,所以你不能只问,排序数组的大O是什么,一定是对数组的一些操作。但是,您可以根据某些数据结构占用的空间(内存)来考虑 Big O。在这种情况下,排序数组仍然需要 O(n) 空间来存储 N 个元素。

【讨论】:

    【解决方案2】:

    这个问题有点假。复杂性不适用于数组,但实际上适用于对数组进行排序的算法(我假设您的意思是运行时复杂性而不是内存)。

    因此,根据所使用的算法,用于对数组进行排序的 O(X) 中的 X 可能会有很大差异。

    检查这些页面,了解一般复杂性和特殊情况下的数组排序。

    Introduction to algorithm complexity

    Sorting Arrays: Algorithms and Efficiency

    Wikipedia: Computational complexity theory

    【讨论】: