查找算法:在双重排序的数组中进行快速查找

假设A是一个n*n的二维数组。它的行和列都按照升序排列,给定一个数值x,设计一个有效算法,能快速在数组A中查找x是否存在。同时考虑一个算法效率的下界,也就是无论任何算法,它的时间复杂度都必须高于某个给定水准。

这道题难度不大,看到排序数组时,我们就应该本能的考虑到使用二分查找。我们先看一个具体实例,假设有一个符合条件的二维数组如下:

12.gif

最简单的方法是,循环遍历整个二维数组,依次查找给定元素是否与给定元素一样,当然这么做的算法复杂度是O(n^2),因为没有理由到排序特性,因此效率不高。

由于数组的行和列都已经按升序排好,我们可以利用这个性质加快查找速度。假设在给定例子中,我们要查找数值6.5,我们首先以行为主,在一行范围内进行折半查找,此时发现第一行的末尾元素小于6.5,因此我们继续考虑第二行。在第二行中,折半查找到7时,7比6.5大,此时根据行和列都升序排列的条件,我们可以忽略掉7开始的子矩阵,也就是[7,8,11,12,15,16],由此一下子就排除掉无需考虑的一大堆元素。

由此我们可以归纳出基于折半查找的算法步骤:

1, 从当前行开始折半查找,直到找到给定数值元素或是找到一个比查找数值小的最大元素时停止,假设该元素位于第j列。
2,由于矩阵元素按照列进行升序排列,因此我们可以在第j列元素中进行折半查找,直到找到给定数值元素

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>