计算出算法的下限

时间:2012-03-04 23:13:41

标签: algorithm

以下是我正在研究的书的第4章中的伪代码。

我已经解决了它基本上发现了一枚假币,如果有的话,因为它会比普通硬币更轻。

CW(A, i, j) /* n coins */
{
    if (i==j) return i /* base case */
    k := (j-i+1)/3
    Weigh A[i..i+k-1] and A[i+k..i+2k-1]
    if A[i..i+k-1] lighter
    CW(A, i, i+k-1);
    else if A[i+k..i+2k-1] lighter
    CW(A, i+k, i+2k-1);
    else /* equal */
    CW(A, i+2k, j);
}

现在我有2个问题。

  1. 如何显示查找伪造硬币所需的称重数量的下限,或确定没有存在的重量?

  2. 使用尽可能少的权重,是否有更好的算法来查找假币?

1 个答案:

答案 0 :(得分:1)

虽然你没有说明实际问题是什么,但我假设你有n个硬币,其中一个比其他硬币更轻,需要使用平衡秤找到它,可以比较硬币。

要找到下限,请考虑每个称重仅有3种可能结果的事实。所以k称重可以区分3 k 不同的情况。由于在给定问题中存在n个可能的情况(伪造硬币的n可能选择),您需要至少k = log 3 n权重才能找到它。

如果您分析给定的算法,您将看到这是它使用的称重次数,因此它是最佳的。