Ich brauche keinen Abstand in der Dimension Geschlecht, weil das Geschlecht nicht mit in die Abstandsfunktion eingeht. Das Geschlecht ist doch die Eigenschaft, für die ich die Klassenzugehörigkeit suche.
#include <cmath>
#include <algorithm>
#include <map>
enum Geschlecht { m, w };
struct Person {
int groesse;
Geschlecht geschlecht;
};
int abstand(Person a, Person { return std::abs(a.groesse - b.groesse); }
int main()
{
Person beispiele[] =
{
{ 175, m },
{ 169, w },
{ 185, m },
{ 166, w },
{ 172, w },
{ 168, m }
};
const size_t anzahl = sizeof(beispiele) / sizeof(beispiele[0]);
Person X;
X.groesse = 171;
// Nächste Nachbarn durch stumpfes Sortieren nach Abstand ermitteln
std::sort(beispiele, beispiele + anzahl, [X](Person a, Person { return abstand(a, X) < abstand(b, X); } );
int k = 3;
// Zaehlen, wie of welches Geschlecht unter den k ersten Nachbarn auftritt
std::map<Geschlecht, int> zaehlen;
for(int i=0; i<k; ++i)
{
++zaehlen[beispiele[i].geschlecht];
}
// Hoechste Anzahl suchen
auto maximum = zaehlen.begin();
for(auto i=zaehlen.begin(); i != zaehlen.end(); ++i) {
if(i->second > maximum->second)
maximum = i;
}
X.geschlecht = maximum->first;
}[/code]