我经历了许多关于渐近符号的讲座,视频和来源。我明白O,Omega和Theta是什么。但是在算法中,为什么我们总是只使用Big Oh表示法,为什么不使用Theta和Omega(我知道它听起来很无趣,但请帮我解决这个问题)。根据算法,这个上限和下限究竟是什么?
我的下一个问题是,我们如何从算法中找到复杂性。假设我有一个算法,如何找到递归关系T(N),然后计算它的复杂性?我如何形成这些方程式?就像使用递归方式的线性搜索一样,T(n)= T(N-1)+ 1.如何?
如果有人可以解释我,考虑到我是一个菜鸟,这样我会更好地理解。我找到了一些答案但在StackOverFlow中没有说服力。
谢谢。
答案 0 :(得分:1)
与Theta和Omega相比,为什么我们使用big-O这么多:这部分是文化的,而不是技术的。当Theta真的更合适时,人们说大O是非常普遍的。欧米茄在实践中并没有得到很多应用,因为我们经常更关注上界而不是下限,而且因为非平凡的下界往往更难以证明。 (琐碎的下界通常是那种说"你必须查看所有输入,所以运行时间至少等于输入的大小。")
当然,这些关于下界的评论也部分解释了Theta,因为Theta涉及上限和下限。
提出一个递归关系:没有简单的食谱可以解决所有情况。这是对相对简单的递归算法的描述。
设N是初始输入的大小。假设递归函数中有R个递归调用。 (例如:对于mergesort,R将是2.)进一步假设所有递归调用都将初始输入的大小减少相同的量,从N到M.(例如:对于mergesort,M将是N / 2。)最后,假设递归函数在递归调用之外执行W 。(例如:对于mergesort,W对于合并将为N.)
然后递归关系将是T(N)= R * T(M)+ W.(例如:对于mergesort,这将是T(N)= 2 * T(N / 2)+ N.)< / p>
答案 1 :(得分:0)
当我们创建算法时,总是为了最快,我们需要考虑每个案例。这就是我们使用O的原因,因为我们希望主要的复杂性,并确保我们的算法永远不会超过这个。
要评估复杂性,您必须计算步数。在等式T(n)= T(n-1)+ 1中,在计算T(0)之前将是N步,然后复合性是线性的。 (我说的是时间复杂性,而不是空间复杂性)。