[英]Time/space complexity of string splitting/object creation in c++
我正在努力弄清楚我擁有的一段代碼的時間復雜度,該代碼從 1 行獲取用戶輸入,例如打開 1 0,並通過空格分割輸入,然后允許用戶創建一個新的“帳戶”object在堆上。 我認為這是一個 O(n^2) 操作,因為它包含 2 個 while 循環,加上一個額外的 function 調用,這可能是完全錯誤的。
int main(){
std::vector <std::string> parameters;
std::string userCommand;
// Make a new account manager object for a new user
AccountManager accounts = AccountManager();
while (userCommand != "exit"){
parameters.clear(); // Clear ready for next command
std::cout << std::endl << ">>> ";
std::getline(std::cin, userCommand);
char* cstr = new char[userCommand.length() + 1];
strcpy(cstr, userCommand.c_str());
char* token;
token = strtok(cstr, " ");
while (token != nullptr){
parameters.push_back(token);
token = strtok(nullptr, " ");
}
// This calls a function that creates a creates a new object on the heap
accounts.openAccount(parameters[1], parameters[2]);
}
}
復雜度在空間和時間上的用戶輸入總長度是線性的。
所有單獨的操作僅在恆定的時間內迭代用戶輸入,包括內部循環。 因此,在用戶輸入時間的總長度為n
的情況下,時間復雜度為Theta(n)
。
同樣,memory 僅用於存儲用戶輸入長度的恆定倍數,這意味着Theta(n)
空間復雜度。
這是假設您沒有詳細說明的AccountManager
操作不占主導地位。
假設n
是用戶提交輸入的次數。
時間復雜度:
對於每個n
我們都在迭代多個參數,我們稱它們為m
,但是在上面提供的示例代碼中,您似乎只期望兩個參數,這意味着這里的迭代始終是恆定的。 如果參數的數量是變化的和/或增加時間復雜度將是O(n*m)
,但如果m = 2
, O(2*n)
變為O(n)
線性時間。
空間復雜度:
對於每個用戶輸入n
我們正在創建一個新account
,從提供的代碼中如何創建或存儲新帳戶是不明確的,但很明顯,對於每個用戶輸入我們創建一個新account
,這意味着這里的空間復雜度也是O(n)
。 所有其他變量的空間復雜度都是恆定的,因此不會影響整體空間復雜度。
注意: openAccount
方法可以使用數據結構存儲帳戶,具體取決於哪個數據結構,時間復雜度會受到影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.