最坏情况下的大ω(n)是什么意思



如果Big Omega是下界,那么最坏情况下的时间复杂度为Big Omeca(n(意味着什么
从书中"使用python的数据结构和算法";Michael T.Goodrich:
考虑一个动态数组,当元素达到其容量时,该数组的大小会翻倍
这本书:

"我们充分探索了append方法。在最坏的情况下,它需要Ω(n(时间,因为底层数组被调整了大小,但它使用了摊销意义上的O(1(时间";

参数化版本pop(k(删除索引k<n列表的,将所有后续元素向左移动以填补移除。此操作的效率为O(n−k(,即换档量取决于索引k的选择。请注意意味着pop(0(是使用Ω(n(时间的最昂贵的调用。

how is"Ω(n(";描述了最昂贵的时间?

括号内的数字是实际执行操作所必须执行的操作数,始终表示为所处理项目数的函数。你永远不会担心这些操作有多难,只担心它们的总数。

如果数组已满并且必须调整大小,则需要将所有元素复制到新数组中。数组中每个项一个操作,因此是O(n(运行时。然而,大多数情况下,您只为O(1(运行时执行一个操作。

常见值为:

O(1(:只有一个操作,例如在列表未满时将其添加到列表中。

O(logn(:这通常发生在你进行二进制搜索或类似搜索来找到你的目标时。请注意,没有指定日志的基,因为差异只是一个常量,并且您总是忽略常量。

O(n(:数据集中每个项目一个操作。例如,未排序的搜索。

O(n log n(:通常出现在好的排序例程中,你必须处理每一项,但可以边走边分。

O(n^2(:通常遇到的情况是,你必须考虑数据集中两个项目的每次交互,却没有办法组织它。例如,我很久以前写的一个例程,用来查找几乎重复的图片。(精确的重复将通过制作一个哈希字典来处理,并测试哈希是否存在,因此是O(n(——这两次传递是一个常数并被丢弃,你不会说O(2n(。(

O(n^3(:当你达到这个高度时,你会非常仔细地考虑。现在,您将看到数据集中项目的三方交互。

更高的订单可能存在,但你需要仔细考虑它将要做什么。我交付的生产代码是O(n^8(,但路径修剪非常严重,甚至需要12个小时才能运行。如果数据的性质不利于这种修剪,我根本不会写它——代码仍在运行。

你偶尔会遇到更糟糕的事情,需要仔细考虑它是否可以忍受。对于大型数据集,它们是不可能的:

O(2^n(:现实世界中的例子:试图修剪路径以保留最小生成树——我计算了所有可能的树,并保留了最便宜的树。几个实验表明,n从未超过10,我认为我还可以——直到另一个种子产生了n=22。我重写了程序,因为它并不总是完美的答案,而是O(n^2(。

奥:我不知道有什么例子。它爆炸得非常快。

最新更新