完成算法所需的步骤数

时间:2015-07-31 09:22:37

标签: algorithm matlab

所以小伙子们,我已经问了一个关于如何开发算法的问题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步骤中完成。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

您的陈述中存在矛盾:您说您的算法在x * (x - 1) / 2x = 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的另一种方式,就是为了得到你所说的那个条件,就是这样处理:

  • 对于L的每个值,检查列表L中是否有值(L-N)(使用命令查找列表中的值,这将返回列表中的位置)
  • 如果该值存在,请将该位置放在新表中。

您应该可以使用一个for获得相同的结果。