Как я могу улучшить временную сложность этого кода?Как улучшить временную сложность этого кода?
$s = "Name";
for($i=0; $i<strlen($s); $i++) {
//some code
}
Как я могу улучшить временную сложность этого кода?Как улучшить временную сложность этого кода?
$s = "Name";
for($i=0; $i<strlen($s); $i++) {
//some code
}
Это зависит от реализации PHP строк и strlen()
. Если это O (n) (который находится в GNU C strlen()
), сложность кода OP будет O (n²). Перемещение strlen()
из петли улучшило бы к O (N), в данном случае:
$length = strlen($s);
for($i=0; $i<$length; $i++) {
//some code
}
Однако если сложность strlen()
представляет собой О (1) (e.g. C++), код в O (п), и вы больше не сможете его улучшить.
Я должен признать, что я не владеет C/C++, но я предполагаю, что длина простой атрибут zend_string
, т.е. PHP's strlen()
является O (1):
ZEND_FUNCTION(strlen)
{
zend_string *s;
// [..]
RETVAL_LONG(s->len);
}
Вы правы в том, что strlen() - это O (1) в ядре PHP. Перемещение вызова в strlen() из цикла не изменит сложность по времени, уменьшит только накладные расходы n вызовов функций на один вызов функции - это деталь реализации –
Это не так сложно, почему вы так думаете? – Mihai
Вы понимаете, что для цикла является самым быстрым из всех повторяющихся циклов? –
Извините, думал о javascript. Тем не менее, базовая для цикла все еще очень быстро. Вы выполняете микрооптимизации в этот момент –