博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二维有序数组查找数字
阅读量:5759 次
发布时间:2019-06-18

本文共 704 字,大约阅读时间需要 2 分钟。

最近碰到一个还算比较有点意思的算法题目,就是对二维有序数据的折半查找。题目是这样的,设有一个大小未定二维有序数组 A,从左到右是由小到大顺序排列,由上到下也是由小到大的顺序排列;该二维数组里的所有数都不重复,并且 A[i][i+1]和A[i+1][i]的大小关系未知;现求在数组中找到一个指定的数据的最优算法。

因为A[i][i+1]和A[i+1][i]的大小关系不确定,因此在查找时没有办法使用直接将该二维数据沿着上下或者左右直接延展成二维数组来直接进行折半查找,因此这个算法题也算是稍微有点意思的。

我最开始的想法是分别在上方和左方找到大于且最接近该数的位置,然后在下方和右方查找小于且最接近该数的未知,将这个四个位置组合,则可以构成一个新的小的二维数组。逐步为之,一旦方块缩小到足够小,则可以找到该数字的位置了。

但是后过头来以细想,似乎这个和原题强调的折半查找有点没关系,而且效率似乎也不是太好。还好,人的灵感是上帝赐予的,突然之间,我似乎又看到了一种新的办法:

虽然A[i][i+1]和A[i+1][i]的大小关系未知,但是A[i][i] < A[i+1][i+1]是肯定的。先假设该二维数组宽和高一致,则将所有A[i][i]组合在一块则是一个由小到大的有序数组,在该数组上则先使用折半查找,即分别找到大于和小于该数的最接近该数的两个值,然后在分别在两边在进行查找就可以了。这样算来相当于只进行两行数据三次查找,效率应该不差的。

推广开来,想象三维和N维的查找大概也就差不多是这样了。

 

【转自】http://blog.sina.com.cn/s/blog_5749ead90100ewdi.html

转载地址:http://hcmkx.baihongyu.com/

你可能感兴趣的文章
Egg 2.19.0 发布,阿里开源的企业级 Node.js 框架
查看>>
Kubernetes 弹性伸缩全场景解析 (四)- 让核心组件充满弹性 ...
查看>>
使用MySQLTuner-perl对MySQL进行优化
查看>>
Swoole 4.1.0 正式版发布,支持原生 Redis/PDO/MySQLi 协程化 ...
查看>>
开发网络视频直播系统需要注意的地方
查看>>
haproxy mysql实例配置
查看>>
强化学习的未来— 第一部分
查看>>
TableStore:用户画像数据的存储和查询利器
查看>>
2019 DockerCon 大会即将召开,快来制定您的专属议程吧!
查看>>
15分钟构建超低成本数据大屏:DataV + DLA
查看>>
1月9日云栖精选夜读 | Mars 算法实践——人脸识别
查看>>
SparkSQL Catalyst解析
查看>>
jSearch(聚搜) 1.0.0 终于来了
查看>>
盘点2018云计算市场,变化大于需求?
查看>>
极光推送(一)集成
查看>>
MySQL 8.0 压缩包版安装方法
查看>>
@Transient注解输出空间位置属性
查看>>
Ansible-playbook 条件判断when、pause(学习笔记二十三)
查看>>
5种你未必知道的JavaScript和CSS交互的方法(转发)
查看>>
线程进程间通信机制
查看>>