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

mediana vector

VPS Starter Arubacloud
0 głosów
636 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,000 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,000 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,000 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,000 p.)
Czyli medianę wszystkich X i Y
komentarz 6 lipca 2019 przez adrian17 Ekspert (344,100 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,000 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,000 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ź 253 wizyt
0 głosów
0 odpowiedzi 643 wizyt
0 głosów
1 odpowiedź 189 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...