使用指针计算堆栈问题的大 O 表示法

Calculating Big O notation for stack problem using pointer

本文关键字:表示 问题 指针 计算 堆栈      更新时间:2023-10-16

嗨,谁能帮我使用 Big O 表示法计算此代码的算法复杂性?我对使用 Big O 不太了解,因为此代码中有很多指针。我只知道一些代码。像cout是O(1(。其余的我不明白。我只是编程的初学者。请帮我数一数大o符号。谢谢。

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
class Book {
int year, page;
unsigned long long int code;
string language, name, title;
Book *head, *next, *prev, *link;
public:
Book (string & name, string & title, unsigned long long int code, string & language, int year, int page) {
head = NULL;
this->name = name;
this->title = title;
this->language = language;
this->code = code;
this->year = year;
this->page = page;
}
~Book (void) {
delete head;
}
void display (void);
void add (void);
void dellete (void);
};
void Book::add(void) {
string name, title, language;
int year, page;
unsigned long long int code;
cout << "Add a book...";
cout << endl << "Authortt:", cin >> name;
cout << "Titlett:", cin >> title;
cout << "ISBN(13 digits)t:", cin >> code;
cout << "Languaget:", cin >> language;
cout << "Yeartt:", cin >> year;
cout << "Pagestt:", cin >> page;
Book* p = new Book(name, title, code, language, year, page);
p->next = head;
head = p;
}
void Book::dellete(void) {
string name, title, language;
int year, page;
unsigned long long int code;
Book* p, *prev, *next;
if(head==NULL) {
cout << "There is no book in the stackn";
} else if(head->next==NULL) {
p = head;
head = NULL;
free(p);
cout << "All book has been taken. Now the stack is emptyn";
} else{
p = head;
head = p->next;
free(p);
cout << "A book has been takenn";
}
}
void Book::display(void) {
Book* p = head;
cout << "Displaying book(s)...n";
while (p) {
cout << "----------------------------- n";
cout << "Authortt:" << p->name << endl;
cout << "Titlett:" << p->title << endl;
cout << "ISBNtt:" << p->code << endl;
cout << "Languaget:" << p->language << endl;
cout << "Yeartt:" << p->year << endl;
cout << "Pagestt:" << p->page << endl;
cout << endl;
p = p->next;
}
}
int main (int argc, char const** argv) {
string blank = "";
Book* B = new Book(blank, blank, 0, blank, 0, 0);
int opt;
for (;;) {
cout << "----------------------------- n";
cout << "1) Add a book.n";
cout << "2) Show all books.n";
cout << "3) Take a bookn";
cout << "4) Exit. n";
cout << "Don't use space but use underscore...nn";
cout << "Options:", cin >> opt;
switch (opt) {
case 1:
B->add();
break;
case 2:
B->display();
break;
case 3:
B->dellete();
break;
case 4:
exit(0);
default:
continue;
}
}
return 0;
}

O-Notation根据问题的大小对算法的复杂程度(例如运行时或内存使用(对算法进行分类。所以O(1(意味着无论问题有多大,算法的复杂性都不会增加,无论这个恒定成本有多大。

让我们看一下您的一些程序部分。

删除

它的运行时复杂度为O(1(,因为无论 Books 堆栈有多大,它始终与您删除书籍堆栈顶部的操作量几乎相同。唯一的区别是 0、1 和 2 本书,但如果你将堆栈增加到无穷大,操作量就不会增长,这才是最重要的。

这里很难衡量。由于此方法一次只添加 1 本书,因此它是O(1(,因为无论已经有多少本书(它是唯一的可变大小(,您始终需要相同数量的操作。如果您允许一次添加多本书,那会更有趣。

显示

因此,显示屏会打印出书堆上的所有书籍。如果您增加书籍数量,则操作数量也会出现。现在的问题是以什么方式?在这种情况下,书籍数量加倍会使指令数量加倍。这是一个线性增长,因此复杂度类为O(n(。


查看循环计数可能会有所帮助。问题大小上的一个循环通常意味着 O(n(。如果你有两个嵌套循环(超过问题大小(,你通常会有O(n²(等等。

对于您的问题,main函数中的无限循环是什么,这取决于您定义的问题大小,我不知道在这里测量它是否有意义。

如果将用户操作的总数量定义为问题大小,则会变得复杂。如果我们放出显示部分并且只允许添加和删除,它是 O(n(,因为一切都是恒定的(因为添加和删除是 O(1(,其他东西是独立的指令,如 cout(,并且它们基于问题大小 n(用户操作的数量(在循环中发生。如果考虑到显示,它并不那么简单,因为显示具有O(m(复杂性(m =书籍数量(,这在很大程度上取决于之前给出的实际用户输入。我不知道那里会有多复杂。