所以小伙子们,我已经问了一个关于如何开发算法的问题here。
经过审核的代码如下所示:(请注意,我将向量L中的元素全部相等,以便最大化程序的迭代次数)
SELECT id,name,CONCAT(name,id*100) AS username FROM userstable;
L = [2 2 2 2 2 2 2 2 2];
N = 3;
sumToN = [0 0];
Ret = [0 0];
k = 0;
for i=1:numel(L)-1;
for j=i+1:numel(L);
if L(i)+L(j) == N
sumToN = [L(i) L(j)];
display(sumToN);
return
end
k=k+1
end
end
display(sumToN);
变量用于保持迭代次数。计算算法步数的函数为k
,(1/2)(x-1)x
等于向量x
中的元素数。问题是,练习要求我确保算法最多L
完成一些不依赖于c*numel(L)
的正常c
。此外,我需要解释为什么此实现最多只能在L
步骤中完成。
我该怎么做?
答案 0 :(得分:0)
您的陈述中存在矛盾:您说您的算法在x * (x - 1) / 2
(x = numel(L)
)中完成,并且您希望证明您的算法在c * x
中完成(其中{{ 1}}是常数)。这是不可能的!
我们假设有c
,例如c1
,这意味着x * (x - 1) / 2 <= c1 * x
必须小于x
,所以如果我采用2 * c1 + 1
,则不等式不再适用,所以x = 3 * c1
没有c
,例如x * (x - 1) / 2 <= c * x
。
以下是一种适用于x
的已排序数组的算法(来自您之前的问题):
O(x)
基本上,你从第一个(最小的)值和最后一个(更大的)值开始,只要你的两个索引没有交叉,你就会向数组i = 1
j = length (L)
while i < j
if L(i) + L(j) == N
sumToN = [L(i) L(j)];
break
elseif L(i) + L(j) < N
i = i + 1;
elseif L(i) + L(j) > N
j = j - 1;
end
end
的中间移动。
答案 1 :(得分:0)
我认为你只能有一个for
的另一种方式,就是为了得到你所说的那个条件,就是这样处理:
您应该可以使用一个for
获得相同的结果。