-2

私は次のようにこのクラスを持っています:

class nLetterFrequency
{
private:
    map<string, int> frequencyTable;

    void insert(const string& letterPerm);
    void parseFile(int n);                     //calls insert()

public:

    nLetterFrequency(int n);                   //calls parseFile()
    ~nLetterFrequency();
};

どうやら私のコードに問題はないようです。完了するまでに 2 ~ 3 分しかかからないことがわかりました (それは奇妙ではありませんか?)。私は最初にこの実装を Java でコーディングし、数秒で終了したため、これは怪しいように思えます。2 つの言語間のパフォーマンスが劇的に向上するのはなぜでしょうか? これは、c++ と Java でのマップ クラスの実装方法の違いによるものですか? Java では TreeMap を使用しています。HashMap も使用しましたが、マップを並べ替えたかったので TreeMap に切り替えました。parseDictionary 関数と挿入関数のコードを次に示します。コンストラクターは parseDictionary() を呼び出し、それだけです。

void nLetterFrequency::parseDictionary(int n)
{
    ifstream infile("3dictionary.txt");     //length of words >= 3                 


    while(!infile.eof())                    //while we are not at the end of the file
    {
        string word;

        getline(infile, word);         

        if(word.length() < n)
        {
        printf("Error: check the dictionary file since word.length() < n\n");
            exit(0);   //quit the program
        }

        for(int i = 0; i < word.length() - n + 1; i++)
        {
            string perm("");
            for(int j = 0; j < n; j++)
            {
                perm += word[i+j];
            }

            insert(perm);
        }

    }

    infile.close();
}


void nLetterFrequency::insert(const string& letterPerm)
{
    if(frequencyTable.count(letterPerm))                         //letterPerm is already in frequencyTable
    {
        frequencyTable.find(letterPerm)->second++;               //increment the current frequency of entry letterPerm
    }
    else                                                               //insert the new permutation into frequencyTable
    {
        frequencyTable.insert(pair<string, int>(letterPerm, 1));
    }
}

すべての助けをありがとう、私はそれを感謝します!

4

2 に答える 2

0

300,000行でバーフする可能性は低いようですが、計算を行う必要があります。300,000行にいくつの「文字列」がありますか?あなたが「言葉」を意味しているかもしれないと仮定すると、多分それは約500万語です。多分各単語は8文字です。乱暴に推測すると、それはおそらくマップノードあたり32バイトです。合計で約160MB。それほどでもない。

コンストラクター引数'n'は何のためのものですか?文字列を挿入する前に失敗すると言っていますか?

于 2012-04-22T14:10:28.803 に答える
0

すべてのメモリ割り当てはマップ内で処理されるため、IMHO では 2 回 (1 回はコンストラクター内で (暗黙的に))、もう 1 回はコンストラクターの本体内で割り当てる必要はありません。マップの有効期間が nLetterFrequency オブジェクトより長くなければならない場合を除きます。

于 2012-04-22T14:33:12.680 に答える