【问题标题】:what can be the best algorithm to find numbers with only single set bit and whose sum is equal to given number?什么是查找仅具有单个设置位且其总和等于给定数字的数字的最佳算法?
【发布时间】:2015-12-11 07:40:35
【问题描述】:

假设我有一个号码0b10110010

我想用总和等于上述数字的不同数字来解析它,所有解析的数字都应该只设置一个位。

 10000000  <-- num1
 + 100000  <-- num2
 +  10000  <-- num3
 +     10  <-- num4
----------
 10110010  <-- num1 + num2 + num3 + num4

什么是最好的算法?

【问题讨论】:

  • 请为此任务选择一种语言。
  • 那么%10 不行吗,/10 工作?
  • @FUZxxl 我标记了 c 和 c++,任何人都可以。
  • @vish4071 表示二进制
  • @mch 相反:对于一般算法或伪代码的问题,应该使用 no 语言标签。为了让这些问题得到更多关注而发送多个语言标签的垃圾邮件是不受欢迎的。

标签: c algorithm


【解决方案1】:

基本上是这样的:

int i;
for (i = 1; i <= num && i != 0; i <<= 1) {
    if ((i & num) == 0)
        continue;

    /* i is part of the decomposition, do something with it */
    printf("0x%4x\n", i);
}

这将遍历所有可能的数字并设置一位,并忽略未设置num 中相应位的那些。复杂度为 O(log num)。还有一个O(k)解,其中knum中1的位数,算法如下:

int i, n = num;
while (n != 0) {
    i = ((n - 1) & ~n) + 1;
    /* i is part of the decomposition */
    printf("%4x\n", i);
    n &= n - 1;
}

请考虑下图以了解其工作原理:

n             101101101010100000000
n - 1         101101101010011111111
~n            010010010101011111111
~n & (n - 1)  000000000000011111111
i             000000000000100000000
n & (n - 1)   101101101010000000000

在最后一行中,n &amp;= ~i 也可以使用,但这会迫使编译器将i 变量保留的时间比需要的时间长一点,这可能对速度不太理想。有疑问时进行基准测试。

我个人的猜测是,如果 num 是稀疏的,即在 num 中只设置了几个位,则第二种方法更快。 由于其操作数较少,您如果已知 num 不是稀疏的,则应使用第一种方法。

【讨论】:

  • 为什么将 i 移动 2?它应该移动 1...(或乘以 2)
  • @FUZxxl 没有 O(n) 不可能吗?
  • 这不是 O(n),这是 O(log(n))
  • @JagsVG 首先,这是 O(log n) 但实际上是 O(1),因为 int 中的 a 位数是有限的。其次,是的,可以在 O(k) 中做到,其中 k 是设置的位数,但该方法更复杂,并没有真正得到回报。如果你愿意,我也可以写出来。
  • @FUZxxl,请写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 2018-04-19
  • 1970-01-01
  • 2011-12-20
  • 2020-08-13
  • 1970-01-01
相关资源
最近更新 更多