Что такое нотация Big O? Вы используете его?

Обозначение Big O обозначает big-o ограничивающий фактор алгоритма. Это big-o упрощенное выражение того, как optimizations время выполнения алгоритма optimizations масштабируется по отношению optimizer к входным данным.

Например o-notation (в Java):

/** Takes an array of strings and concatenates them
  * This is a silly way of doing things but it gets the 
  * point across hopefully
  * @param strings the array of strings to concatenate
  * @returns a string that is a result of the concatenation of all the strings
  *          in the array
  */
public static String badConcat(String[] Strings){
    String totalString = "";
    for(String s : strings) {
        for(int i = 0; i < s.length(); i++){
            totalString += s.charAt(i);
        }
    }
    return totalString;
}

Теперь подумайте, что big-o это на самом деле делает. Он optimisation просматривает каждый введенный optimizer символ и складывает их вместе. Это complexity кажется простым. Проблема complexity в том, что String неизменна. Поэтому каждый optimisation раз, когда вы добавляете complexity-theory букву в строку, вы должны optimization создавать новую строку. Для asymptotic-complexity этого вам нужно скопировать optimization значения из старой строки optimizing в новую строку и добавить big-theta новый символ.

Это означает, что asymptotic-complexity вы будете копировать первую optimisation букву n раз, где n — количество optimize символов во вводе. Вы будете optimize копировать персонажа n-1 раз, всего big-o будет (n-1)(n/2) копий.

Это (n^2-n)/2, и для optimizing нотации Big O мы используем optimizer только самый высокий коэффициент optimizations величины (обычно) и опускаем asymptotic-complexity любые константы, которые optimization умножаются на него, и мы asymptotic-complexity получаем O(n^2).

Использование чего-то complexity вроде StringBuilder будет соответствовать optimizer строкам O(nLog(n)). Если big-theta вы подсчитаете количество optimizing символов в начале и установите optimizing вместимость StringBuilder, вы можете получить o-notation O(n).

Таким образом, если бы у big-o нас было 1000 символов ввода, первый complexity-theory пример выполнил бы примерно optimization миллион операций, StringBuilder выполнил optimisation бы 10 000, а StringBuilder с setCapacity выполнил optimize бы 1000 операций, чтобы сделать optimizations то же самое. Это приблизительная optimizer оценка, но обозначение O(n) относится complexity-theory к порядкам величин, а не complexity к точному времени выполнения.

Я big-theta не использую его регулярно. Однако complexity-theory я постоянно думаю об этом, когда o-notation пытаюсь найти лучший алгоритм optimizing для чего-то.

optimization

complexity-theory

big-o

2022-04-11T06:06:36+00:00