struktura w c++ ,klasteryzacja

0

chodzi mi o klasteryzacje hierarchiczna...
temat nie jest trudny...
tutaj nawet mozna znaleŹĆ ladny wykladzik..
http://www.fizyka.umk.pl/~norbert/SemMagInf/Lesnau.pdf
metode prostych polaczen chyba zrobie...
ale gorzej z realizacja w c++
na poczatek majac dane wejsciowe (pkt.(x,y))..
musze z tego co wynika policzyc odleglosci miedzy kazdymi...
z tego wzorku euklidesa...
ale jak to zrealizowac,mysle ze jakas struktura punktu(x,y)...
tylko jak to zrealizowac dokladnie zeby potem fajnie sie przechowywalo te punkty z zaleznosciami miedzy sobą..

0

obejrzalem wyklad - jest tam sporo napisane jak co robic i generalnie podpowiadaja wszedzie aby korzystac z macierzy odleglosci. trzymaj sobie jakos ponumerowane punkty w jednym miejscu, w innym miejscu zrob "macierz" double'i o 'wysokosci' i 'szerokosci' takiej jak liczba puktow, i niech numery porzadkowe samych punktow w pierwszym beda dyktowaly numer wiersza/kolumny w drugim. same wierzcholki rzeczywiscie warto trzymac struct point{double x,y};, tworzac z nich tablice point* wierzcholki = new point[N];</code> albo wektor STL'owy <code>std::vector<point> wierzcholki(N);

ogolne minusy:

  • tablica N^2 jak masz duzo punktow bedzie jeszcze wieksza
  • tak na prawde potrzebny jest trojkat, nie kwadrat. w kwadracie polowa miejsca sie marnuje

to ostatnie to maly problem - zalezy jak skonstruujesz tablice. mozesz zrobic szybko kwadrat

double d = new double[N*N];
d[wiersz*N+kolumna]=/*`code> ale tez mozesz pobawic sie w zroznicowanie wierszy pod katem dlugosci - `double**d = new double*[N];
for(i=0;i<N;++i)d[i] = new double[i+1];
d[wiersz][kolumna] = /*`code> albo STL'em `std:vector<std::vector<double>> d;
for(i=0;i<N;++i)d[i].reserve(i+1);
d[wiersz][kolumna] = /*..*/;

ogolne plusy:

  • zgdnosc ideowa z opisem matematycnzym, nie trzeba kombinowac by wymyslac wlasne metody - uzywasz wprost tego co napisali na wykladzie
  • nie ma prostszej w zrozumieniu struktury danych nad tablice

natomiast zwiazek miedzy jednym a drugim jest dosc prosty:

wierzcholki[wiersz]   //wierzcholek nr 1
wierzcholki[kolumna]    // wierzcholek nr 2
d [wiersz] [kolumna]    //odleglosc miedzy 1 a 2
0

okey wielkie dzieki ruszylo do przodu :)
mam teraz punkty w postaci struktury...
mam macierz odleglosciami euklidesowymi..
(na razie kwadratowa-z polowa pustych).
kolejny krok to znalezienie najmniejszej odleglosci...
to sie zrobi bez problemow..
i teraz najmniejsza odleglosc wyznaczy nam punkty z ktorych zrobimy jedno skupienie..
(w dalszej kolejnosci to juz bedzie mogla byc odleglosc miedzy skupieniem z punktem)
no ale teraz pytanie,jak traktowac skupienie tzn jak zapisywac majac struktury punktow.
tzn mam zapisywac pod jeden pkt ,drugi usuwajac czyli przesuwajac "wyzsze?
to na pewno nie jest dobry sposob..
prosze o podpowiedz ;)
oczywiscie nadal chodzi o metode prostych polaczen ...

0

nie bardzo rozumiem.. chcesz jakos gdzies zapisac sobie ze punkty A, B E i R naleza do znalezionego skupienia? to zapamietuj ich numery, niech wierzcholki siedza zawsze w tym jednym miejscu i ich z tamtad nie ruszaj.. wrzucaj indeksy punktow np. do wektora czy listy. nie wrzucaj samych punktow - po co trzymac n-dziesiat kopii danego punktu skoro mozna po prostu trzymac jego numerek identyfikacyjny

lista z numerami punktow:

std::list< std::size_t > punkty_skupienia;
punkty_skupienia.push_back ( numer_wierzcholka_A );
punkty_skupienia.push_back ( numer_wierzcholka_B );
punkty_skupienia.push_back ( numer_wierzcholka_E );
..

pobranie pierwszego punktu z grupy:
wierzcholki[ *punkty_skupienia.begin() ];

wyswietlic cala grupe:

std::list<std::size_t>::const_iterator it=punkty_skupienia.begin(),end = punkty_skupienia.end();
while( it != end)
{
      point& wierzch = wierzcholki[*it++];
      std::cout << "X=" << point.x << " Y=" << point.y << std::endl;
}

wywalic z grupy te punkty ktore sa "fuj":

std::list<std::size_t>::iterator it=punkty_skupienia.begin(),end = punkty_skupienia.end();
while( it != end)
{
    if(spelnia_kryteria_wywalenia(*it))
        it=punkty_skupienia.erase(it);
    else
        ++it;
}

itp itede

1 użytkowników online, w tym zalogowanych: 0, gości: 1