Dany jest wektor liczb typu double i chciałbym obliczyć ich medianę. Przy posortowanym wektorze nie ma oczywiście żadnego problemu, ale czy da się to jakoś inteligentnie zrobić na wektorze nieposortowanym bez naruszania jego struktury? Na razie jedyne na co wpadłem to skopiować ten cały złom, posortować i sobie sprawdzić, ale to rozwiązanie wydaje mi się strasznie nieekonomiczne.
@sylwke3100: To jest C++ i oczywiście tak właśnie zrobiłem, przeczytaj mój wpis dokładnie. Chciałem tego uniknąć bo quicksort ma jednak tą złożoność O(n*log(n)), co dla stu milionów wylosowanych próbek zaczyna być bardzo bolesne, więc zastanawiałem się czy jest szybszy sposób.
1. (someone is wrong on the internet) quicksort ma pesymistyczną złożoność O(n^2), w std::sort to algorytm introsort o pesymistycznej złożoności O(nlogn).
2. Algorytm magicznych piątek jest "ciężki", mimo, że liniowy, to ma dużą stałą i w pesymistycznym przypadku może działać dość długo. Nie wiem, czy dla n ~ 10^8 opłaca się go w ogóle kodzić(log(10^8) wynosi ~27 tj. niedużo).
Jeśli jednak zdecydujesz się go zakodzić, to powiedz, kiedy skończysz :P
Dany jest wektor liczb typu double i chciałbym obliczyć ich medianę. Przy posortowanym wektorze nie ma oczywiście żadnego problemu, ale czy da się to jakoś inteligentnie zrobić na wektorze nieposortowanym bez naruszania jego struktury? Na razie jedyne na co wpadłem to skopiować ten cały złom, posortować i sobie sprawdzić, ale to rozwiązanie wydaje mi się strasznie nieekonomiczne.
#kucowanie #programowanie #programujzwykopem
Edit o ile to C++
Ale na przyszłość wołaj za pomocą małpki i nicka, bo gdyby niżej nie zawołał mnie sylwke to w ogóle nie zobaczyłbym Twojej odpowiedzi. :)
1. (someone is wrong on the internet) quicksort ma pesymistyczną złożoność O(n^2), w std::sort to algorytm introsort o pesymistycznej złożoności O(nlogn).
2. Algorytm magicznych piątek jest "ciężki", mimo, że liniowy, to ma dużą stałą i w pesymistycznym przypadku może działać dość długo. Nie wiem, czy dla n ~ 10^8 opłaca się go w ogóle kodzić(log(10^8) wynosi ~27 tj. niedużo).
Jeśli jednak zdecydujesz się go zakodzić, to powiedz, kiedy skończysz :P