繁体   English   中英

为什么O(2 ^ n)与O(2 ^(n / 2))不同?

[英]Why is O(2^n) different from O(2^(n/2))?

考虑从一本书,试图解释以下问题的“中间满足”技术- https://cses.fi/book/book.pdf (54页,PDF P64)

例如,考虑一个问题,给我们一个n个数字和一个x的列表,我们想找出是否有可能从列表中选择一些数字,使它们的和为x。 例如,给定列表[2,4,5,9]且x = 15,我们可以选择数字[2,4,9]得到2 + 4 + 9 =15。但是,如果x = 10同一列表,无法形成总和。

...

解决该问题的一种简单算法是遍历元素的所有子集,并检查任何子集的总和是否为x。 这种算法的运行时间为O(2 n ),因为有2 n个子集。 但是,使用中间技术,我们可以实现更有效的O(2 n / 2 )时间算法。 注意,O(2 n )和O(2 n / 2 )是不同的复杂度,因为2 n / 2等于√2^ n。

  1. 他们通过拆分子集来扎根Big Oh时间。 但是到底为什么这与原始的2 n有什么不同呢?

  2. 说这两次是不同的。 差异真的那么大吗?

  3. 他们为什么不递归地归结到只有一个元素集和2 ^ 1个子集的基本情况(例如在合并排序中),而不是将它们减半? 如果将它们加在一起,是否可以提高效率?

PS:我知道这本书是C ++的不好参考,但是我将它更多地用于算法说明。

假设它们是相同的。 . 那么您可以说 and an such that for all , 这意味着存在一些和一个 ,对于所有

.

, 通过将两边均分,就等于说,对于所有

.

, so it is not bounded by any . 这显然是不可能的,因为左侧以足够大的到达无穷大,因此它不受任何

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM