如何使循环更快?

时间:2019-06-29 07:01:56

标签: php arrays performance loops line

我有一个代表折线图上点的值的数组:

$temperatures = [23, 24, null, '', 25, '', '', null];

我正在使用PHP4,但我认为可以用任何语言回答。

数组仅包含数字,空值和空字符串。

数字代表温度,空值代表仪器不工作,空字符串则不代表(仪器在工作,只是不测量任何东西)。

在大多数情况下,必须连接点,因为它是折线图。

我有一个变量$gap,它对应于每个点,并告诉该点是否连接到下一个点。如果将其设置为true,则不连接点(否则为false)。例如,temperatures[0]的$ gap必须设置为false,因为该线是在temperatures[0]和temperature [1] (they are both valid temperatures). $gap for temperatures [1] {{1}之间绘制的} temperatures [2]`必须为true,因为后面没有空。依此类推。

当为空时,$ gap绝对为and。对于数字和空字符串,取决于:如果后面为null,则差为true;否则为false。如果后面跟随数字,则差值为假。如果后面跟着空字符串,则必须检查之后是否为空或数字,并相应地应用前面的句子。如果紧随其后的是空字符串,则gap为true。这是我的代码,运行速度太慢,但是产生了正确的结果:

true

我如何加快速度?

2 个答案:

答案 0 :(得分:1)

您的代码检查您的折线图中是否存在间隙。

因此,一旦发现差距,就没有理由在外部for循环中继续。想象一下一个包含1000个值的图表,如果前两个值之间存在间隙,那么继续检查其他998个值就没有意义。

因此,我建议的第一件事是在开始时设置$ gap = false,并在$ gap为true时退出循环。您可以使用

1。)休息(不太优雅),

2。)将代码提取到方法中,并添加一个返回语句或

3。)在for循环中添加条件。我对php不熟悉,但是在大多数语言中都可以这样做:

     $gap = false;
     $limit = count($temperatures);
     for ($i = 0; $i <= limit && !$gap; $i++) {

     [...]

因此,一旦$ gap为true,则将保留外部for循环。

答案 1 :(得分:0)

向后迭代,记住最后一个有效值,并在看到空字符串时将其放入。那么这是O(n)最坏的情况,而不是O(n ^ 2)。

或者,在内循环之后,您可以从$y - 1$x(反之亦然)工作,设置间隙数组的值/输出值,然后跳过所有已完成的操作刚完成($x = $y)。这也是O(n)。

然后,一旦您尽可能快地掌握了算法,就可以抛弃PHP并用Rust或C之类的语言编写它。(我不记得该语言中的任何真实数组,因此它们总是会很慢。)