|
|
1
5
如果你愿意有一个O(lg n)解,以可能的不均匀概率为代价,递归地进行半分裂,即用位集的上半部分和下半部分。如果两者都不是零,则随机选择一个,否则选择非零的一个。然后将剩下的部分分成两半,以此类推。对于一个32位的数字,这将需要10次比较,可能没有你想要的那么少,但比32位更好。
随机数只需要生成一次,因为每次测试只使用一个位,只需在完成测试时将使用的位移出即可。
例如,如果您首先有一个32位的数字,并且如果结果非零(假设您与0xffff0000进行and运算),则使用0xff000000或0x00ff0000进行and运算,依此类推,直到达到一位。这最终是一个冗长的代码。32位需要5层代码。 |
|
|
2
1
你想要均匀的随机分布吗?如果是这样的话,我看不出有什么好的方法来计算比特数,然后随机选择一个,或者随机选择一个比特,直到你找到一个设置好的。
哪里
|
|
|
3
1
此函数均匀地随机选择两个掩码中的高位。如果有的话 没有可能的位可以选择,而是返回零。运行时间是O(n),其中n是anded掩码中的高位数。因此,如果掩码中的高位数较少,那么即使最坏的情况是O(n),当所有位都为高位时,该函数也会更快。C语言实现如下:
|
|
|
4
1
诀窍是,虽然很容易得到最低的集合位和最高的集合位,但为了获得均匀分布,我们需要随机选择一个分区点,然后随机选择是选择它下面的最高位还是上面的最低位(如果返回0,则尝试另一种方法)。 为了让步骤更容易遵循,我比平常更详细地分析了这一点。关于常数计时,我能看到的唯一问题是Math.Pow和Math.Log是否应该考虑为O(1)。
|
|
|
5
1
我相信,如果你想要制服,那么答案就必须是
下面的C++片段(被盗)应该能够检查任何给定的num是否是2的幂。
|
|
6
1
如果您没有足够的位需要担心,则可以使用查找表获得O(1):
否则,您可以使用(x&-x) ,假设2s补码。例如,如果x=46=101110b,则-x=111…111010010b,因此x&-x=10。 您可以使用此技术在O(n)时间内枚举x的设置位,其中n是x中的设置位数。 请注意,计算一个伪随机数需要花费大量时间 比枚举x中的设置位还要长! |
|
|
7
0
这不能在O(1)中完成,对于固定数量的N位的任何解(除非它真的非常可笑地愚蠢)都有一个恒定的上界,即N。 |
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |