簡體   English   中英

大型數據集的向量的替代方案? C ++

[英]Alternative to vectors for large data sets? C++

我正在尋找一個保存數據的數據結構,以便其插入(如矢量)需要保存數百萬個無符號長整型。 關鍵是它需要比O(logn)更好的查找,因為它將針對相同大小的相似向量進行搜索。 是否存在這樣的東西?

如果插入10、20、30,然后遍歷該集合,則需要保證10、20、30的順序。我的數據是一個字符串,我將其轉換為無符號長整數以減少內存使用,這是可逆解碼的。

編輯:由於人們在問,我正在將兩個向量相互比較(兩者的大小都很大)以得到差異。

小例子:

vector 1: 10 20 30 40 50 60

vector 2: 11 24 30 40 55 70 90

result:   30 40

我從來沒有親自使用過它,與最近的C ++版本功能(最新更新是2011年)相比,它可能已經過時了,但是STXXL的意思是一組為大量數據構建的容器和算法。 它可能適合您的需求。

STXXL的核心是用於外部存儲器(核外)計算的C ++標准模板庫STL的實現,即STXXL實現了可以處理僅容納在磁盤上的大量數據的容器和算法。 盡管與STL的緊密關系支持易用性和與現有應用程序的兼容性,但另一個設計優先級是高性能。

STXXL的主要功能是:

  • 透明支持並行磁盤。 該庫提供了基本並行磁盤算法的實現。 STXXL是唯一支持並行磁盤的外部存儲器算法庫。
  • 該庫能夠處理非常大的問題(經測試可達數十兆字節)。
  • 提高了計算機資源的利用率。 外部存儲器算法和數據結構的STXXL實現受益於I / O和計算的重疊。
  • I / O量中的常數常數較小。 通過在算法組件之間傳輸數據,而不是將它們臨時存儲在磁盤上,獨特的庫功能稱為“流水線化”,可以節省一半以上的I / O。 開發分支支持算法組件的異步執行,從而實現高級任務並行性。
  • 由於外部存儲器算法和數據結構的眾所周知的STL兼容接口,縮短了開發時間。
  • STL算法可以直接應用於STXXL容器; 此外,在大多數情況下,算法的I / O復雜度仍保持最佳狀態。

對於內部計算,可以選擇使用來自MCSTL或libstdc ++並行模式的並行算法,從而使該算法固有地受益於多核並行性。

哈希映射是一種比排序向量更快查找的方式。 您必須具有c ++ 11支持才能使用它。
http://www.cplusplus.com/reference/unordered_map/unordered_map/
要保留數據的順序,唯一的方法是在其旁邊還保存一個存儲int的向量
在開始使用它之前,您應該考慮如何使用此數據結構(訪問模式)。 還請考慮您將要獲得的數據。
這是同一件事的boost版本http://www.boost.org/doc/libs/1_53_0/doc/html/unordered.html

我認為您應該使用的是unordered_map以及訂單的雙向鏈接列表。

因此,每次將新項目添加到數據庫時,都應先將其添加到鏈接列表的開頭(或末尾),然后再將其添加到哈希表,其中鍵是值(unsigned int)和“ value” “(來自鍵/值對)是指向鏈接列表中對象的指針。 因此,現在,如果要快速查找,可以在哈希圖中查找,如果要按順序進行迭代,則可以使用鏈接列表。 當然,當您要刪除一個對象時,必須同時將它們都刪除,但是從復雜性角度講,它是相同的(O(1)攤銷所有內容)。

與僅使用哈希圖相比,這無疑將使您的內存增加2或3。

暫無
暫無

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

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