Time complexity 9硬币平衡难题的算法复杂性?

Time complexity 9硬币平衡难题的算法复杂性?,time-complexity,Time Complexity,问题是:你有3^x硬币,其中一枚比其他的重。你必须使用一套天平来确定那是哪枚硬币。问题是,您只能使用磅秤进行x称重 例如 这不是一个特别好的编程挑战,因为您可以遍历数组查找1,即O(n)。正确的答案是将硬币分成三组,并称前两组的重量。这允许您确定三组中的哪一组包含硬币。反复称量这组硬币,以此类推,直到你只剩下一枚硬币。(可以通过获取子列表的和来模拟称重) 我一直在想这个算法的复杂度是多少。起初,我认为这是O(logn),因为您排除了数据集的一部分以收敛于答案,有点像二进制搜索。但是你必须遍历每个

问题是:你有
3^x
硬币,其中一枚比其他的重。你必须使用一套天平来确定那是哪枚硬币。问题是,您只能使用磅秤进行
x
称重

例如

这不是一个特别好的编程挑战,因为您可以遍历数组查找1,即O(n)。正确的答案是将硬币分成三组,并称前两组的重量。这允许您确定三组中的哪一组包含硬币。反复称量这组硬币,以此类推,直到你只剩下一枚硬币。(可以通过获取子列表的和来模拟称重)

我一直在想这个算法的复杂度是多少。起初,我认为这是O(logn),因为您排除了数据集的一部分以收敛于答案,有点像二进制搜索。但是你必须遍历每个组来确定它的权重,也就是O(n)

。请注意,我的C++最多是最差的,所以尽量把重点放在逻辑上,而不是代码本身。 在亲身经历了一些场景(9枚和27枚硬币)之后,我觉得这是一个有效的O(n)算法。我应该如何从数学角度来确定这一点?我还没有做校样。

是N*log(N)。log(N)是迭代计数,N是每个迭代的子集之和。

运行时计算为O(N),其中N是硬币数。要了解原因,请注意算法的每个“阶段”都会进行线性工作量,将剩余硬币的第一个和第二个三分之一相互比较,然后在剩余元素的三分之一上递归重复此过程。这给出了递推关系

T(N)=T(N/3)+O(N)

通过主定理求出O(N)。直观地说,每个阶段所做的功呈几何衰减,因此所做的总功是初始阶段所做功的常数倍

虽然确实存在O(logn)相,并且每个相都做O(N)功,但是O(N logn)的界限并不紧密,因为每个相所做的功衰减得非常快。

它是N*logn。log(N)是迭代计数,N是每个迭代的子集之和。
[0, 0, 1, 0, 0, 0, 0, 0, 0]
       ^ 

Heavier coin is at index 2.