簡體   English   中英

比較std :: vector或std :: set的時間復雜度-更有效嗎?

[英]Comparing std::vector or std::set in this case for time complexity - More efficent?

我目前有一個返回字符串的函數。 我需要跟蹤這些返回的字符串,如果未對返回的字符串執行操作,則必須對其執行操作。

我的第一個想法是使用向量(即)std :: vector。

這是利用向量的機制的樣子

1-使用std :: find檢查矢量中是否存在項目

std::find(vector.begin(), vector.end(), item)!=vector.end()

2-如果項目不存在,請執行push_back(攤余常量)並對其執行操作,否則忽略字符串

我的第二個想法是使用std :: set

1-如果不插入項目,則通過執行插入功能檢查項目是否存在

 if(set.insert(somestring).second)
    {
      //Item inserted in set and it did not exist

    }

set中插入的時間復雜度為O(logn) vector的push_back是Amortized常數,如果不對向量進行排序(在這種情況下不是),std :: find將為O(n)。 我的假設正確嗎,為了獲得最大的效率,我應該在此處使用一個集合? 有什么我可能會想念的嗎?

我曾經在銀行的外匯定價系統上工作。 表現令我們非常感興趣。 過去,我們對最佳算法進行了長時間的討論……然后,有一天,我們使用性能分析工具測量了性能……。我們發現實際算法消耗了5%的處理時間。 剩余的95%用於在系統接收消息總線或從消息總線發送消息時將字符串轉換為雙精度型和雙精度轉換為字符串。

我為什么要寫這個? 僅為了說明這一點,在幾乎所有情況下,容器的選擇可能都不重要。 您的程序不太可能花費大量時間來查找地圖,集合或向量中的項目。

使用容易理解的算法和自然適合設計的容器(最適合需要設計的容器和映射,用於常規存儲的向量,無序集合和映射(如果需要的話),以最優雅,可維護的方式編寫代碼。非常重要,您的數據集也很大)。 如果您需要在同一數據上使用多個有序索引,則可能是一個向量,用於存儲帶有索引的迭代器/指針集(例如數據庫)。

然后,當它完成時,如果您的用戶大聲疾呼您它太慢了(他們不會-他們更關心它是否可靠地工作),請配置代碼並衡量瓶頸。 它們幾乎總是位於I / O中。

如果在極不可能的情況下您的代碼花了90%的時間來管理數據收集,那么該是時候重新考慮算法了,因為設計可能效率低下-或者您正在編寫蛋白質折疊模擬器。

如果您確定設計是最佳的,那么也許是時候重新考慮容器的類型了。

從根本上講,只有3種類型-您可以通過反復試驗找到最佳解決方案,而無需花很多時間來爭論它。

:-)

暫無
暫無

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

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