算法挑战:在数组中查找唯一值

时间:2015-04-03 17:25:36

标签: algorithm search comparison

给出一系列橡胶球,例如:除了一个球之外,所有球都是相同的重量。什么是找到具有独特重量的球的最有效方法,并且需要将球放在秤上的最少量?

3 个答案:

答案 0 :(得分:1)

您可以通过二进制搜索算法(O(logn))轻松完成。你只需将球组分成两组。然后选择一个并划分它们。称重它们。如果桩相等,则球在另一堆中。如果它们不相等,则继续这两个堆的过程。选一个,分开并称重。你最终会分离出不同的球。

答案 1 :(得分:0)

我相信你的意思是你只能使用比例来了解不同的球。以下是我的解决方案。

你有3个案例:

Case 0: if there is only `1` ball, then this is the desired ball.

Case 1: the number of balls is divisible by 3. 
        Divide the balls into 3 equal sets {1, 2, 3}.
        weigh 1 and 2 ==> if equal, recurse on 3
                          if not, weigh 1 and 3 ==> if equal recurse on 2
                                                    if not recurse on 1




Case 2: the number of balls leave a remainder of 1 when divided by 3. 
        Take one ball out, call that ball x.
        You want to check if x is the desired ball or not.
        Take 2 more balls, call them y and z.

        Weigh y and z ==> if equal, weigh x and y ==> if equal, x is not the desired ball. This is case 0 or 1 on the set of balls without x.
                                                      if not, x is the distinct ball
                          if not, weigh x and y ==> if equal, z is the distinct ball
                                                    if not, y is the distinct ball.



Case 3: the number of balls leave a remainder of 2 when divided by 3.
        Take two balls out, call them x and y.
        Take one more ball, call it z.

        weigh x and y ==> if equal, weigh x and z ==> if equal this is case 0 or 1 on the remaining balls without x and y.
                                                      if not, z is the distinct ball.
                          if not, weigh x and z ==> if equal, y is the distinct ball.
                                                    if not, x is the distinct ball.

答案 2 :(得分:0)

让我们为8球做:

留下2分,然后称重3 - 3:你知道哪一组3有不同的球,或者你知道剩下的那个是不同的,在这种情况下,还有一个加权会找到它

要从3中找到它,请留出一个并称重1 - 1。同样,无论如何,你都会发现它,我们在2权重中做到了,击败了二元搜索。

对于16,您可以在3中执行此操作:

退出6。比较5 - 5。如果相等,我们可以从2权重中遗漏的那些中找到它。

我们可以通过比较5然后2 - 2来找到1 - 1

一般情况下,如果我们有3^x <= n < 3^(x + 1)个球,那么我们可以在x + 1中进行,我认为这是最佳的,但没有证明:

3^1 <= 8 < 3^2 => answer = 2
3^2 <= 16 < 3^3 => answer = 3

这是因为我们总是可以将球的数量分成3组,大小为k, k, k; k, k, k + 1k, k + 1, k + 1,然后可以比将其分成两半更快地递归解决。

我不确定这是否是最佳的,但它胜过经典的二元搜索。