设计并编写算法以执行最少数量的试验

时间:2014-06-02 20:09:32

标签: java algorithm complexity-theory

假设您被要求设计一个用于对产品样品(例如玻璃罐)进行压力测试的算法,以确定可施加的最高压力(或可以降低的高度)并且仍然不会破裂。在特定类型的罐子上进行该实验的设置如下:在试验期间,机器人操纵器握住罐子并将其带到用户指定的高度h(整数)并从那里掉落,其中l <= h ,&lt; = n,n是表示最大高度的整数。为以下每种算法提供伪代码或明确定义的步骤。

一个。设计并编写算法以执行最小试验次数(MNT)以确定最高安全高度(HSH)。根据n确定MNT。

湾设计并编写一种算法来打破查找HSH所需的最小罐数。根据n确定MNT。

这是一个有效的答案吗?如果是这样,为什么他会使用(3*h)/4

//problem 4 (a)
int h = 1;
boolean itBroke = false;

while (!itBroke) {
    itBroke = dropJar(h);
    h = (3*h)/4;
}

h = h/2; //this algorithm is C(n)=O(log(n))
System.out.Println("The maximum height the jar can be dropped is " + h );
//dropJar is a method that drops the jar from a height of "height" and
//returns a boolean value of whether or not the jar broke.

//problem 4 (b)
boolean itBroke = false;
int h = 1;

for (int i=0; i<h; i++) { //this algorithm is C(n)=O(n)
    itBroke = dropJar(h);
    if(!itBroke)
        h++;
}

h--;
System.out.Println("The maximum height the jar can be dropped is " + h);

2 个答案:

答案 0 :(得分:1)

4.a)的答案显然是不正确的。例如,如果MSH = 2,它将执行:

dropJar(1);
h = (3*h)/4 = 3 / 4 = 0;
dropJar(0);
h = (3*h)/4 = 0 / 4 = 0;
dropJar(0);
h = (3*h)/4 = 0 / 4 = 0;
...

也就是说,它永远不会终止,需要无数次试验。这显然不是最小的。

合理的算法是二进制搜索,需要进行O(log n)试验。

4.b)的答案是正确的,因为它通过打破一个罐找到最大安全高度。这显然是最佳的,因为我们无法在不破坏罐子的情况下发现MSH。但是,实施可以简化为:

int h = 0;
do {
    itBroke = dropJar(h);
} while (!itBroke);
return h - 1;

显然,这需要h = O(n)试验。

答案 1 :(得分:1)

首先假设这不是作业。 答案非常清楚,它遵循一个提示: 你有两种状态:0 =罐子没有坏,1 =罐子坏了

现在假设,你知道罐子可以容纳某一点,并且在一定高度之后罐子会制动。因此,您有一系列:

000000000000000000001111111111111111111111111

其中从0更改为1表示jar已损坏。 最简单和众所周知的算法在lokg(k)中找到第一个1,其中k是第一个1的位置。 通过这种方式,你们都拥有最佳的(不是最小的)试验次数和最高安全高度(这次肯定是正确的)