假设您被要求设计一个用于对产品样品(例如玻璃罐)进行压力测试的算法,以确定可施加的最高压力(或可以降低的高度)并且仍然不会破裂。在特定类型的罐子上进行该实验的设置如下:在试验期间,机器人操纵器握住罐子并将其带到用户指定的高度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);
答案 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的位置。 通过这种方式,你们都拥有最佳的(不是最小的)试验次数和最高安全高度(这次肯定是正确的)