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

时间:2019-05-25 09:47:11

标签: c++ time-complexity

请考虑一本书中的以下问题,该书试图解释“中间会议”技术-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 个子集。但是,使用中间技术中的Meet,我们可以实现更有效的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 ++不好,但是我将它更多地用于算法说明。

1 个答案:

答案 0 :(得分:5)

假设它们是相同的。然后您可以说 2 n = O(2 n / 2 。这意味着存在一些 c> 0 和一个 n',这样对于所有 n> n'

2 n n / 2

将两边分开,就等于说,对于所有 n> n'

2 n / 2

这显然是不可能的,因为左侧会以足够大的 n 到达无穷大,因此它不受任何 c 的限制。