2011-12-21 2 views
0

誰もトップ-kクエリ問題の解決法を持っていますか? 問題は私が無限の数のストリームを持っていることで、私はストリームのトップkアイテムを与える解決策を考え出す必要があります。トップ-Kクエリソリューション

これはインタビューの質問です。私はC++のソリューションを探しています。

これはどのように問題を解決するのですか。しかし、ここで私はあなたがストリームから取得した各番号についてはstd::set<int> top

  • 作成stream/file

    #include <iostream> 
    #include <fstream> 
    #include <string> 
    #include <map> 
    
    typedef std::map<std::string, int> freq_table_t; 
    typedef std::multimap<std::size_t, freq_table_t::const_iterator> top_n_t; 
    size_t n = 5; 
    
    int main (int argc, char **argv) { 
        std::ifstream ifs(argv[1]); 
        if (ifs.peek() == EOF) 
         return 1; 
    
        std::string line; 
        freq_table_t freq_table; 
    
        while(ifs.good()&& std::getline(ifs,line)) { 
         if (freq_table.insert(std::make_pair(line, 1)).second == false) 
          freq_table[line]++; 
        } 
        ifs.close(); 
    
        top_n_t top5; 
        for (freq_table_t::const_iterator it = freq_table.begin(); it != freq_table.end(); ++it) { 
         if (top5.size() < n || it->second > top5.begin()->first) 
          top5.insert(std::make_pair(it->second, it)); 
         if (top5.size() == n + 1) 
          top5.erase(top5.begin()); 
        } 
        for (top_n_t::reverse_iterator ritr = top5.rbegin(); ritr != top5.rend(); ++ritr) 
         std::cout << ritr->second->first << std::endl; 
    
        return 0; 
    } 
    
  • +2

    インタビューが終了しました。私は答えられず、Googleの回答も見つからなかったので、私に解決策を説明できる誰かを捜しています –

    +1

    私はこれが完全に不公正な質問だとは思わない、今インタビューを受けています。私はこれを宿題のように扱い、答えをOPに導くだけではなく、彼に答えを与えます。プラス私はこれについて自分自身が好奇心が強い。 –

    +3

    質問をする質問はここで禁止されていません。あなたが解決策について感じていることについての質問に入力を加えてください。投票を再開する。 –

    答えて

    3
    • 全体を読む必要があります: - セット
    • に番号を追加
    • を - - top.size() > kの場合は、セットの最小要素を削除します。各時点で

    topはセット内k最大アイテムまで含有する(ストリームにおける未満k異なるアイテムここまでがあった場合に数未満kとなります)。 これをC++でコーディングするのは簡単ではありません。

    +0

    あなたは最大のkを与えています。avinashは、ポスターのコードのfreq_tableなどに基づいて、最も頻繁にkを探しています。 – James

    +0

    @James私が質問に答えた後、コードが追加されました。 OPには最初の3行が含まれていました。 – dasblinkenlight

    1

    一般化dasblinkenlightの答え:

    最小優先度キューを維持します。ストリームの各要素について、要素をキューの最小要素と比較します。それが大きい場合は、最小の要素をデキューして新しい要素をエンキューします。基本ケースとして、ストリームの最初のk要素にキューを初期化します。

    ストリームの最後には、優先度キューに最大のk要素が含まれます。

    ストリーム内の要素がnであれば、このアルゴリズムはn log k時間で実行されます。

    +0

    私はOPがk - 最も頻繁な要素を求めていて、ストリームの中で最大のものではないと思います – brainydexter

    関連する問題