2013-06-06 3 views
0

Поэтому у меня есть алгоритм, который идет как это:Сложность этого алгоритма

for i=0:360 

C... 

for j=0:a_j[i] 

    C... 

    for t=0:a_t[i][j] 

    C... 
    end 
end 
end 

Так что есть три петли, но обе внутренние циклы зависят от величины внешних контуров. Как я могу измерить сложность записи Big O?

Также, если у меня есть привязки памяти между этими циклами? Они считаются Cs?

+4

Невозможно сказать, потому что мы не знаем, что такое 'a_j' и' a_t'. –

+0

Если это в основном «для i = от 0 до 360; для j = 0 - i; для t = 0 до j; ', тогда сложность - это« O (n^3) ». –

+0

@OliCharlesworth Ну ... я думаю, они массивы. –

ответ

3

Вы ничего не говорите о остальной части кода, поэтому, полагая, что остальные являются примитивными операциями постоянной сложности.

Если записи из двух массивов меньше постоянного значения, то сложность O(1) - обработка не зависит от какого-либо значения, введенного вне вашего кода. Если они являются функциями входной переменной, то сложность зависит от функций, которые они обрабатывают в этих массивах, и в этом случае вы должны быть более конкретными.

+0

Хорошо, я понял. Массивы зависят от входной переменной. Внутри самого внутреннего массива выполняется много операций. Например, сумма всех значений t в результате [i] [j] и некоторые другие подобные. – Atirag

+2

Вы должны быть конкретными, что есть те, кто работает. Зависит все еще. – ashley

1

Я не уверен, что именно a_j и a_t - это точно. Если a_j и a_t - константа, то сложность O(1). Если a_j и a_t - это n, что может означать входные переменные, то мы должны вычислить сложность.

Одним словом, сложность этой программы определяется путем определения a_j и a_t.

В любом случае, я могу вычислить, сколько циклов выполняет ваша программа.

Вот код, написанный на питоне:

ret = 0 
for i, v in a_j: 
    ret += v * sum(a_t[i]) 
if not ret: ret = 1 
ret *= 360 

Надеется, что это помогает.

Смежные вопросы