【问题标题】:Optimize 2D array code in Pascal在 Pascal 中优化二维数组代码
【发布时间】:2013-11-07 03:39:08
【问题描述】:

我有一个代码可以生成如下所示的二维数组

0      0      0      0      0     34     41     43     45      0
0      0      0      0     25     30     35     42     44      0
0      0      0     14     20     26     31     36     40      0
0      0      1      8     15     21     27     32     37      0
0      0      0      2      9     16     22     28     33      0
0      0      0      0      3     10     17     23     29      0
0      0      0      0      0      4     11     18     24      0
0      0      0      0      0      0      5     12     19      0
0      0      0      0      0      0      0      6     13      0
0      0      0      0      0      0      0      0      7      0

而生成数字的源码部分是

   j:=3;
   for i:=4 to 10 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
     j:=4;
   for i:=4 to 9 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
    j:=4;
   for i:=3 to 8 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
   j:=5;
   for i:=3 to 7 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
     j:=5;
   for i:=2 to 6 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
     j:=6;
   for i:=2 to 5 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
      j:=6;
   for i:=1 to 4 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
     j:=7;
   for i:=1 to 3 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
   j:=7;
   for i:=1 to 2 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
   j:=8;
   for i:=1 to 2 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
    j:=9;
   for i:=1 to 1 do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;

我需要优化代码并使其尽可能小并执行相同的功能。有没有办法做到这一点?

【问题讨论】:

  • 这样的事情往往是编译器特定的。如果性能在这里真的很重要,您可能需要尝试手动展开循环。
  • 我希望它被优化并且仍然有周期但更少。

标签: arrays optimization pascal multidimensional-array


【解决方案1】:

从您的陈述“我需要优化代码并使其尽可能小”,我假设您正在优化代码长度。 对不起,如果我遗漏了什么,但你可以定义一个函数,如

f(j,k,l)
begin
   for i:=k to l do
   begin
      ms[i,j]:=wrk;
        wrk:=wrk+1;
         j:=j+1
   end;
end;

它会让你的代码更小,你可以这样调用函数。

f(3,4,10);
f(4,4,9);
f(4,3,8);
...

请添加详细信息,我有一段时间没有使用 Pascal。 请注意,它不会使您的代码更高效,由于函数调用,程序会运行得更慢。

【讨论】:

  • 好的。事情就是这样。我有一个更大的代码,它在一个生成 0 的循环内有一个循环,而我的部分 here 我只需要在生成这样的模式的代码中制作一个部分。我认为它可能有太多的周期。所以我希望它仍然是一个循环,但以该模式生成数字。希望这可以帮助。如果您需要更多信息,我会告诉您。我不需要效率,但需要更少的代码。
  • 我认为按照我上面的建议是一个好的开始。然后,您将摆脱“for i:=4 to 10 do ...”块。之前的双for循环是初始化,之后的双for循环是输出。
  • 我刚刚优化了我自己here。问题是我不明白数字放在二维数组中的方式,但我知道正确的方式。但是感谢您的帮助。
  • 你确定你的优化程序和旧版本一样吗?
  • 它的做法不同,因为我发现的填充数组的方式必须看起来像给定最后一个代码。我提出的第一种方式是非常错误的。我没有正确地红化说明。现在它是正确的。我很确定。
猜你喜欢
  • 2018-04-08
  • 2020-06-09
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
相关资源
最近更新 更多