[英]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.