簡體   English   中英

C ++ Map:需要智能算法

[英]C++ Map : Smart algorithm needed

我有3個檔案。 F1,F2,F3。 F1是具有200K條目的主文件。 F2和F3可以包含超集或條目的子集(300K或100K)。 我的目標是得出F1中不在F2和F3中的條目列表。 到目前為止,這就是我實施的方式。

  1. 在C ++ STL映射中加載F1條目。
  2. 開始閱讀F2。 如果條目匹配,請減少計數(不要從地圖中刪除)。 Count = F1的大小。 如果計數為0,那么我知道F1中的所有條目都已在F2中找到,因此無需在F2中進一步遍歷或遍歷F3。
  3. 我沒有“擦除”映射中的條目的原因是,我讀取了C ++ STL映射是二叉樹。 從我的條目來看,我的樹絕對不可能成為平衡的二叉樹。 這是一棵非常深的樹。 因此,任何擦除操作都變得昂貴。 查找操作可能也很昂貴,但是擦除操作必須在每次刪除后重新創建樹。
  4. 所以現在的問題是我如何到達F2中存在的條目列表。 我是否維護帶有布爾標志“ found = true或false”的結構? 暗示在完成F2和F3之后,我將遍歷整個STL映射-然后查找發現的值= false,然后開始將增量寫入文件中?

有什么聰明,有效的方法嗎?

由於您在評論中說您的輸入已被排序,因此請完全避免使用容器:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    ifstream f1("f1.data"), f2("f2.data"), f3("f3.data");
    string f1entry, f2entry, f3entry; 

    while ( getline(f1,f1entry) ) {
        while ( f2 && f2entry < f1entry ) getline(f2,f2entry);
        while ( f3 && f3entry < f1entry ) getline(f3,f3entry);
        if ( f1entry != f2entry
          && f1entry != f3entry )
            cout << f1entry << '\n';

    }
}

我不知道你從哪里得出這個結論:

我的樹絕對不可能成為平衡的二叉樹。

但這是錯誤的。 您對std :: map的工作方式有奇怪的想法,並嘗試根據該想法過早地優化它。 因此,只需從地圖中刪除項目,然后從該地圖中的F2和F3中刪除元素后剩下的就是您所需要的。 如果標准地圖不夠快,請嘗試使用哈希地圖,也稱為unordered_map。

PS,應設置為unordered_set

為什么不同時閱讀F2和F3並將它們放在無序的集合中。

閱讀F1並吐出該集中未找到的那些項目。

暫無
暫無

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

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