【发布时间】:2020-04-18 02:59:40
【问题描述】:
我目前正在在线学习计算机科学和项目管理,但是我真的被困在一个算法项目上。 到目前为止,我已经包含了所有需要的信息以及我的项目。 也许我选择了错误的算法? 任何帮助将不胜感激。
活动
您需要就以下算法问题撰写报告: 这个问题要求你在一组真硬币中找到一个假硬币。可以找到假硬币,因为它没有重量 和其他真币一样。它要么更轻,要么更重,但你事先并不知道。你唯一的方法 必须做出决定的是带有两个托盘的经典天平秤。您可以将一枚或多枚硬币放在一个托盘上,数量相近 在另一个托盘上,并确定哪个托盘有较轻的堆。例如,如果您只有三个硬币,那么取硬币 1 和 硬币 2 并称重。如果天平平衡,那么硬币 3 一定是奇数。如果秤不平衡,然后比较 硬币 1 和硬币 3。如果它们平衡,则硬币 2 必须是奇数,而如果它们不平衡,则硬币 1 必须是奇数 出去。 问题的关键是使用最少的比较次数找到假硬币。什么是最少的比较 3 硬币? 4个硬币? 5个硬币? 12个硬币?对于 N,任意数量的硬币?这个问题传统上用 12 表示 硬币。
在您的报告中包含以下内容:
- 了解问题:描述您如何解决问题并举例说明以加深理解。
- 了解算法过程如何解决问题:描述解决问题的一种或多种通用方法,包括您是如何踏上第一步的。
- 制定算法:更详细地描述您的算法。
- 评估您的算法的准确性及其作为解决其他问题的工具的潜力:描述您的想法 您的算法解决方案是正确的,以及为什么它可能比您的其他想法更好。
到目前为止我的报告:
算法设计
问题:
在一组真硬币中找出一个假硬币 我们被告知有 12 个硬币,我们需要确定哪个硬币是假的。 我们还对假硬币有了更深入的了解,这枚硬币的重量与其他硬币不同。这将向我们表明硬币更重或更轻,这是我们必须确定的。 最后我们知道,我们将不得不使用 2 个托盘秤来做出这个决定。
解决方案:
我的第一个想法是,我们得到了偶数个硬币,这在我看来是一种优势。 从这里我可以在每个托盘上放置偶数 6 个硬币。 其中一个托盘比另一个托盘要多,但这并没有定义托盘仍然有假硬币,因为我们不确定它的重量是更轻还是更重。 当我意识到这一点时,我意识到二进制算法方法在这种情况下不起作用,因为首先深入研究问题的中间不会做出任何决定。
第二个想法
我可以再次将硬币分成 2 组,每组有 6 个。 从这里我可以从第 1 堆中取出 1 个硬币,从第 2 堆中取出 1 个硬币。 如果它们的重量相同,则两个硬币都不是假的,可以从秤上取下。 如果 1 枚硬币更重,我们就知道其中一枚硬币是假的。 现在我们需要确定它是哪一个。 我们可以取出一枚硬币并用下一枚硬币替换。 我们知道下一个或最后一个硬币是真的,因此如果它们平衡,那么取出的硬币是假的,如果 他们不平衡,我们就知道剩下的硬币是假硬币。 现在我需要通过找出最好的,最坏的方法来确定这种方法是否是最好的方法 和平均情况。 最坏的情况是在我们得到最后 2 个硬币之前,所有硬币的重量都相同。
我们将分为几个步骤:
- 首先从中间分裂
(1) - 接下来比较硬币 1 和硬币 2
(2) - 接下来比较硬币 3 和硬币 4
(3) - 接下来比较硬币 5 和硬币 6(此处出现不平衡)
(4)取出硬币 5 并与硬币 4 交换
如果平衡,
那么硬币 6 是假的
否则硬币 5 是假的
Lg n = 12 = 4
【问题讨论】:
-
您报告的当前草稿没有提及您向 Stack Overflow 寻求建议。我相信很多教育机构不赞成使用未注明出处的参考资料,所以不要忘记注明出处。
-
这里你只检查6个硬币(不是12个)!但即使你修复了它,也要注意它的复杂性是
O(n)而不是lg(n),因为你需要最多(n/2) + 1比较才能找到假币。因此,我的方法具有更好的复杂性。
标签: algorithm binary project computer-science