-
X-Received: by 10.31.142.14 with SMTP id q14mr5544vkd.19.1503411329478; Tue, 22 Aug
2017 07:15:29 -0700 (PDT)
X-Received: by 10.31.142.14 with SMTP id q14mr5544vkd.19.1503411329478; Tue, 22 Aug
2017 07:15:29 -0700 (PDT)
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
atman.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!peer02.am4!peer.am4.highw
inds-media.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!
x187no699971ite.0!news-out.google.com!a17ni4630qth.1!nntp.google.com!v29no28661
21qtv.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Tue, 22 Aug 2017 07:15:29 -0700 (PDT)
In-Reply-To: <f...@g...com>
Complaints-To: g...@g...com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=159.205.152.94;
posting-account=xjvq9QoAAAATMPC2X3btlHd_LkaJo_rj
NNTP-Posting-Host: 159.205.152.94
References: <1...@g...com>
<5...@g...com>
<d...@g...com>
<f...@g...com>
<d...@g...com>
<f...@g...com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <b...@g...com>
Subject: Re: Drzewa AA
From: "M.M." <m...@g...com>
Injection-Date: Tue, 22 Aug 2017 14:15:29 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Received-Body-CRC: 3761824759
X-Received-Bytes: 8633
Xref: news-archive.icm.edu.pl pl.comp.programming:211237
[ ukryj nagłówki ]On Tuesday, August 22, 2017 at 3:34:37 PM UTC+2, bartekltg wrote:
> On Tuesday, August 22, 2017 at 2:43:29 PM UTC+2, M.M. wrote:
> > On Tuesday, August 22, 2017 at 12:23:00 PM UTC+2, bartekltg wrote:
> > > I jest jeszcze to, że RB mają mniejszy rozrzut czasów.
> > > Nieraz też to jest istotne.
> > Tak, to prawda, choć rzadka sytuacja, np. gdy urządzenie ma limit
> > czasu oczekiwania na odpowiedź.
> >
> >
> > > Jeśli mam serię wstaweń (i ewentialnie usuwań) a potem wyszukiwania
> > > to wstawiam w nieposortowany vector, potem go sortuję (jeśli coś
> > > usuwam to do osobnej listy, sortuję, a potem std::set_difference)
> > > i teraz wyszukuję na posortowanym wektorze.
> > Ale chyba teraz piszesz o metodzie zaproponowanej przeze mnie, tyle
> > że wolniej działającej i zajmującej więcej pamięci. Gdy rb-tree
> > jest zaimplementowane na tablicy, to nie trzeba osobnego wektora, a
> > samo rb-tree zajmuje mniej ramu.
>
>
> Nie. Przeczytaj raz jeszcze.
> Opisałem, jakich struktur i algorytmów użyć aby zrealizować to,
> co było w teście (dodać kupę elementów, potem zrobić kupę wyszukań)
> szybciej niż za pomocą tego czasem spłaszczanego drzewa.
Czytałem, zrozumiałem tak. Dodajesz do drzewa N (N>1mln)
elementów. Czas dodawania O( N * Log(N) ). Ilość pamięci
N * (dane + narzut węzła wskaźnikowego + narzut allocatora). Potem
tworzysz posortowany wektor. Czas wyniesie O(N). Zajęta
dodatkowa pamięć N * dane. Potem wyszukujesz M (M dużo
większe od N) razy na wektorze. Czas M * Log(N). Potem
można zwolnić wektor i znowu modyfikować dane w drzewie w
czasie Log(N).
Łączny czas: O( N * Log(N)) + O(N) + M * Log(N).
Łączna pamięć: N * (2 * dane + narzut węzła wskaźnikowego + narzut allocatora)
U mnie to samo zajmuje (asymptotycznie) tyle samo czasu, ale
znacznie mniej pamięci: N * (dane + narzut węzła indeksowego )
> Dodanie masz w log, ale zaraz puszczasz sortowanie.
> Więc efektywnie, w sytuacji, którą opisałeś
> -modyfikacja drzewa,
> -O(n) zapytań
> -modyfikacja
> ...
> modyfikacja zajmuje efektywnie tyle, co sortowanie.
Nie rozumiem. W Twoim rozwiązaniu też jest sortowanie.
W moim drzewku czasy wyglądają tak (w tej kolejności):
1) wstawianie N elementów: O(N*Log(N))
2) sortowanie drzewa: O(N):
3) wyszukanie M razy: M * Log(N)
4) wstawianie K elementów O( K * Log(N+K) )
Jest identycznie, tylko implementacja szybsza i mniej pamięci
zajmuje.
> > > Jeśli mówię, że drzewo będzie używane z przewagę wstawień/usunieć,
> > > albo wyszukiwań, to znaczy, że np 5 jednych będzie przeplatane tym drugim,
> > > nie, że wystąpią one po kolei.
> > Tak zrozumiałem, ale dla benchamrku na jedno wychodzi.
>
> Tak? Sortowanie co 6 ruchów nie odbije się na wydajności? ;-)
Ale w mojej wersji nie trzeba sortować i bez sortowania
działa wiele szybciej niż std::set. Sortowanie to tylko
ekstra możliwość na wypadek długiego ciągu wyszukiwania.
> > > Uporządkowanie tych działań to bardzo spacyficzne zastosowanie,
> > > i, jak widać powyzej, da sie je zrobić nawet szybciej.
> > Może coś ze mną nie tak, nie widzę na razie nic szybszego.
>
> Masz opisane w poście.
>
> Twój test wyglądał tak:
>
> for (...)
> insert(coś)
>
> for (...)
> delete(coś)
>
> for (...)
> find(coś)
>
> Tworzysz dwa wektory, pierwszy V wypełniasz w pierwszej
> pętli, drugi, Ve, w drugiej,
> Sortuejsz oba, odpalasz na nich set_difference czy coś podobnego.
> Wyniku używasz w trzeciej pętli.
Ok, ale przez moment w pamięci są dwa niepotrzebne wektory i potrzebny
std::set. To jest to samo, tylko jest wolniejsza implementacja i
więcej pamięci zajmuje.
> Zbudowałeś specjalny test, w którym wychodza zalety Twojego
> drzewa z sortowaniem. Ale do tego samego testu można zbudować
> skuteczniejszą strukturę - zwykły wektor.
Nie sądzę. Zwróć uwagę, że te trzy operacje są zapętlone. Po
serii find, jest znowu seria insert i remove. TO jest raczej
coś takiego:
for( ... ) {
for (...)
insert(coś)
for (...)
delete(coś)
for (...)
find(coś)
}
Wektor insertów rozrośnie się niepotrzebnie, gdy będą wstawiane
te same elementy. Wektor elementów do usuniecia też niepotrzebnie
się rozrośnie w przypadku powtórzeń i w przypadku elementów których
nie ma w insertach.
> > > A tu dyskutujemy o uniwersalnych drzewkach.
> > W różnorodnym teście moja implementacja też działa szybciej niż
> > std::set i QMap. Specjalnie na potrzeby naszej rozmowy napisałem
> > drzewko tak, aby było uniwersalne. Nie wiem o co chodzi.
>
>
> Ale ja nie odpowiadam w miejscu gdzie mówisz o uniwersalnej
> wydajności, tylko tam, gdzie zaczynasz: "a jak się posortuje".
Gdy jest dużo wyszukiwania, Ty proponujesz zrzut danych do
osobnego wektora. Ja sortuję w tej samej pamięci w której
są węzły drzewa. Moje rozwiązanie jest lepsze o to, że
nie potrzeba dodatkowej pamięci. Poza tym asymptotycznych
różnic nie ma. Moja implementacja z tego co na razie
widzę, jest dużo szybsza, ale np. set_difference jeszcze
nie sprawdzałem.
> Po wstawieniu chcesz znów korzystać z "szybszego" wyszukiwania.
> Więc znów sortujesz.
Sortuję tylko gdy zapowiada się długi ciąg wyszukiwania w
porównaniu do ilości elementów w drzewie. Gdy np.:
ilość węzłów * 1.5 < ilość wyszukiwań
Może się opłacać nawet gdy:
ilość węzłów * 1.1 < ilość wyszukiwań
I tak samo można postępować na zewnętrznym wektorze, w
rozwiązaniu w które Ty zaproponowałeś.
Gdy ilość wyszukiwań jest relatywnie mała, to wyszukuję bez
uprzedniego sortowania i mam wydajność w mojej implementacji
około 1.5 - 3.0 raza szybszą niż std::set.
Pozdrawiam
Następne wpisy z tego wątku
Najnowsze wątki z tej grupy
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
- Młodzi programiści i tajna policja
- Ada 2022 Language Reference Manual to be Published by Springer
Najnowsze wątki
- 2024-11-14 Dobra zmiana
- 2024-11-14 Czy prezydent może ułaskawić od zadośćuczynienia? [A. Lepper odszkodowania]
- 2024-11-14 Gliwice => Network Systems Administrator (IT Expert) <=
- 2024-11-14 Gliwice => Administrator Systemów Sieciowych (Ekspert IT) <=
- 2024-11-13 Filtr do pompy ruskiej
- 2024-11-12 Gdzie kosz?
- 2024-11-13 elektrycznie
- 2024-11-12 Jebane kurwa, kurwy.
- 2024-11-13 karta parkingowa
- 2024-11-13 Wl/Wyl (On/Off) bialy/niebieski
- 2024-11-12 I3C
- 2024-11-13 Kraków => DevOps Engineer (Junior or Regular level) <=
- 2024-11-13 Łódź => Senior SAP HANA Developer <=
- 2024-11-13 Zabrze => Senior PHP Symfony Developer <=
- 2024-11-13 Karlino => Konsultant wewnętrzny SAP (FI/CO) <=