2013-03-19 2 views
0

Привет, у меня есть массив и im, которые хотят получить 5 самых популярных из этого массива.Топ 5 наиболее часто встречающихся из массива C++

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 элементов?

если будет больше необходимой информации, я буду более чем счастлив предоставить.

Спасибо заранее, Эндрю

+0

Ve ry очень близко к этому предыдущему потоку http: // stackoverflow.com/questions/12049352/define-most-freq-char-element-in-a-vectorchar –

+0

Что делать, если частота одинакова для всех? Как вы определяете, какие 5 выбрать? –

ответ

0

Просто отсортировать массив, а затем цикл над ним, чтобы вычислить самый длинный интервал элементов, которые равны.

+0

как я могу это сделать? я просто учился на данный момент, и моя математика на самом деле не лучшая в мире. его случайный вопрос, который появился в Интернете, и это был бы полезный алгоритм, чтобы я смог ответить –

2

Вы можете использовать std::unordered_map с символом акции в качестве ключа, а транзакцию считать как значение. Затем просто поместите пять самых высоких в std::vector и верните это.

Что касается размещения вершины N в векторе, вы можете сохранить его отсортированным и повторно отсортировать его после каждой вставки, чтобы первым был счет с наивысшим количеством транзакций. Тогда легко увидеть, имеет ли текущий запас при повторении по карте более высокий счет транзакции, чем последний элемент в векторе (который является элементом в векторе с наименьшим количеством транзакций), затем добавьте его к вектору и повторите попытку, сортировать его.


Вы также можете просто добавить все запасы с карты в вектор, а затем отсортировать его, используя значение в карте, и получить первые пять записей в векторе.

Это может быть что-то вроде этого:

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; 
} 

Кроме того, помните, чтобы увеличить счетчик для операций на карте, когда вы делаете сделки.

Примечание: Это решение не проверено, просто написано в браузере. Может даже не компилироваться.

+0

, как я могу это сделать? я просто учился на данный момент, и моя математика на самом деле не лучшая в мире. его случайный вопрос, который появился в Интернете, и это было бы полезным алгоритмом для того, чтобы я смог его восстановить. –

+0

@AndrewGlass. Здесь очень мало математики, возможно, какое-то дополнение. –

+0

способ, в котором это выполняется, я думаю, что это путают. может ли кто-нибудь дать мне пример, который я мог бы отключить? –

0

Накопить символы акций:

  • Графы в map<string, int>
  • высших 5 символов в set<string>
  • самая низкая частота высших 5 символов в int
  • самый низкий показатель наивысшие 5 символов в string
+0

способ, в котором это выполняется, я думаю, что это сбивает с толку. может ли кто-нибудь дать мне пример, который я мог бы отключить? –

+0

Я не уверен, что мне нравятся сообщения, скопированные и наклеенные на меня; Я не машина. Не похоже, что вы прилагаете много усилий для решения этой проблемы для себя. Проблема в том, что вам нужно написать код, а не сказать «я не знаю, что писать». Напишите код и попытайтесь заставить его работать. Напишите простейшую вещь, о которой вы можете думать, и попытайтесь понять, не работает ли она. Тогда вы можете задать гораздо более конкретные вопросы, чем «можете ли вы написать это для меня». –

+0

Извините, я не хотел вас обидеть. –