这些算法表示之间的区别?

时间:2019-01-17 01:15:15

标签: algorithm

最近,我一直在研究算法分析,在我的课堂上,我已经看到像这样的代码来代表示例算法:

z = 0
for x = 1; x <= n; x++ do
  for y = 1; y <= n; y++ do
    z = z + 1
  end for
end for

我理解这些for循环可以理解为“只要x / y等于或小于n,请执行以下操作,并在每个循环结束时将x / y加1,然后再次测试条件”。但是,在诸如算法设计手册之类的一些书中,我看到的是这样的东西:

r:= 0
for i:= 1 to n do
  for j:= 1 to i do
    for k:= j to i + j do
      r:= r + 1
return (r)

从本质上讲,它与我提供的第一个示例相同吗?或者它表示不同吗?我也感到矛盾的是,在第二个示例中,没有像x++这样的增量,因此循环在一定数量的循环后停止。还有为什么为什么要声明k:= j而不是简单地k:= 1,因为在此算法中j = 1?

澄清:我并不是要问它们在产生相同输出的意义上是否做同样的事情,而是要问它们中的for循环是否与在n的值等于1之后停止工作相同?例如,在每个周期后将1加到变量i上,则匹配(如第一个示例中对x或y所做的操作)。

2 个答案:

答案 0 :(得分:1)

您的第一个算法似乎使用的是类似C的符号,其中指定了起始状态,进行的条件以及每次迭代后如何更新状态。

第二个似乎使用基于在指定范围内迭代的循环:“对于此范围内的每个值,请执行以下操作……”。这在现代脚本语言(例如Python或Ruby)中相当普遍,并且可以说更接近人们对迭代的看法。


任何一种算法都可以使用另一种符号表示。

算法1 /样式2

z := 0
for x := 1 to n do
  for y:= 1 to n do
    z := z + 1
return(z)       # I’m assuming you actually wanted a return value

算法2 /样式1

r = 0
for i = 1; i <= n; i++ do
  for j = 1; j <= i; j++ do
    for k = j; k <= i + j; k++ do
      r = r + 1
    end for
  end for
end for
return(r)

使用一种或另一种样式粘贴,您会发现计数的差异并不是因为伪代码样式不同。这些是不同的算法。

答案 1 :(得分:0)

第二个与第一个并不完全相同。 我读了

for i;= 1 to n do 

因为 1到n

for i = 1; i <= n; i += 1

在每个j循环中,k从j开始。所以k仅在第一个从1开始 每个i循环的j循环。

虽然第一种算法可以想象成行和列,而第二种却不是。

function a1(n) {
  console.clear();
  console.log('algorithm 1');
  console.log('n = ' + n);
  console.log('x | y | z');
  var x, y, z = 0;
  var tr, td;
  
  for (x = 1; x <= n; x += 1) {
    tr = document.createElement('tr');
    for (y = 1; y <= n; y++) {
      td = document.createElement('td');
      z = z + 1;
      console.log(x + ' | ' + y + ' | ' + z);
      tr.appendChild(td);
      td.innerHTML = z;
    }
    tbl1.appendChild(tr);
  }
}

function a2(n) {
var i, j, k, r = 0;
  console.clear();
  console.log('algorithm 2');
  console.log('n = ' + n);
  console.log('i | j | k |i+j| r')
for (i = 1; i <= n; i += 1) {
  for (j = 1; j <= i; j += 1) {
    for (k = j; k <= (i + j); k += 1) {
      r = r + 1;
      console.log(i+ ' | ' + j + ' | ' + k + ' | ' + (i+j) + ' | ' + r);
    }
  }
}
return (r);
}

// output table 1 handle
var tbl1 = document.getElementById('output1');

// Event handlers for buttons a1 and a2
document.getElementById("a1_start").addEventListener("click", function(){
  a1(5);
});
document.getElementById("a2_start").addEventListener("click", function(){
  console.log('returns ' + a2(4));
});
td {
  text-align: center;
  border: solid 1px #000;
}
<button id="a1_start">
  start algorithm 1
</button>
 
<button id="a2_start">
  start algorithm 2
</button>
<table id="output1">
</table>