У меня вопрос на C ++:
Учитывая список баллов студентов, приведите частоту баллов по порядку.
[используйте карту контейнера c ++]
Моя идея: поместить список баллов в карту с баллом в качестве ключа и частотой в качестве значения. Прежде чем добавить ключ, найдите его. Если ключ новый, добавьте его и установите его freq как 1. Если нет, обновите его freq на ++ 1. O (nlgn)
Затем поменяйте ключ и значение на новой карте, на которой в качестве значения установите freq, а в качестве значения - его оценку. O (nlgn), потому что карта выполняет сортировку сама.
память: O (n)
Это не очень эффективно, потому что мне нужно использовать 2 карты и делать сортировку 2 раза.
Любые комментарии или идеи приветствуются.
Спасибо
My code
#include <iostream>
#include <map>
#include <algorithm>
#include <time.h>
using namespace std;
const int M =10;
int A[M] ;
bool myFunc(pair<int, int> p1 , pair<double, int> p2)
{
//return p1.second > p2.second;
}
int scoreMap(int *A, const int& N)
{
if (A == NULL)
return 1;
map<int, int> map1;
map<int, int>::iterator itr;
int j = 0 ;
while(j < N)
{
int myKey = (A[j]) ;
itr = map1.find(myKey);
if (itr == map1.end())
{
map1.insert(pair<int, int>(myKey, 1));
}
else
{
++(itr->second);
}
++j;
}
// print map1
cout << "socre \t freq " << endl;
for(itr = map1.begin(); itr != map1.end(); ++itr )
{
cout << itr->first << "\t" << itr->second << endl;
}
// use multimap
multimap<int, int> map2;
multimap<int, int>::iterator itr2;
for (itr = map1.begin() ; itr != map1.end() ; ++itr )
{
map2.insert(pair<int, int>((*itr).second, (*itr).first)) ;
}
// print map2
cout << "after sort " << endl;
cout << "freq \t socre " << endl;
for(itr2 = map2.begin(); itr2 != map2.end(); ++itr2 )
{
cout << (double)(itr2->first)/N << "\t" << itr2->second << endl;
}
return 0;
}
int main()
{
int N = 10; int range=10;
for (int i = 0 ; i < M ; ++i)
{
srand(time(NULL)+rand());
//A[i] = rand()%range + (double)rand()/INT_MAX;
A[i] = rand()%range ; // + (double)rand()/INT_MAX;
// sleep(1);
}
scoreMap(A, M);
return 0;
}
// EOF
время O (nlgn), пространство O (n), есть ли более эффективные решения?
спасибо