繁体   English   中英

如何使循环更快?

[英]How can I make a loop faster?

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

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

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

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

数字代表温度,空值代表仪器不工作,空字符串代表两者都不工作(仪器正在工作,只是没有测量​​任何东西)。

由于是折线图,因此必须(在大多数情况下)连接点。

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

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

$limit = count($temperatures);
for ($i = 0; $i <= limit; $i++) {
    $next_is_number = false;
    if (is_null($temperatures[i]) {
        $gap = true;
    } else {
        for ($y = $i + 1; $i <= limit; $i++) {
            if (is_null($temperatures[$y]) {
                break;
            } elsif (is_numeric($temperatures[$y]) {
                $next_is_number = true;
                break;
            }
        }

        if ($next_is_number) {
           $gap = false;
        } else {
           $gap = true;
        }
    }      
}

我如何加快速度?

您的代码将检查折线图中某处是否存在缺口。

因此,一旦发现差距,就没有理由继续在外部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为真,则将保留外部for循环。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM