簡體   English   中英

在C ++中復制變量的復雜性是什么

[英]What is the complexity of copying a variable in C++

我的一個朋友說,位掩碼比位集更好,因為復制位集需要O(N)時間,而復制位掩碼只需要O(1)時間,因此對於動態編程等應用程序來說,它要快得多。 所以我想知道所有其他數據類型是否相同?

例如,此代碼塊的復雜性是什么?

vector <int> vec1 = {1,2,3,4,5,6,7,8,9,10};
vector <int> vec2 = vec1;

如果是O(N),為什么會這樣呢? 不應該像做某件事一樣是O(1)

int x = 530210;
int y = x;

將會?

您有vec1 ,這是此卡車代表的std::vector<T> ,其拖車上連接了黑色容器

在此處輸入圖片說明

(來源:bigcommerce.com)

現在,它的黑色容器中有數百萬篇論文(由black-container提供std::vector<T>對元素的存儲)。 現在,您想將紙張復印到另一個類似的載體vec2 你怎么能做到最好? 影印的復雜度是多少? 將會是O(論文數量)


現在,假設您要移動內容...所有std::vector需要做的就是從卡車上拆下其黑色容器 ,並將其連接到另一輛卡車上。...這會使容器的移動復雜度變為O (1)

要了解操作的復雜性,首先必須定義您的計算模型。 特別是,您必須定義哪些操作是O(1)以及哪些操作是免費的。

例如,如果您正在查看需要大量硬盤訪問的程序,則只會考慮從磁盤讀取一個塊作為一項操作,而對內存的訪問則是免費的。

在位掩碼和位集的示例中,您可能正在計算內存塊復制操作。 然后,復制適合一個內存塊的位掩碼僅花費一份內存副本。 但是,在此模型中,復制位掩碼仍然為O(N),因為大的位掩碼將跨越許多存儲塊。 更准確地說,如果b是一個內存塊中的位數,而N是位掩碼中的位數,那么您需要ceil(N / b)存儲塊復制操作來復制位掩碼。

復制長度為N的向量的方法有幾種:

  • O(1)向量復制操作
  • O(N)元素復制操作
  • 如果元素復制操作為O(T) ,則為O(NT)個度量單位

順便說一句,您的朋友關於bitset是錯誤的,否則您會誤解。 的優點bitset是數據結構被優化以利用並行執行的低水平的形式,可以由單個線程來完成的優點-即64位整數運算可以用來在64個不同的位同時工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM