【问题标题】:Determining Powers of 2?确定2的幂?
【发布时间】:2015-06-14 02:37:03
【问题描述】:

我正在创建一个简单的括号系统,我需要一种方法来检查团队数量是否正确,或者我的程序是否需要补偿轮空。

现在,我正在使用此函数检查“2 的幂”:

function validBracket(data) {
    var x = data.teams.length;
    return ((x != 0) && !(x & (x - 1)));
}

这很好用,但我需要知道要添加多少轮再见。 例如,如果我有16 teams,我就不需要再添加团队了。但是,如果我有12 teams,我将需要第一个4 teams 来轮空。

如何计算要添加到括号中的轮空次数?硬编码一组 2 的幂会更好吗?

在伪代码中,我想到的是这样的:

if(validateBracket(data)) {
    // Valid number of teams (power of two). Keep going.
} else {
    var byeRounds = calculateByeRounds();
}

注意:我宁愿不使用如下所示的 2 次幂数组:

var powersOfTwo = [2,4,8,16,32,...];

这背后的原因是我会限制可以放入系统的团队数量(但是,我认为一个人不会拥有超过 256 个团队)。

【问题讨论】:

  • 计算 2 here 的下一个幂并从当前整数中减去
  • 提示:每场比赛淘汰一名球员。因此,12 人的锦标赛需要 11 场比赛。锦标赛很容易设计为 2 的幂,因此通过引入 4 个虚构对手将 12 名玩家增加到 16 名。这些是再见。

标签: javascript jquery arrays algorithm math


【解决方案1】:
var needed = (1 << Math.ceil(Math.log2(n))) - n;

极端情况下更通用的解决方案:

var needed = Math.pow(2, Math.ceil(Math.log2(n))) - n;

【讨论】:

  • 非常简单。我可以检查它是否返回0,而不是我的第一个函数,那么它是一个完美的括号。谢谢!
  • 在这个特定的上下文中这并不重要,但这个二进制逻辑有一个上限。如果n &gt; Math.pow(2, 30). 则会中断
  • @PatrickRoberts 为什么会这样?考虑到不会有那么多团队,我认为没关系。不过,我仍然想知道它失败的原因。
  • @PatrickRoberts:是的。如果 OP 有多个 1073741824 团队,他应该用 Math.pow(2, ...) 替换 (1 &lt;&lt; ...)。 OP,原因是1 &lt;&lt; 31是一个负数,而1 &lt;&lt; 321,因为&lt;&lt;是在JavaScript几乎不存在的整数类型上定义的。
猜你喜欢
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 2017-12-03
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多