Confouse о Big-O нотации для этого исходного кода
Может ли кто-нибудь помочь мне подсчитать алгоритмическую сложность моего исходного кода, используя обозначение Big-O? Эта программа предназначена для помещения NIM(студенческого идентификационного номера) в стек. Я до сих пор не знаю, как считать это особенно в if else
, а также for
, И это switch case
функция сложность O(1)? Я просто новый программист. И мой лектор не дал четкого объяснения этому материалу. Пожалуйста, помогите мне Спасибо
#include <stdio.h>
#define MAX 800
int top;
//PUSH function
void push (int stack [], int item)
{
if (top == (MAX-1))
printf("\nStack is empty\n");
else
{
++top;
stack [top] = item;
}
}
//POP function
int pop (int stack[])
{
int ret;
if (top == -1)
{
ret = 0;
} else {
ret = stack [top];
--top;
}
return;
}
//Display function
void display (int stack[])
{ int i;
if (top == -1){
printf ("\nStack is empty\n\n");
} else {
for (i=top; i>=0; --i)
printf ("Value = %3d \n", stack[i]);
printf("________________________________\n");
}
printf ("\n");
}
//Main Program
int main()
{
int stack[MAX], item;
int choice;
top = -1;
do
{
do
{
printf ("___Main Menu___\n");
printf ("1.Enter NIM\n");
printf ("2.Delete NIM from top\n");
printf ("3.How to use\n");
printf ("4.Exit\n");
printf ("Choice: ");
scanf ("%d", &choice);
if (choice<1 || choice>3)
printf ("\nYour choice is wrong. Please input 1-3!.\n\n");
} while (choice<1 || choice>3);
switch (choice)
{
case 1:
printf ("\nEntered value : ");
scanf ("%d", &item);
push (stack, item);
display (stack);
break;
case 2:
item = pop (stack);
if(item == 0){
printf("\nStack is empty\n\n");
} else {
display (stack);
}
break;
case 3:
printf("\nThis is a program to input NIM\n");
printf("for the answer sheet");
default:
printf ("\nThanks for using this program :)");
}
} while(choice != 3);
return 0;
}
1 ответ
Сложность алгоритма - это мера того, как время выполнения алгоритма изменяется в зависимости от его входного размера, когда этот входной размер становится большим. Поскольку мы заботимся только о том, когда входной размер становится большим, а точные константы времени выполнения будут различаться на разных платформах, мы рассматриваем только ведущие термины и игнорируем константы. Поскольку мы измеряем, как изменяется время выполнения алгоритма с его входными данными, нам необходимо определить, какой у нас ввод. Нет смысла измерять это для main
, поскольку его время выполнения зависит от точного ввода, давая очень разное поведение для разных входных данных. Было бы целесообразно взглянуть на сложность push
, pop
, а также display
по отдельности. Я буду только смотреть на display
функция, оставляя других для вас, как учебное упражнение.
top == -1
операторы check и print выполняются в одно и то же время независимо от размера стека. В случае, если эта проверка не удалась (что происходит для непустого стека), тогда тело for
цикл запускается один раз для каждого элемента стека. Доступ к элементу стека из памяти и печать его значения требует постоянного времени. Принимая n за размер стека, время выполнения T(n) определяется как (приблизительно) c1 + c2 * n, где c1 и c2 - это константы, которые зависят от вашей платформы. В обозначениях big-O O(c1 + c2 * n) = O(n).