算法第四版1.4算法分析:习题1.4.34

本文介绍了一种基于二分查找的优化算法,通过比较当前猜测数与目标数的差距,动态调整搜索区间,实现更高效的查找过程。算法首先使用1进行比较,随后在[1,N]区间内选取中点进行测试,依据比较结果更新搜索区间的上下限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 第一次用1比较

第二次区间为[1,N],取中点测试  ,根据hotter与colder更新下一次搜索区间下限或者上限

import edu.princeton.cs.algs4.StdOut;

public class E1_4_34 {
    public static void main(String[]args){
        int a=findKey(4,4);
    }

    public static int findKey(int N,int key){
        //在[1,N]里寻找key
        //第一次用1
        int prevNum=1;
        int prevDiff=Math.abs(1-key);
        StdOut.printf("num=%5d         diff=%5d\n", prevNum, prevDiff);
        if (prevDiff==0) return prevNum;
        int lo=1,hi=N;
        //每次验证区间中点
        int nowNum=(lo+hi)/2;
        while (nowNum!=key){
            int nowDiff=Math.abs(nowNum-key);
            if (nowDiff<prevDiff) {
                if (nowNum > prevNum)
                    lo = (prevNum + nowNum) / 2;
                else //<
                    hi = (prevNum + nowNum) / 2;
                StdOut.printf("num=%5d  hotter diff=%5d lo=%5d hi=%5d\n", nowNum, nowDiff,lo,hi);
            }
            else if (nowDiff>prevDiff) {
                if (nowNum > prevNum)
                    hi = (prevNum + nowNum) / 2;
                else //<
                    lo = (prevNum + nowNum) / 2;
                StdOut.printf("num=%5d  colder diff=%5d lo=%5d hi=%5d\n", nowNum, nowDiff,lo,hi);
            }
            else{//diff相等
            }
            prevDiff=nowDiff;
            if ((lo+hi)/2==prevNum)hi+=2;//int类型取整有可能nownum与prevnum相等,避免该情况发生
            prevNum=nowNum;
            nowNum=(lo+hi)/2;
        }
        StdOut.println("key="+nowNum);
        return nowNum;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值