2010-11-16 2 views
3

Я выполнял самую большую проблему с общим подпоследовательством в C. Я хочу сравнить время, затраченное на выполнение рекурсивной версии решения и версии динамического программирования. Как найти время, затрачиваемое на выполнение функции LCS в обеих версиях для различных входов? Также я могу использовать SciPy для построения этих значений на графике и определения временной сложности?Анализ временной сложности функции, написанной на языке C

Спасибо заранее,

Бритва

+0

Измерение прошедшего времени, чтобы определить временную сложность алгоритма опасен, так как она требует полного набора входных значений, в пределах не только по размеру, но также и в то числе pathalogical случаев, для того, чтобы дать хорошие результаты. Даже измеряя относительную сложность двух алгоритмов, вы должны удалить постоянное масштабирование и определить, имеют ли они подобные патологические случаи. –

ответ

3

Для второй части вашего вопроса: короткий ответ - да, вы можете. Вам нужно получить два набора данных (по одному для каждого решения) в формате, который удобно анализировать с помощью Python. Нечто подобное:

хугу

на каждую строку, где х длина последовательности, у этого время, необходимое динамическое растворем, г этого время, затраченное на рекурсивном раствор

Затем в Python :

# Load these from your data sets. 
sequence_lengths = ... 
recursive_times = ... 
dynamic_times = ... 

import matplotlib.pyplot as plt 
fig = plt.figure() 
ax = fig.add_subplot(111) 
p1 = ax.plot(sequence_lengths, recursive_times, 'r', linewidth=2) 
p2 = ax.plot(sequence_lengths, dynamic_times, 'b', linewidth=2) 

plt.xlabel('Sequence length') 
plt.ylabel('Time') 
plt.title('LCS timing') 
plt.grid(True) 
plt.show() 
2

Самый простой способ для учета времени процессора является использование функции clock() из time.h:

clock_t start, elapsed; 

start = clock(); 
run_test(); 
elapsed = clock() - start; 

printf("Elapsed clock cycles: %ld\n", (long)elapsed); 

Поскольку вы просто сравнение различных реализаций, вы дон Не нужно преобразовывать часы в единицы реального времени.

+0

Я пробовал это. Каждый раз, когда я выполняю функцию, я получаю истекшие тактовые циклы как 0. Есть ли способ увеличить точность прошедшего времени? – razor35

+0

@ razor35: Самый точный способ сделать это - перебрать функцию, которую нужно протестировать N раз, затем разделить результат на N (где N может быть, скажем, 1000000). – caf

2

Существуют различные способы сделать это. Один из простых заключается в том, чтобы найти некоторый код, который выполняет временные интервалы с высоким разрешением (микросекунда или меньше). Заверните вызовы к стартовому таймера и остановки таймера функции вокруг вызова функции ЛВП, а затем распечатать получившийся истекшее время:

#include "timer.h" 

Clock clk; 
char elapsed[32]; 

clk_start(&clk); 
lcs_recursive(); 
clk_stop(&clk); 
printf("Elapsed time (recursive): %s\n", 
     clk_elapsed_us(&clk, elapsed, sizeof(elapsed))); 

Аналогично для функции lcs_dynamic().

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

Я могу указать на представленный пакет.

Да, вы можете с уверенностью накормить результаты в виде графического пакета, такого как SciPy. Очевидно, вам придется параметризовать размер теста и время кода несколько раз при каждом размере.

+0

+1: Я в принципе сказал бы то же самое, за исключением того, что обычно предпочитаю использовать регистр циклов вместо таймера, как в этом вопросе: http://stackoverflow.com/questions/2786899/fastest-sort-of-fixed-length -6-INT-массив – kriss