【发布时间】:2012-05-09 17:55:50
【问题描述】:
我已经用PHP编程很长时间了,由于我不是来自计算机科学/数学背景的我对Big O符号只有一个基本的了解,所以我拿了一个函数并尝试了改进它并在大 O 中表达它们:
示例 1
function foo($j) {
$ids = array();
while (count($ids) < $j) {
$id = gen_id(); // assume this function will return you an integer
if (!in_array($id, $ids)) {
$ids[] = $id;
}
}
return $ids;
}
我将通过删除count($ids) 的while 循环并替换为forloop 来改进此功能,这样count($ids) 就不必在循环中每次都进行评估,并将is_array 替换为@ 987654327@ 并将值移动到键(isset 比 in_array 快)
示例 2 - 改进
function foo($j) {
$ids = array();
for($i = 1; $i<= $j; ++$j) {
$id = gen_id(); // assume this function will return you an integer
if (!isset($ids[$id])) {
$ids[$id] = true;
}
else {
--$i;
}
}
return $ids;
}
我会用以下大 O 表示法来表达上述函数:
示例 1: O(n^2),示例 2: O(n)
我的符号正确吗?是否还有更好的方法来执行相同的功能?
提前致谢!
【问题讨论】:
-
首先,你确定这个方法首先需要优化吗?其次,两者的正确表示法是
O(n)(常量因子与大 O 表示法无关)。 -
您可能指的是第二个
for循环中的++$i。 -
是的,它应该是 $i.. 但是 --$i;
-
@Lizard 我以更简洁的方式重写了您的函数并将其发布为答案。我认为您无法获得比我的答案更有效的结果。
:) -
谢谢!现在这真的很有意义!
标签: php performance optimization big-o