Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最后k位之和与前k位之和相同_Algorithm - Fatal编程技术网

Algorithm 最后k位之和与前k位之和相同

Algorithm 最后k位之和与前k位之和相同,algorithm,Algorithm,我想知道给定范围内少数数字的前k位和是否等于最后k位的和。这里的范围非常大,k小于20 我们能做到这一点的一种方法是使用暴力手段。有人能推荐一些其他有效的算法吗。同样的?蛮力法的一个理论改进: 1) 将前k位相加,存储在sumFirst 2) 对最后k位进行求和,但如果求和超过sumFirst, 第2点可以节省最后几个数字的总和 但是,你必须衡量,如果额外的逻辑,成本比简单地增加所有的k位 蛮力法的一个理论改进: 1) 将前k位相加,存储在sumFirst 2) 对最后k位进行求和,但如果求和超

我想知道给定范围内少数数字的前k位和是否等于最后k位的和。这里的范围非常大,k小于20


我们能做到这一点的一种方法是使用暴力手段。有人能推荐一些其他有效的算法吗。同样的?

蛮力法的一个理论改进:

1) 将前k位相加,存储在
sumFirst

2) 对最后k位进行求和,但如果求和超过
sumFirst

第2点可以节省最后几个数字的总和


但是,你必须衡量,如果额外的逻辑,成本比简单地增加所有的k位

蛮力法的一个理论改进:

1) 将前k位相加,存储在
sumFirst

2) 对最后k位进行求和,但如果求和超过
sumFirst

第2点可以节省最后几个数字的总和


但是,你必须衡量,如果额外的逻辑,成本比简单地增加所有的k位

对暴力的另一个改进:

i = 0, T = 0
while |T| < 9 * (k - i) 
  T = T + last[i] - first[i]
  i = i + 1
return T == 0 
i=0,T=0
而| T |<9*(k-i)
T=T+last[i]-first[i]
i=i+1
返回T==0

对暴力的另一项改进:

i = 0, T = 0
while |T| < 9 * (k - i) 
  T = T + last[i] - first[i]
  i = i + 1
return T == 0 
i=0,T=0
而| T |<9*(k-i)
T=T+last[i]-first[i]
i=i+1
返回T==0
优化N-k

改进算法的一种方法是,如果具有N个数字的数字具有以下属性:
N<2k

例如,如果N=5和k=3,
5<2x3
,则数字为

abcde
您只需根据
de
计算
ab
(即无需检查
k
(3)个数字,因为第3个数字由k个最后数字和k个第一数字共享)。
换句话说,两边要计算的数字数仅为

min(k, N-k), having N >= k
优化N-k

改进算法的一种方法是,如果具有N个数字的数字具有以下属性:
N<2k

例如,如果N=5和k=3,
5<2x3
,则数字为

abcde
您只需根据
de
计算
ab
(即无需检查
k
(3)个数字,因为第3个数字由k个最后数字和k个第一数字共享)。
换句话说,两边要计算的数字数仅为

min(k, N-k), having N >= k

如果是一个范围,则第一个数字不会经常更改,最后一个数字将以简单的方式更改。S是前20位数字的和。虽然第二个数字不变,但当您转到下一个数字时,总和将增加1。所以,如果你所有的数字,除了最后一个,都是固定的,如果最后一个数字等于i的和是Si,那么唯一好的最后一个数字就是n=S-Si+i。然后,您必须检查n是否在0和9之间,以及结果数字是否在间隔内。这将使查找次数减少10次

您可以检查下一个secund低位。
如果第一个n小于0,则需要将第二个und数字减少-n。把这个数字叫做第二个数字。如果n2>=0,好的数字将以(n2,0),(n2-1,1),…,(0,n2)结尾。这将复杂性降低100。
如果n大于10,则将第二位数增加n-9。拨打第二个数字。如果n2如果它是一个范围,则第一个数字不会经常更改,最后一个数字将以简单的方式更改。S是前20位数字的和。虽然第二个数字不变,但当您转到下一个数字时,总和将增加1。所以,如果你所有的数字,除了最后一个,都是固定的,如果最后一个数字等于i的和是Si,那么唯一好的最后一个数字就是n=S-Si+i。然后,您必须检查n是否在0和9之间,以及结果数字是否在间隔内。这将使查找次数减少10次

您可以检查下一个secund低位。
如果第一个n小于0,则需要将第二个und数字减少-n。把这个数字叫做第二个数字。如果n2>=0,好的数字将以(n2,0),(n2-1,1),…,(0,n2)结尾。这将复杂性降低100。
如果n大于10,则将第二位数增加n-9。拨打第二个数字。如果n2如果要对同一数组多次使用,则可以将所有元素与前面的元素相加,即
O(n)
,其中数组的大小为
n
,即

for(int i = 1; i < n; i++)
     arr[i] = arr[i] + arr[i-1];

如果要对同一数组多次使用该值,可以将所有元素与前面的元素相加,即
O(n)
,其中数组的大小为
n
,即

for(int i = 1; i < n; i++)
     arr[i] = arr[i] + arr[i-1];

你能举例说明吗?@HamZa为什么?你不明白什么?谁需要这个?对于哪个应用程序,您需要一个比直接forwars更好的解决方案?您所说的“给定范围内的少数数字”的含义仍然不清楚。您是否需要比较n,n+1,n+2。。。m(你打算只使用同一个数组一次还是多次?你能用一些例子说明一下吗?@HamZa为什么?你不明白什么?谁需要它?对于哪个应用程序,你需要一个比直接forwars更好的解决方案?你所说的“给定范围内的少数数字”是什么意思还不清楚.您是否需要比较n,n+1,n+2,…m中所有数字的前k位和后k位之和(您是否只使用同一个数组一次或多次?如果原始问题明确说明“给定范围内的少数数字”是否有其他限制,则有更多的改进方法。因此有必要澄清这个问题。这并不是说平均可以节省50%。如果超过总和,通常会在接近尾声时发生,因此节省会更接近于零。@interjay你是对的,我已经更新了。可能你无法通过算法手段来改进蛮力。如果最初的问题清楚地表明,是否对“一个国家中的少数几个数字”有额外的限制