Большой O: общая производительность `IterateArray` O (n) или O (n log n)? - PullRequest
4 голосов
/ 09 июля 2009

Если у меня есть следующий код:

IterateArray(object[] array)
{
    for(int i=0; i<array.length; i++)
    {
        Dosomething(array[i]);
    }
}

и временная производительность метода Dosomething(object) равна O (log n), является ли общая производительность IterateArray O (n) или O (n log n)?

Ответы [ 5 ]

14 голосов
/ 09 июля 2009

Короткий и несколько неправильный ответ: O (n log n).

Длинный ответ: правильнее было бы написать его как O (n log m ).

Если DoSomething действительно НЕ зависит от всего массива, похоже, что он работает на одном элементе. Таким образом, мы различаем это отдельно, используя «м».

12 голосов
/ 09 июля 2009

Это будет O (n log n)

Вы выполняете операцию производительности O (log n) n раз, и умножение выполняется с Big O, поэтому O (n) * O (log n) = O (n log n)

Важно отметить, что на самом деле не должно быть никакого различия между m и n, если вы смотрите на два массива разных размеров. Причина в том, что m и n являются обеими константами, и они асимптотически эквивалентны, если вы построите график их темпов роста.

10 голосов
/ 09 июля 2009

O (n log n)

Подумайте об этом - вы выполняете операцию записи n раз.

4 голосов
/ 09 июля 2009

Для каждого из ваших m объектов, если производительность DoSomething () равна O (log n), то общая производительность по всем вашим m объектам будет равна O (m log n).

1 голос
/ 09 июля 2009

Поскольку цикл for повторяется n (скажем, длина массива n) раз, и в каждой итерации выполняется «Dosomething», общая производительность будет O (n logn).

ура

...