怎么会
怎么会 想到 二十郎当小年轻在成年许久后 要用到在知识是小学知识
最近啊小年轻研习了下算法 (最基础的那种)
当学习到要求取数组中第一个N最右侧的 1 这里用到了二分法来加速寻找
说到这里 以为说的是二分法吗 不 绝对不是
遇到的问题是int内存溢出问题 这里首先设定L和N是 int 类型假如我们要取下标L和下标N之间的中间值 首先想到的其实是(L+N)/2 但是这里会出现一个问题 首先知道N的值是大于L的并且没有超出int 的范围 但是L+N的值是否超出int 的范围是一个不可控因素 所以此时重点出现了
可以换一种写法 L+(N-L)/2 这里用到了小学数学知识 通分
那为什么这样就不回内存溢出呢?
首先 L是没有溢出的 N是没有溢出的 (N-L)/2当然更不会溢出 那么 L+(N-L)/2 值是不会大于N 所以并不会出现溢出的问题
此时已经解决了int内存溢出的问题 接下来可以有更好的写法
根据计算机的结构 小年轻知道 位运算更加接近底层 越接近则运算越快
位运算比除运算快 但是随着技术的发展 加减运算和位运算相差不大
所以 如果可以用位运算 那一定是有帮助的 可以改写为 L+((R-L)>>1)
在位运算中 N/2 相当于N>>1 N*2+1 相当于((N<<1)| 1)
并且为了优先级的考虑 括号一定要注意 注意运算优先级 加减是优先于位运算的