根据 1 的数量查找数字的排名

Find rank of a number on basis of number of 1's

本文关键字:数字 查找 根据      更新时间:2023-10-16

设f(k) = y,其中k为与的非负整数递增序列中的第y个数与k相同的二进制数,例如f(0) = 1, f(1) = 1, f(2) = 2, f(3) = 1, f(4)= 3, f(5) = 2, f(6) = 3,以此类推。给定k>= 0,计算f(k)

我们很多人都见过这个问题

1解决了这个问题,根据1的数量对数字进行分类,然后找到秩。我确实找到了一些模式,但这将是一个漫长的过程。谁能给我一个更好的解决办法?

这是一个计数问题。我认为,如果你用这种方法来处理它,你可以做得比字面上枚举值并检查它们有多少位要好得多。

考虑数字17。二进制表示为10001。1的个数是2。我们可以用两个1得到更小的数(在这种情况下)通过将1重新分配到四个低阶位中的任何一个。4选2等于6,所以17应该是二进制中第7个有2个1的数。我们可以检查一下……

   0 00000 -
   1 00001 -
   2 00010 -
   3 00011 1
   4 00100 -
   5 00101 2
   6 00110 3
   7 00111 -
   8 01000 -
   9 01001 4
  10 01010 5
  11 01011 -
  12 01100 6
  13 01101 -
  14 01110 -
  15 01111 -
  16 10000 -
  17 10001 7

我们是对的。推广这个想法,你应该得到一个有效的函数,你只需计算 k的秩。

编辑:提示概括17的特殊之处在于,如果你不考虑高阶位,这个数字的排名是1;也就是说,f(z) = 1其中z是除高阶位之外的所有数。对于不是这种情况的数字,如何在不移动高阶位的情况下得到更小的数字?

f(k)是小于或等于k的整数,其二进制表示形式与k具有相同的1个数。

例如,k需要m位,即k = 2^(m-1) + a,其中a < 2^(m-1)。小于2^(m-1)且与k具有相同位数的整数的数量是choose(m-1, bitcount(k)),因为您可以自由地重新分配m-1个最低有效位中的整数。

大于或等于2^(m-1)的整数与k(1)具有相同的最高有效位,因此它们有f(k - 2^(m-1))个。这意味着f(k) = choose(m-1, bitcount(k)) + f(k-2^(m-1))

参见"有效枚举集合的子集"。看表3,"银行家序列"。这是一种生成所需序列的方法(如果颠倒位顺序)。对K位的单词进行K次迭代。论文中包含了生成它的代码。