0

こんにちは、私は配列を持っており、この配列から最も頻繁に発生するトップ 5 を取得しようとしています。

static std::string pickRandomStockSymbol()
{
    static std::string stockSymbols[] = {"SIRI", "INTC", "ZNGA", "BBRY", "MSFT", 
        "QQQ", "CSCO", "FB", "MU", "DELL", "AMAT", "NWSA", "AAPL", "AFFY", "ORCL", 
        "YHOO", "GRPN", "MDLZ", "VOD", "CMCSA" };

    return stockSymbols[rand() % 20];

^^これは私が使用する配列です。

トランザクションは、次の構造体を使用してランダムに作成されます。

struct Transaction
{
string stockSymbol;     // String containing the stock symbol, e.g. "AAPL"
string buyerName;       // String containing the buyer's name e.g. "Mr Brown"
int buyerAccount;       // Integer containing an eight digit account code
int numShares;          // Integer containing the number of sold shares
int pricePerShare;      // Integer containing the buy price per share
};

それは私がこれを行う予定のこの関数内にあります。私はこれにどのようにアプローチするか本当に知りません:

string* Analyser::topFiveStocks()
{

return new string[5];
}

これらの上位 5 つの発生要素を取得するためにトランザクションを実行する方法を教えてくれる人はいますか?

さらに必要な情報があれば、喜んで提供させていただきます。

前もってありがとう、アンドリュー

4

3 に答える 3

2

std::unordered_map株式記号をキーとして使用し、トランザクション数を値として使用できます。次に、最も高い 5 つを a に入れ、それstd::vectorを返します。

上位 N をベクトルに入れることに関しては、それをソートしたままにし、挿入ごとに再ソートして、トランザクション数が最も多い株が最初になるようにすることができます。次に、マップを反復処理するときに現在の在庫のトランザクション数がベクター内の最後の項目 (トランザクション数が最小のベクター内の項目) よりも多いかどうかを簡単に確認し、それをベクターに追加して再それを並べ替えます。


また、マップのすべての株式をベクトルに追加し、マップの値を使用して並べ替えて、ベクトルの最初の 5 つのエントリを取得することもできます。

これは次のようになります。

using transaction_map_type = std::unordered_map<std::string, unsigned int>;

transaction_map_type transactions;

// ...

std::vector<std::string> topFiveStocks()
{

    std::vector<transaction_map_type::value_type> all_trans;

    // Copy all transaction into our vector
    std::copy(std::begin(transactions), std::end(transactions),
              std::back_inserter(all_trans));

    // Now sort the transactions
    std::sort(std::begin(all_trans), std::end(all_trans),
              [](const transaction_map_type::value_type& t1,
                 const transaction_map_type::value_type& t2)
              { return t1.second > t2.second; });

    // And get the top five (or less) results into a separate vector
    std::vector<std::string> top_five;

    auto count = std::min(5UL, all_trans.size());
    for (unsigned i = 0; i < count; i++)
        top_five.push_back(all_trans[i].first);

    return top_five;
}

また、トランザクションを行うたびに、マップ内のトランザクションのカウンターを増やすことを忘れないでください。

注:このソリューションはテストされておらず、ブラウザーで記述されているだけです。コンパイルさえできないかもしれません。

于 2013-03-19T13:14:30.360 に答える
0

配列を並べ替えてからループして、等しい要素の最長間隔を計算します。

于 2013-03-19T13:13:40.637 に答える
0

銘柄記号を累積します。

  • カウントをmap<string, int>
  • 最高の 5 つのシンボルをset<string>
  • 上位 5 つのシンボルの最低周波数をint
  • 最高の 5 つのシンボルの最低をstring
于 2013-03-19T13:25:37.043 に答える