K
Irgendwie beist sich das.
Du übergibst 1 Zahl. Diese Zahl kann nur n mal vorkommen. Wie willst Du daraus die 5 Häufigsten machen ?
Wenn es darum geht die n Häufigsten Zahlen zwischen X und Y auszuwerten würde ich eine MultiMap nehmen. Als Key die Häufigkeit als Value den Wert. Die Map Sortiert das dann fein für einen und man muß nurnoch vom Rand aus der Map n Elemente ausgeben.
Beispiel:
// DelMe3.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include <vector>
#include <algorithm>
#include <time.h>
#include <map>
#include <iostream>
using namespace std;
class test
{
// pures Füllen des Vectors mit Daten
vector<int> vec;
public:
test(int nZufallsZahlen = 5000)
{
for(int i = 0;i<nZufallsZahlen;++i)
vec.push_back(rand() % 100);
}
// Möglichkeit 1 mit Normaler map (kleinste Zahl an Anfang)
multimap<int,int> Haeufigkeit(int AuswertenVon = 0,int AuswertenBis = 100)
{
if(AuswertenVon > AuswertenBis)
swap(AuswertenBis,AuswertenVon);
multimap<int,int> helper;
for(int i = AuswertenVon;i < AuswertenBis;++i)
{
int c = count(vec.begin(),vec.end(),i);
helper.insert(make_pair(c,i));
}
return helper;
}
// Hier der Map sagen das sie die größten Zahlen an den Anfang sortieren soll
multimap<int,int,greater<int> > Haeufigkeit2(int AuswertenVon = 0,int AuswertenBis = 100)
{
if(AuswertenVon > AuswertenBis)
swap(AuswertenBis,AuswertenVon);
multimap<int,int,greater<int> > helper;
for(int i = AuswertenVon;i < AuswertenBis;++i)
{
int c = count(vec.begin(),vec.end(),i);
helper.insert(make_pair(c,i));
}
return helper;
}
};
template <class T>
void ausgeben_von_vorne( const T & mymap,int die_ersten_n_zahlen)
{
T::const_iterator pos = mymap.begin();
for(int i = 0;i<die_ersten_n_zahlen;++i,++pos)
cout<<"Die Zahl "<<pos->second<< " kommt "<< pos->first<<" mal vor\n";
}
template <class T>
void ausgeben_von_hinten( const T & mymap,int die_ersten_n_zahlen)
{
T::const_reverse_iterator pos = mymap.rbegin();
for(int i = 0;i<die_ersten_n_zahlen;++i,++pos)
cout<<"Die Zahl "<<pos->second<< " kommt "<< pos->first<<" mal vor\n";
}
int main(int argc, char * argv[])
{
int counter = 0;
int AuswertenVon = 0;
int AuswertenBis = 0;
// Initialisieren des Zufallsdingens
srand(time(NULL));
// Instanz von test anlegen
test t;
cout<<"Geben Sie an wieviele Zahlen als Häufigste / Seltenste ausgegeben werden sollen\n";
cin>>counter;
cout<<"Geben Sie an von welchem Wert aus diese Betrachtung erfolgen soll ( z.B. 0) ";
cin>>AuswertenVon;
cout<<"Geben Sie an bis zu welchem Wert diese Betrachtung erfolgen soll ( z.B. 100) ";
cin>>AuswertenBis;
// ne Normale Map holen die mit der kleinsten Zahl nach vorne Sortiert ist
// und die 5 Häufigsten Zahlen
multimap<int,int> result ( t.Haeufigkeit(AuswertenVon,AuswertenBis) );
multimap<int,int,greater<int> > result2 ( t.Haeufigkeit2(AuswertenVon,AuswertenBis) );
cout<<"Die Häufigsten"<<counter<<" Zahlen:\n";
cout<<"ausgeben_von_hinten(result,counter);\n";
ausgeben_von_hinten(result,counter);
cout<<"\nausgeben_von_vorne(result2,counter);\n";
ausgeben_von_vorne(result2,counter);
cout<<"\n\n";
cout<<"Die seltensten"<<counter<<" Zahlen:\n";
cout<<"ausgeben_von_hinten(result2,counter);\n";
ausgeben_von_hinten(result2,counter);
cout<<"\nausgeben_von_vorne(result,counter);\n";
ausgeben_von_vorne(result,counter);
return 0;
}