2

我浏览了许多关于渐近符号的讲座、视频和资源。我了解 O、Omega 和 Theta 是什么。但是在算法中,为什么我们总是只使用 Big Oh 表示法,为什么不使用 Theta 和 Omega(我知道这听起来很无聊,但请帮我解决这个问题)。根据算法,这个上限和下限究竟是什么?

我的下一个问题是,我们如何从算法中找到复杂性。假设我有一个算法,我如何找到递归关系 T(N),然后计算出它的复杂度?我如何形成这些方程?就像使用递归方式进行线性搜索一样,T(n)=T(N-1) + 1。如何?

如果有人能解释我认为我是菜鸟,那就太好了,这样我就能更好地理解。我找到了一些答案,但在 StackOverFlow 中还不够令人信服。

谢谢你。

4

2 回答 2

1

与 Theta 和 Omega 相比,为什么我们如此多地使用 big-O:这部分是文化因素,而不是技术因素。当 Theta 真的更合适时,人们会说 big-O 是非常常见的。Omega 在实践中没有得到太多使用,因为我们经常更关心上限而不是下限,也因为非平凡的下限通常更难证明。(微不足道的下限通常是那种说“您必须查看所有输入,因此运行时间至少等于输入的大小。”)

当然,这些关于下界的评论也部分解释了 Theta,因为 Theta 涉及上限和下限。

提出递归关系:没有简单的方法可以解决所有情况。这是相对简单的递归算法的描述。

令 N 为初始输入的大小。假设您的递归函数中有 R 个递归调用。(示例:对于合并排序,R 将为 2。)进一步假设所有递归调用将初始输入的大小减少相同的数量,从 N 到 M。(示例:对于合并排序,M 将为 N/2。)最后,假设递归函数 W在递归调用之外工作。 (例如:对于归并排序,W 将是归并的 N。)

那么递归关系将是 T(N) = R*T(M) + W。(例如:对于归并排序,这将是 T(N) = 2*T(N/2) + N。)

于 2012-08-12T12:52:22.217 回答
0

当我们创建一个算法时,它总是为了最快,我们需要考虑每一种情况。这就是我们使用 O 的原因,因为我们想要处理复杂性并确保我们的算法永远不会超过它。

要评估复杂性,您必须计算步数。在方程 T(n) = T(n-1) + 1 中,在计算 T(0) 之前会有 N 步,那么复杂度是线性的。(我说的是时间复杂度而不是空间复杂度)。

于 2012-08-11T14:55:47.263 回答