• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

mediana vector

Object Storage Arubacloud
0 głosów
764 wizyt
pytanie zadane 5 lipca 2019 w C i C++ przez niezalogowany

Na wstępie chał bym przepościć forum ze zadaje tyle pytań, ale jest to niestety jeno z moich głównych źródeł wiedzy.

Pytanie właściwe czy jest może jakaś biblioteczna metoda w klasie vector która zwraca medianę

pseudo kod poniżej, coś w tym stylu tylko w dwóch liniach i bez konieczności kopiowania vectorów

struct punkt{
   int x;
   int y;
} 
 vector <vector <punkt>>P
   sort(p.begin(),p.end(),posortuj_po_x());
   sort(p.begin(),p.end(),posotuj_po_y());

punkt mediana (vector<punkt>&vx,vector <punkt> &vy)
//vector<punkt>&vx,vector <punkt> &vy posortowane wktory po x i y
{
size_t sz = vx.size();
size_t md=sz/2;
if (sz%2) md+=1;
std:: vector <punkt> :: iterator mdx=vx.begin();
std:: vector <punkt> :: iterator mdy=vy.begin();
std::advance(mdx,md);
std::advance(mdy,md);
return {mdx->x,mdy->y};
}

 

komentarz 5 lipca 2019 przez tkz Nałogowiec (42,020 p.)
przywrócone 6 lipca 2019 przez tkz
komentarz 6 lipca 2019 przez niezalogowany
no dobra ok, ale tu mam jedną zmienną a dla dwóch. praktycznie muszę robić to samo. Ale dzięki no chyba trochę prościej jest pokazane.
komentarz 6 lipca 2019 przez tkz Nałogowiec (42,020 p.)
Chciał byś uzyskać medianę całej tarlicy punktów?
komentarz 6 lipca 2019 przez niezalogowany
Nie, chciałbym 2 mediany dla każdej tablicy z osobna. Tak jakby "środek ciężkości" punktów 2D
komentarz 6 lipca 2019 przez tkz Nałogowiec (42,020 p.)

Ogólnie masz tablice 2D. Czyli:

{ {2,3} , {4,6} //i chcesz medianę dla osobno dla zóltego i zilelonego?

{2,3} , {4,6}

{2,3} , {4,6}}

Czy chcesz medianę dla wszystkich x i y?

komentarz 6 lipca 2019 przez niezalogowany
osobno dla 2 i 4 a  osobno dla 3 i 6

Taki punkt który jest w środku wszystkich punktów ale odległość teoretycznie nie ma znaczenia przynajmniej na początku dlatego nie średnia tylko mediana
komentarz 6 lipca 2019 przez tkz Nałogowiec (42,020 p.)
Czyli medianę wszystkich X i Y
komentarz 6 lipca 2019 przez adrian17 Ekspert (346,900 p.)
   sort(p.begin(),p.end(),posortuj_po_x());
   sort(p.begin(),p.end(),posotuj_po_y());

Tylko dodam że to raczej nie robi tego co chcesz - wyniki pierwszego sortowania są  w zasadzie zignorowane.

Ogólnie porównywanie wektorów/punktów 2D jest raczej nietrywialne; nie wiem co w tym kontekście by znaczyła mediana. (edit: napisałem to zanim pojawiły się nowe komentarze)

komentarz 6 lipca 2019 przez niezalogowany
sort by x {{2 ,3} {5,15} {20 1} {30, 4}{50,100}} mediana_x =20;

sort by y{{20 1} {2 ,3}{30, 4} {5,15} {50,100}} mediana_y =4;

punkt środkowy {20,4}

Coś takiego potrzebuję, na piechotę to to potrafię zrobić ale to zamie 20 linii kodu min
komentarz 6 lipca 2019 przez niezalogowany
edycja 6 lipca 2019
Ja napisałem ,że to pseudo kod. Ale odpowiedz tzk ok.Tylko nth_element mi się nie kompiluje, ale zaraz coś includuję i pewnie będzie ok. Wygląda w miarę krótko, tylko czy będę umiał przełożyć na klasę punkt to inne pytanie

Ok dzięki za odpowiedzi. Jutro (tj dzisiaj) to ogarnę.

1 odpowiedź

+1 głos
odpowiedź 6 lipca 2019 przez tkz Nałogowiec (42,020 p.)
wybrane 6 lipca 2019
 
Najlepsza
#include <vector>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <string>
struct Point
{
    double x;
    double y;
};
std::vector<double> separatelyX(const std::vector<Point>&);
std::vector<double> separatelyY(const std::vector<Point>&);
double median(std::vector<double>);

int main(void)
{
    std::vector<Point> vecP;
    for(size_t i = 0; i<10; i++)
    { 
        vecP.emplace_back(Point());
        vecP[i].x = i;
        vecP[i].y = i+2;
    }
    std::cout<<median(separatelyX(vecP));
    return 0;
}
std::vector<double> separatelyX(const std::vector<Point> &vec)
{
    std::vector<double>tempVec;
    if(std::size(vec) == 0)
        return tempVec;
    for(const auto i : vec)
        tempVec.emplace_back(i.x);
    return tempVec;
}

std::vector<double> separatelyY(const std::vector<Point> &vec)
{
    std::vector<double>tempVec;
    if(std::size(vec) == 0)
        return tempVec;
    for(const auto i : vec)
        tempVec.emplace_back(i.y);
    return tempVec;
}

double median(std::vector<double> vec)
{
    size_t size = vec.size();
    if (size == 0)
        return 0;  
    double medianTmp;
    sort(vec.begin(), vec.end());
    if (size % 2 == 0)
        medianTmp = (vec[size / 2 - 1] + vec[size / 2]) / 2;
    else 
        medianTmp =  vec[size / 2];
    return medianTmp;
}

Zrobione na szybko, bo najniższej linii oporu, chyba działa tak jak chcesz.

komentarz 6 lipca 2019 przez niezalogowany
tak: return lhs.x < rhs.x;

czy tak: return lhs.x > rhs.x;  Niema różnicy wyniki takie same już przewertowałem ta stronę i wszystkie dostępne możliwości a  i tak mi sortuje od najmniejszej
komentarz 6 lipca 2019 przez niezalogowany
z multimap do wektora jest taki myk vector <punkt> a(m.second); czy trzeba ręcznie?
komentarz 6 lipca 2019 przez tkz Nałogowiec (42,020 p.)
Chcesz utworzyć vektor wartości mapy? Bo ten zapis nie ma sensu.
komentarz 6 lipca 2019 przez niezalogowany
Chcę zrobić coś takiego : for (auto &temp:m)  sort_v.push_back(temp.second);

bez tego for;

ale ok w sumie dotarło do mnie map nie potrzebuje wcale i to bardzo mi uprości kod moze nawet jednym wektorem się obędę
komentarz 6 lipca 2019 przez niezalogowany
A głupawka mnie przed snem dopadła. Swoją drogą to by się przydał taki ogólny konstruktor kopiujący do STL jak dla stringu od którego bajtu zacząć ile bajtów skopiować z jednego kontenera do drugiego np vector <double, double , int, char> V1 do

vector <int,char> V2(V1(9,5))

i taki wskaźnik na dowolne pole struktury V1(9,4)  vector <V1(9,4)> ::itreator it

sort (it.begin(),it.end());

Podobne pytania

0 głosów
1 odpowiedź 333 wizyt
0 głosów
0 odpowiedzi 677 wizyt
0 głosów
1 odpowiedź 206 wizyt

92,762 zapytań

141,686 odpowiedzi

320,499 komentarzy

62,106 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...