dim*_*r91 5 python list while-loop python-3.x
我有一个问题,我需要(至少可以肯定)通过整个列表来解决.问题是找出列表中连续数字的最大数量,该数字加起来列表中的另一个(更大)元素.如果没有,那么我们只需将列表中的最大值作为候选求和,将1作为最大连续元素数.
我的通用代码有效,但对于大型列表(> 500,000个元素)则不太好.我只是在寻找有关如何以不同方式解决问题的提示.我目前的做法:
L = [1,2,3,4,5,6,7,8,9,10]
candidate_sum = L[-1]
largest_count = 1
N = len(L)
i = 0
while i < N - 1:
s = L[i]
j = 0
while s <= (N - L[i + j + 1]):
j += 1
s += L[i+j]
if s in L and (j+1) > largest_count:
largest_count = j+1
candidate_sum = s
i+=1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,答案是[1,2,3,4],因为它们加起来为10,长度为4(显然这个例子L是一个非常简单的例子).
然后我通过将初始while循环条件更改为:
while i < (N-1)/largest_count
Run Code Online (Sandbox Code Playgroud)
这不是一个很好的假设,但基本认为数字的分布有些统一,因此列表后半部分的两个数字平均大于列表中的最终数字,因此被取消资格.
我只是在寻找:
小智 4
严格升序:元素或子序列不重复,单一可能的解决方案
任意间隔:没有算术捷径,必须暴力操作
使用指针算术、数值类型的准多态的高效 C 实现:
#define TYPE int
int max_subsum(TYPE arr [], int size) {
int max_length = 1;
TYPE arr_fst = * arr;
TYPE* num_ptr = arr;
while (size --) {
TYPE num = * num_ptr++;
TYPE* lower = arr;
TYPE* upper = arr;
TYPE sum = arr_fst;
int length = 1;
for (;;) {
if (sum > num) {
sum -= * lower++;
-- length;
}
else if (sum < num) {
sum += * ++upper;
++ length;
}
else {
if (length > max_length) {
max_length = length;
}
break;
}
}
}
return max_length;
}
Run Code Online (Sandbox Code Playgroud)
s上的主循环num是可并行的。arr使用动态数组列表类型 for和循环相对直接地转换为 Python 3 for each:
def max_subsum(arr):
max_len = 1
arr_fst = arr[0]
for n in arr:
lower = 0
upper = 0
sum = arr_fst
while True:
if sum > n:
sum -= arr[lower]
lower += 1
elif sum < n:
upper += 1
sum += arr[upper]
else:
sum_len = upper - lower + 1
if sum_len > max_len:
max_len = sum_len
break
return max_len
Run Code Online (Sandbox Code Playgroud)
这max_subsum是一个部分函数;Python 列表可以为空。该算法适用于提供快速索引和静态类型算术的类 C 编译命令式语言。两者在 Python 中都相对昂贵。与您的算法非常相似的(完全定义的)算法,使用set数据类型进行更高效的通用量化,并避免 Python 的动态类型算术,可以更有效地解释:
def max_subsum(arr):
size = len(arr)
max_len = 0
arr_set = set(arr)
for i in range(size):
sum = 0
sum_len = 0
for j in range(i, size):
sum_mem = sum + arr[j]
if num_mem not in arr_set:
break
sum = sum_mem
sum_len += 1
if sum_len > max_len:
max_len = sum_len
return max_len
Run Code Online (Sandbox Code Playgroud)