Неуверенный в своем анализе Big O

int RiskSort(int* PlayerA, int* PlayerB,int Length){
    int i,j;
    int Losses = 0;
    for(i=0;i<Length-Losses;i++){
         printf("%d,%d\n",PlayerA[i],PlayerB[i]);
        if(PlayerB[i]<PlayerA[i]){
                for(j=i;j<((Length-1)-Losses);j++){
                    Swap(&PlayerB[j],&PlayerB[j+1]);
                }
                i--;
                Losses++;
        }

    }
return Losses;

}

Я только что написал это и получаю O (n log n) в качестве ответа. Это домашнее задание, но часть Big O - это просто мой способ учебы.

Спасибо еще раз

Изменить: я получаю N из первого цикла for и количество проходов N-1-X в if, и я не уверен, как это обозначить, так как он ограничивает количество проходов, я назвал его log n (вероятно, неточно, но я не смог найти руководство, которое не смотрело код и не выбирало онлайн)

Изменить 2: просто пытаюсь сделать эту функцию более эффективной

int RiskSortB(int* PlayerA, int* PlayerB,int Length){
int i,j;
int Losses = 0;
for(i=0;i<Length-Losses;i++){
j=i+1;
if(PlayerB[i]<PlayerA[i])
    Losses++;

while(PlayerB[i]<PlayerA[i]&&j<Length){
    if(PlayerB[j]>=PlayerA[i]){
        Swap(&PlayerB[i],&PlayerB[j]);
        if(j!=(Length-Losses))
            Swap(&PlayerB[j],&PlayerB[Length-Losses]);
    }
    j++;
}


}

return Losses;
}

Итак, поскольку максимальное количество времени, в течение которого Swap вызывается для цикла for, равно 2, это означает, что его O (2N), но константы не имеют значения, поэтому его O (N) правильно?


person Joel Diaz    schedule 01.11.2015    source источник
comment
Как вы думаете, почему это O (n log n)? Отредактируйте свой вопрос, чтобы объяснить свои рассуждения.   -  person rob mayoff    schedule 01.11.2015
comment
Вложенный цикл for обычно, но не всегда, указывает на O(N-squared)   -  person selbie    schedule 01.11.2015
comment
Есть ли способ убедиться, что это O (N ^ 2) или нет?   -  person Joel Diaz    schedule 01.11.2015
comment
На первый взгляд, в лучшем случае это O(N), а в худшем - довольно близко к O(N^2), но на самом деле это будет быстрее. При ближайшем рассмотрении это выглядит как оптимизированная сортировка пузырьков   -  person smac89    schedule 01.11.2015


Ответы (1)


Предположим, что каждый элемент PlayerB вызывает «убытки». Для первого элемента вы выполняете замену длины-1. Для второго элемента вы выполняете замену длины-2. Для третьего элемента вы выполняете замену длины-3. И т.п.

Сколько всего свопов? Целых 1 + 2 + ... + (n-1). Когда вы увидите эту последовательность целых чисел, примените формулу Гаусса: сумма целых чисел 1..n = n * (n + 1) / 2 = (n 2 + n) / 2. О (n 2).

(Разница между суммой (1..n) и суммой (1 .. (n-1)) не влияет на большой О.)

person rob mayoff    schedule 01.11.2015
comment
Спасибо за поломку, это очень помогает! - person Joel Diaz; 01.11.2015