1
30
对于计算sum mod n的每一个求和操作,您执行64个求和,每一位一个,对于结果中应设置的每一位,此计算返回m,对于不应设置的每一位,返回0。
例子:
所以只设置了位1,这意味着结果是2。
优化实施:
可以在一个整数中求和多个位,而不是应用64个不同的位掩码来获得每个位,例如,一个只能使用4个位掩码来提取16个位,每个位之间有3个位的空间,只要不发生溢出,正常的加法操作就可以像处理16个4位整数一样工作,因此这种方法适用于15个数字。以这种方式处理15个数字后,结果必须添加到能够容纳更大整数的存储器中(可以是8个64位整数,每个8位整数都可以容纳8个8位整数,当然,它们必须依次清空为更大的整数等)。
可视化:
结果是相同的,无论您认为这是4列4位整数还是1列16位整数,这只是正确的,只要4位整数不溢出。 |
2
9
编辑) 好吧,这个方法不像我最初想象的那么好。电子商务的解决方案简单得多,适用于N=4、M=2等情况。我们可以将xor方法泛化为使用任意 米 和 n . 我们首先要选一个基地 乙 这样 GCD(n,b)=b 和 GCD(M,B)和lt;B . 如奇 n /甚至 米 对满足这一点对于基2,标准的二进制XOR适用于这些对。 首先我们定义 (a^ ^ n) 意味着 (a^ a^…^ a) 对于 氮甲 's,具有基本的通用异或 乙 . 例如,使用标准二进制XOR, a^ ^ 2=0 .
我们需要定义我们的通用XOR。我们想要的性质基本上与加法(交换性、结合性)相同,我们需要
a^ ^ b=0
. 显而易见的解决办法是
(x^ y)=(x+y)%b
对于基数中的每个数字
乙
表示法(让自己相信这是可行的,并且与基2的二进制XOR相同)。然后,我们简单地把它应用到序列中的所有数字,最后得到
结果=s^^(m%b)
,其中s是特殊编号。
这个算法是O(N)。对于列表中的每个数字,我们都有一个常量的操作要做,因为我们最多有64位数字。对于大B来说,最坏的情况是在末尾进行还原。我们可以通过计算在常量空间中完成最后一步。 i ^(m%b) 为了所有 我 对于每个数字(同样,我们有一个恒定的数字数)。 例子:
n
=3,
米
= 2。列表=
首先我们选择一个基地 乙 . 显然我们必须选择3垒。 供参考的XOR表:
计算:
因此,S ^^2=[001]。我们为每个数字i生成一个i^2的表,然后进行反向查找。
最后,我们将结果转换回二进制/十进制。〔002〕=2。 |
3
3
最简单的情况可以更一般,可以使用与奇数相同的方法 米 偶数 n . |
4
3
这里有一个与电子商务运行时间相同的解决方案(我认为它实际上是O(n log n)),但真正使用的是O(1)字的内存。它假定m不是n的倍数。它还假定两个助手函数严格计算参数上下的元素数。
|
5
2
|
6
0
如果对列表进行排序,那么这就变得非常简单,因为您只需要依次检查每个批次,看看它是否是长度m。 如果列表没有排序,那么我认为使用O(1)附加内存是不可能的。 |
7
0
我相信你不能只用0(1)个额外的空间。 这是我的理由:你被给予:
由于x_i值中存在重复项,我们将u定义为一组唯一值。u中的所有元素都出现n次,其中一个元素在x_i系列中出现m次。让我们将不太常见的元素标记为u_0,而u_1将设置为u-u_0。 我们是所有x的总和,可以写成:
解决这个问题就相当于在一个序列中找到唯一元素的和,而在O(1)额外的空间中不能这样做,因为您需要一个带有链接元素的数组或哈希表-该空间实际上是O(n) |
8
0
解的过程类似于求k阶统计量的过程。
o(n)查找k阶统计量等操作。 |
Toniq · javascript为php保存多维数组 1 年前 |
Jannis · Java中数组的怪异行为 1 年前 |
callum · 如何识别数组中与给定序列不匹配的元素? 1 年前 |
tenfour · 如何使用数组元素的索引初始化数组元素 2 年前 |
Guillaume · 使用操作从Python列表创建numpy数组 2 年前 |
maxMas · Swift 5:为什么会出现索引超出范围错误? 2 年前 |