力扣 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。
如果目标值不存在于数组中,返回它将会被按顺序插入的位置:
int SearchInsert(int[] arr,int x){
        for(int i = 0;i < arr.length;i++){
            if(arr[i] == x){
                return i;
            }else if(arr[arr.length - 1] < x){
                return arr.length;
            }else if(arr[i] < x && arr[i+1] > x ){
                return i + 1;
            }

        }
        return 0;

    }

代码较冗余,第一个if可修改省略后面的if(虽然这样,但内存消耗也击败了百分之七十八的人,很迷)。

看别人的代码都是二分查找,便百度了一下效率问题,如果仅是学习的话,不如直接线性查找来的直白,而且需要数据足够大二分的优势才能凸显。

如果数据一直在剧烈变化,线性查找的优势也可能更大。

贴一段别人的回复:

如果是外存查找,例如硬盘查找,硬盘读取次数对总时间的影响,远大于算法复杂度的影响,此时线性查找极有可能更更快。这种情况下应该尽量去减少读取硬盘的次数,而不是直接取优化算法复杂度。内存查找的情况简单一些,二分查找的劣势是多了一个排序的过程。如果数据一直在剧烈变化,线性查找反而可能更优。反之如果数据是静态的,则一次排序即可,查找的key足够随机的情况下,二分查找的效率几乎总是「远远」高于线性查找。如果key的随机性不够,例如存在hot key,那就需要结合实际情况去解决了,例如做hot key预估

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值