Я давно занимаюсь программированием на PHP, и, поскольку я не являюсь специалистом по информатике / математике, у меня есть только базовое понимание нотации Big O
, поэтому я взял функцию и попробовал улучшить его и выразить их обоих в Big 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;
}
Я бы улучшил эту функцию, удалив цикл while для count($ids)
и заменив его на for
, так что count($ids)
не нужно оценивать каждый раз в цикле, а также заменив is_array
на isset
и переместить значения в клавиши (isse
t быстрее, чем 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;
}
Я бы выразил вышеперечисленные функции в следующих обозначениях Big O:
Пример 1: O (n ^ 2), Пример 2: O (n)
Я прав в своих примечаниях? Есть ли лучший способ сделать ту же функцию?
Заранее спасибо!