加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

algorithm – 具有最大零尾位数的区间中的整数

发布时间:2020-12-16 18:21:49 所属栏目:安全 来源:网络整理
导读:Sought是一种有效的算法,它在区间[a,b]中找到唯一的整数,该区间在其二进制表示中具有最大尾随零数(a和b是整数 0): def bruteForce(a: Int,b: Int): Int = (a to b).maxBy(Integer.numberOfTrailingZeros(_))def binSplit(a: Int,b: Int): Int = { require(a
Sought是一种有效的算法,它在区间[a,b]中找到唯一的整数,该区间在其二进制表示中具有最大尾随零数(a和b是整数> 0):

def bruteForce(a: Int,b: Int): Int =
  (a to b).maxBy(Integer.numberOfTrailingZeros(_))

def binSplit(a: Int,b: Int): Int = {
  require(a > 0 && a <= b)
  val res = ???
  assert(res == bruteForce(a,b))
  res
}

这里有些例子

bruteForce(  5,7) ==   6 // binary 110 (1 trailing zero)
bruteForce(  1,255) == 128 // binary 10000000
bruteForce(129,255) == 192 // binary 11000000

等等

解决方法

这个找到零的数量:

// Requires a>0
def mtz(a: Int,b: Int,mask: Int = 0xFFFFFFFE,n: Int = 0): Int = {
  if (a > (b & mask)) n
  else mtz(a,b,mask<<1,n+1)
}

这个用这些零返回数字:

// Requires a > 0
def nmtz(a: Int,mask: Int = 0xFFFFFFFE): Int = {
  if (a > (b & mask)) b & (mask>>1)
  else nmtz(a,mask<<1)
}

我怀疑log(log(n))解决方案有一个足够小的常数项来击败它. (但你可以对零的数量进行二进制搜索以得到log(log(n)).)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读