【问题标题】:Sequential Search Java顺序搜索 Java
【发布时间】:2017-03-29 10:12:52
【问题描述】:

我对顺序搜索有疑问,这是练习:

您正在测试一种砖的物理耐力。进行测试是为了找到砖块在不破坏 N 层建筑物的情况下可以掉落的最大高度。你有 k 块积木和两个箱子:

案例 1。当 k = 1 时,尝试从当前楼层开始,依次向上,直到砖块破裂。

案例 2。对于 k > 1,一块砖从 N/2 层掉落。如果它中断,则在楼层 1 和 N/2 -1 之间再次应用案例 2。如果砖没有破裂,则在 N/2 + 1 层和 N 层之间再次应用案例 2。

我对 CASE 1 的原因有疑问,因为我不知道如何处理它:

最初你调用 dropBricks(k,1,N);为k,N由用户(键盘)引入。

public static boolean breakingFloor(int floor){
    boolean breaks;
    Random r =new Random();
    int breakingFloor= r.nextInt(floor)+1;
    
    if(floor>=breakingFloor){
        breaks=true;
    }else{
        breaks=false;
    }
    
  return breaks;
}

dropBricks 接收 k(剩余砖块数, first (first floor),last (last floor = N)) 并且输出将是 brokenFloor

public static int dropBricks(int k,int first,int last){
    int result=0;
    
    if (k==1){//CASE 1
        //I KNOW THIS CODE IS WRONG, IS JUST O NOT LEAVE IT IN EMPTY
         do{
             dropBricks(k,first,last);
             first++;
         }while(breakingFloor(first));
         System.out.println("Floor brick broke "+floor);
   
    }else{//CASE 2
        if(last-first<=1){
            if(last==first){
                result=first;
                System.out.println("Floor brick broke "+result);
            }else{
                if(breakingFloor(first)){
                    result=first;
                    k--;
                    System.out.println("Floor brick broke "+result);
                }else{
                    result=last;
                    k--;
                    System.out.println("Floor brick broke "+result);
                }
            }
        }else{
            int mid=((first+last)/2);
            if(breakingFloor(mid)){
                result=dropBricks(k-1,first,mid);
                System.out.println("Floor brick broke "+result);
            }else{
                result=dropBricks(k,mid,last);
                System.out.println("Floor brick broke "+result);
            }
        }      
    }
    return result;
}

【问题讨论】:

    标签: java algorithm


    【解决方案1】:

    你的问题——或者至少其中一个问题——是每次你绕过这个循环......

    do{
        dropBricks(k,first,last);
        first++;
    } while( breakingFloor(first) );
    

    ...您正在选择一个新的随机楼层,它将在该楼层中断(发生在 breakingFloor 方法中):

    Random r =new Random();
    int breakingFloor= r.nextInt(floor)+1;
    

    这肯定会给您带来非常不一致的行为。有时它实际上可能会在侥幸的情况下起作用。

    您想选择它在开始时会中断的楼层并使其保持不变。

    测试您的应用程序的一种明智方法可能是硬编码一个突破层,然后再引入随机性。

    【讨论】:

    • 我看到你提出了同样的想法;当我还在思考的时候;-)
    【解决方案2】:

    您的第一个问题在这里:

    int breakingFloor= r.nextInt(floor)+1;
    

    这根本没有意义。砖块会破裂的楼层号不是随机的。

    换句话说:你想为那块砖分配一个随机数一次。然后你的算法必须找到那个数字!您的代码更改了“破楼层号”您的算法试图找到该号码。这使得整个过程毫无用处(当然;“随机”;因为各种事情都可能发生)。

    因此,您的第一步是:退后一步,重新思考问题,以及“解决”问题真正需要您做什么。

    【讨论】:

    • 正确。楼层号不是随机而是任意
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多