根据 1 的数量查找数字的排名
Find rank of a number on basis of number of 1's
设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次迭代。论文中包含了生成它的代码。
- 查找最接近的大于当前数字的数字的索引
- 在 c++ 中查找字符串中没有循环的数字总和
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 在C++的一系列数字中查找重复模式
- 为什么使用数组元素查找最大数字的程序不起作用?
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 查找数字是否为 2 的幂的时间复杂度
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 使用 XOR 逻辑查找缺失的数字
- 查找中间两个数字的正则表达式的匹配项
- 查找数组中的最小数字
- 查找数组中重复(重复)数字的索引
- 程序 查找数字的重复
- 如何查找数字大于 5 的数字总和
- 查找数组中给定数字的出现次数
- 在 C++ 中查找 2 个数字的 GCD
- 代码以查找数组中的最大数字,但它仅将第一个数字显示为最大数字. 有人请告诉我为什么
- 如何制作一个查找数字平方值的 c++ 程序
- 查找整数数组中最接近的数字
- C ++递归与大数字查找mod