【问题标题】:Calculate how many binary numbers with X number of 1 bits exist between two given binary numbers with the same property计算两个给定的具有相同属性的二进制数之间存在多少个 X 个 1 位的二进制数
【发布时间】:2017-04-17 01:36:43
【问题描述】:

这对我来说已经有一段时间了。

给定两个表示二进制数的数组 A 和 C 具有相同的大小,由数字 0 或 1 表示的位组成,使得 C > A,并且都具有相同的 X 个 1 位,什么是计算存在多少二进制 B 的最有效方法,例如 A

示例:对于 A={0,1,0,0,1} C={1,0,1,0,0} X=2
所有 B 将是 {0,1,0,1,0},{0,1,1,0,0},{1,0,0,0,1},{1,0,0,1,0 },这会给我答案 4。有 4 个二进制文件,在 01001 和 10100 之间有 2 个“1”位。

我有一个算法可以在给定一些 A 的情况下生成下一个 B,但我觉得继续生成下一个 B 并检查我是否已经命中 C 二进制文件效率不高。

有没有什么方法可以在不生成 B 的情况下计算 A 和 C 之间 B 的确切数量?

【问题讨论】:

  • 你为什么担心你的算法的效率?除非您要计算数百万位的数字,或者计算数百万次,否则请追求优雅和清晰而忽略效率。从 A 到 C 迭代计数 N 1 位的数字似乎是最直接的解决方案,并且可能足够有效。
  • Integer#bitCount 是一个 O(1) 操作;在这种情况下,如果我是你,我就不会担心效率。
  • 你的算法在哪里?
  • 我承认,其中一个原因是出于好奇。我只是想知道是否有“公式”或其他东西。另一个更重要的原因是,对于数组的任何其他单元格,总二进制数乘以 2,所以如果我有 A[50] 和 C[50],我将不得不使用的次数生成 B 的算法可能达到数百万、数十亿等。
  • 老实说,很可能存在一个您可以使用的组合公式;如果我是你,我会在math.stackexchange.com 上发帖。如果你有一个算法,我可以为你编写一个程序。

标签: java binary combinatorics


【解决方案1】:

不知道你在https://math.stackexchange.com/ 上是否有答案,但让我试一试。

在下面的所有讨论中,我们只对X 1 位的数字感兴趣。为了简单起见,我不会一直这么说。

所以,假设我们可以计算低于给定值A:smaller(A) 的数字计数。要找到AC 之间的数字计数,我们可以将其计算为smaller(C) - smaller(A) - 1

让我们定义一个函数来计算在 Y 位空间中存在多少具有 X 位的数字,count(X, Y),例如count(1, 3) = 3001010100)和count(2, 3) = 3011101110)。这是标准组合数学,即从袋子中拉出编号为 1 到 Y 的 X 球的组合数。

count(X, Y) = Y! / ((Y-X)! * X!)

其中X!factorial(X)

现在我将通过一个示例展示下一部分,如何计算smaller(A)。让A = 010010100.

首先,计算右边的 0 (2)。然后在A 下方有count(1, 2) 数字,其中最右边的 1 位向右移动(010010010010010001)。

提示:使用count = Integer.numberOfTrailingZeros(A)

删除那个 1 位,留下 A = 010010000

提示:使用A = A ^ (1 << count)

重复,即计数 0 (4),但这次我们需要计数 2 位组合,即 count(2, 4)

剩下的是A = 010000000,然后是count(3, 7)

所以,因为 1 位在位 2、4 和 7,我们可以计算:

smaller(A) = count(1, 2) + count(2, 4) + count(3, 7)

现在,有了 count(X, Y) 的高效实现,计算 A 和 C 之间的数字计数应该不会太糟糕,即使是高位计数。

无论如何,这是一种方法,但数学方面的天才可能对此有更好的算法。

【讨论】:

  • 这实际上是一个数学界的人告诉我的完全相同的算法,但这对程序员更友好哈哈。惊人!非常感谢您花时间解释!链接到其他人的答案math.stackexchange.com/questions/2230248/…
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 2015-04-14
  • 1970-01-01
  • 2014-06-19
相关资源
最近更新 更多