无论何时N
存储在某种内存中的对象数量都是正确的。毕竟,通过 64 位指针表示的每个字节的二进制搜索只需 64 步即可实现。实际上,只需 618 步就可以对可观测宇宙中的所有普朗克体积进行二分搜索。
因此,在几乎所有情况下,只要 N 是(或可能是)物理量,用 O(N) 近似 O(log N) 是安全的,并且我们确定只要 N 是(或可能是)一个物理量,则 log N < 618
但这是假设N
。它可能代表其他东西。请注意,它并不总是很清楚它是什么。举个例子,以矩阵乘法为例,为简单起见假设为方阵。对于普通算法,矩阵乘法的时间复杂度为 O(N^3)。但是这里的 N 是什么?它是边长。这是一种衡量输入大小的合理方式,但使用矩阵中的元素个数(N^2)也是相当合理的。让 M=N^2,现在我们可以说平凡矩阵乘法的时间复杂度是 O(M^(3/2)),其中 M 是矩阵中元素的数量。
不幸的是,我本身没有任何现实世界的问题,这是你问的。但至少我可以编造一些有意义的东西:
让 f(S) 是一个函数,它返回 S 的幂集中所有元素的哈希值之和。这里有一些拟定:
f(S):
ret = 0
for s = powerset(S))
ret += hash(s)
在这里,hash
就是简单的散列函数,并且powerset
是一个生成器函数。每次调用它时,它将生成 S 的下一个(根据某种顺序)子集。生成器是必要的,因为否则我们将无法存储大量数据的列表。顺便说一句,这是一个这样的电源组生成器的 python 示例:
def powerset(seq):
"""
Returns all the subsets of this set. This is a generator.
"""
if len(seq) <= 1:
yield seq
yield []
else:
for item in powerset(seq[1:]):
yield [seq[0]]+item
yield item
https://www.technomancy.org/python/powerset-generator-python/
那么 f 的时间复杂度是多少?与矩阵乘法一样,我们可以选择 N 来表示很多东西,但至少两个是很有意义的。一个是 S 中元素的数量,在这种情况下,时间复杂度是 O(2^N),但另一种衡量它的合理方法是 N 是 S 的幂集中元素的数量。在这种情况下,时间复杂度是 O(N)
那么对于 S 的合理大小,log N 是多少?好吧,包含一百万个元素的列表并不罕见。如果n是S的大小,N是P(S)的大小,那么N=2^n。所以 O(log N) = O(log 2^n) = O(n * log 2) = O(n)
在这种情况下,这很重要,因为在现实世界中 O(n) == O(log n) 很少见。