算法习题01:二分查找算法

本文介绍了二分查找算法的原理及实现,强调了计算中值时防止整数溢出的重要性。同时,指出了二分查找算法依赖于数组的有序性以及插入删除效率低的缺点,并提出二叉查找树作为更优解决方案,尤其是自平衡二叉查找树在构建和搜索上的高效性。

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

原文:算法习题01:二分查找算法

算法图解:二分查找

截图来自《算法图解》这本书

14261657952726

14091657952829

14231657952843

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x3QAfPmw-1659252948281)(https://xuemingde.com/pages/image/2022/07/16/14381657952858.png)]

14521657952872

14071657952887

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jVC0EnMz-1659252948282)(https://xuemingde.com/pages/image/2022/07/16/14591657953479.png)]

练习代码:

 /**
     * 需要的值是否存在
     * @param ints 数组
     * @param low 开始下下标
     * @param height 结束下标
     * @param need 基准值
     * @return
     */
    public static boolean searchBoo(Integer[] ints, Integer low, Integer height,Integer need) {
        if (low > height){
            return false;
        }
        int mid = low + (high - low) / 2;
        if (ints[mid].equals(need)) {
            return true;
        }else if (ints[mid] > need) {
            return searchBoo(ints, low, mid -1, need);
        } else if (ints[mid] < need) {
            return searchBoo(ints, mid + 1, height, need);
        }else {
            return false;
        }
    }

    /**
     * 需要值的下标
     * @param ints 数组
     * @param low 开始下下标
     * @param height 结束下标
     * @param need 基准值
     * @return
     */
    public static int searchindex(Integer[] ints, Integer low, Integer height,Integer need) {
        if (low > height){
            return -1;
        }
        int mid = low + (high - low) / 2;
        if (ints[mid].equals(need)) {
            return mid;
        }else if (ints[mid] > need) {
            return searchindex(ints, low, mid -1, need);
        } else if (ints[mid] < need) {
            return searchindex(ints, mid + 1, height, need);
        }
        return mid;
    }

这是一个经典的话题,如何计算二分查找中的中值?大家一般给出了两种计算方法:

  • 算法一: mid = (low + high) / 2
  • 算法二: mid = low + (high – low)/2

乍看起来,算法一简洁,算法二提取之后,跟算法一没有什么区别。但是实际上,区别是存在的。算法一的做法,在极端情况下,(low + high)存在着溢出的风险,进而得到错误的mid结果,导致程序错误。而算法二能够保证计算出来的mid,一定大于low,小于high,不存在溢出的问题。

二分查找法的缺陷

二分查找法的O(log n)让它成为十分高效的算法。不过它的缺陷却也是那么明显的。就在它的限定之上:必须有序,我们很难保证我们的数组都是有序的。当然可以在构建数组的时候进行排序,可是又落到了第二个瓶颈上:它必须是数组。

数组读取效率是O(1),可是它的插入和删除某个元素的效率却是O(n)。因而导致构建有序数组变成低效的事情。

解决这些缺陷问题更好的方法应该是使用二叉查找树了,最好自然是自平衡二叉查找树了,既能高效的(O(n log n))构建有序元素集合,又能如同二分查找法一样快速(O(log n))的搜寻目标数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丢了尾巴的猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值