Случайное подмножество элементов из мультикарты, сгруппированных по ключам - PullRequest
0 голосов
/ 23 марта 2011

У меня есть список, состоящий из идентификаторов марок автомобилей и связанных моделей автомобилей, например:

1 Corolla
1 Yaris
1 Matrix
2 Cherokee
2 Liberty
3 CR-V
3 CR-Z
3 Элемент
3 Civic
3 Pilot

, где 1 = Toyota, 2 = Jeep и 3 = Honda.Обратите внимание, что количество моделей автомобилей для разных марок автомобилей различается.

Я хотел бы получить случайные модели автомобилей для каждой марки автомобиля.Количество автомобилей, подлежащих извлечению по марке автомобиля, зависит от общего количества связанных моделей и входного параметра с плавающей запятой: «nPercentage».(Параметр nPercentage одинаков для всех марок автомобилей).Например, если nPercentage = 0,5, возможный случайный вывод будет:

1 Corolla
1 Matrix
2 Liberty
3 CR-Z
3 Civic
3 Pilot

В настоящее время я работаю с мультикартным классом, поскольку ключи могут быть продублированы.Пока что я могу найти недублированные ключи и посчитать количество связанных элементов.Может ли кто-нибудь пролить свет на то, как найти случайные модели автомобилей по марке автомобиля?Ниже код, который у меня есть.

//The variable 'm_mapDatasetMapping' is of type: multimap<int, string>

multimap< int, string >::size_type countPerKey;
const int *pLastKey = NULL;
multimap<int,string>::const_iterator it=m_mapDatasetMapping.begin();

// looking for non-duplicated keys.
for( ; it!=m_mapDatasetMapping.end(); it++){

    if( (pLastKey!=NULL) && (*pLastKey==it->first) ){
        continue;
    }
    pLastKey = &(it->first);

    // count the number of values associated to the given key.
    countPerKey = m_mapDatasetMapping.count(*pLastKey);

    /* Select 'x' random elements associated with the key '*pLastKey'. 
       The number of random elements to be extracted
       is a percentage of the total number of values per key, i.e.: 
       x = nPercentage * countPerKey 
    */
    ...
}

1 Ответ

0 голосов
/ 23 марта 2011

Возможно, самый простой подход - скопировать все значения для данного ключа в новый контейнер, скажем, vector, random_shuffle it и resize() it, чтобы уменьшить его размер до x:

int x = nPercentage * countPerKey;
auto range = m_mapDatasetMapping.equal_range(*pLastKey);
std::vector<std::string> values;
for(auto i = range.first; i != range.second; ++i)
    values.push_back(i->second);
std::random_shuffle(values.begin(), values.end());
values.resize(x);
...