给定 $ n $ 具有权重 $ w_1,...,w_n $ 和值<跨越类=“math-container”> $ v_1,...,v_n $ ,一个重量限制 $ w $ ,目的仍在最大化要携带的物品的总价值(同时不超过重量限制)。现在,一旦拍摄了一个具有值 $ v_i $ 的项目,所有值大于 $还必须采取V_I $ 。 (可以假设所有 $ v_i $ s不同)

我的目的是在 $ o(n)$ 时间中实现这一点,这是我的尝试(假设输入是一个数组 $ a $ 元组 $(w_i,v_i)$ ):

  1. 计算项目的总重量: $ w _ {\ mathrm {总}} \ gets \ sum_ {i= 1} ^ n w_i $ ;

  2. $(w _ {\ mathrm {total}}> w)$ do:

    2.1 $ p \ get $ $ a $ ;

    中的值

    2.2 $ r \ get $ 其值大于 $ p $ ;

    2.3 $ l \ gets a \ setminus r $ ; (其值小于 $ p $

    2.4 $ w_r \ get $ $ \ sum_ {a [i] \ in r} w_i $ ;

    2.5 $ w _ {\ mathrm {total}} \ gets w_r $ ;

    2.6 $ a \ gets r $ ;

  3. $ w \ gets w-w _ {\ mathrm {total}} $ ; (剩余容量)

  4. 重复步骤2为array $ l $ ,生成array $ l'$ ;

  5. 返回 $ l'\ cup a $ ;

注意,用于查找中位数的算法线性时间。

我认为我的算法成本 $ o(n)$ 时间,因为每个循环中的每一个迭代,输入大小一半 - 但我不是100%自信。这算法是否真正成本连续时间?如果没有,可以制定哪些修改,或者是否有一般想法设计成本线性时间的这种算法?任何帮助都感激不尽! :)

有帮助吗?

解决方案

是您的算法在 $ o(n)$ 时运行,如果您使用中位数算法的中位数,则为$ o(n)$ 时间。 您可以通过查看您的算法并注意到我们正在考虑的阵列的大小被切割的每个循环中来证明这一点。循环主体的运行时间是 $ o(n)$ (如果我们使用中位数和阵列复制/过滤是 $ O(n)$ 无论如何)。现在我们得到以下总和:

$$ \ sum_ {i= 0} ^ {\ log(n)} \ frac {n} {2 ^ i} \ leq \ sum_ {i= 0} ^ {\ infty} \ frac {n} {2 ^ i} {2 ^ i}= n \ cdot \ sum_ {i= 0} ^ {\ infty} \ frac {1} {2 ^ i}= 2n \ In O(n)$$

$ \ log(n)$ 来自您只能划分数组大小 $ log( n)$ 时间中的一半,直到您到达 $ 1 $ (因为 $ 2 ^ {\ log(n) }= n $ )。总和的每个术语表达了循环体的一次执行的成本。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top