以下是我正在研究的书的第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个问题。
如何显示查找伪造硬币所需的称重数量的下限,或确定没有存在的重量?
使用尽可能少的权重,是否有更好的算法来查找假币?
答案 0 :(得分:1)
虽然你没有说明实际问题是什么,但我假设你有n
个硬币,其中一个比其他硬币更轻,需要使用平衡秤找到它,可以比较硬币。
要找到下限,请考虑每个称重仅有3种可能结果的事实。所以k
称重可以区分3 k 不同的情况。由于在给定问题中存在n
个可能的情况(伪造硬币的n
可能选择),您需要至少k = log 3 n权重才能找到它。
如果您分析给定的算法,您将看到这是它使用的称重次数,因此它是最佳的。