-
X-Received: by 10.31.56.141 with SMTP id f135mr329vka.1.1503425968513; Tue, 22 Aug
2017 11:19:28 -0700 (PDT)
X-Received: by 10.31.56.141 with SMTP id f135mr329vka.1.1503425968513; Tue, 22 Aug
2017 11:19:28 -0700 (PDT)
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask
.pl!news.nask.org.pl!news.unit0.net!weretis.net!feeder6.news.weretis.net!feeder
.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews
.com!nntp.giganews.com!v29no3048297qtv.0!news-out.google.com!i9ni52552qte.0!nnt
p.google.com!v29no3048292qtv.0!postnews.google.com!glegroupsg2000goo.googlegrou
ps.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Tue, 22 Aug 2017 11:19:28 -0700 (PDT)
In-Reply-To: <8...@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>
<b...@g...com>
<8...@g...com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <1...@g...com>
Subject: Re: Drzewa AA
From: "M.M." <m...@g...com>
Injection-Date: Tue, 22 Aug 2017 18:19:28 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Lines: 201
Xref: news-archive.icm.edu.pl pl.comp.programming:211240
[ ukryj nagłówki ]On Tuesday, August 22, 2017 at 4:39:39 PM UTC+2, bartekltg wrote:
> A dlaczego masz mieć dane dwa razy? Przecież każdy
> obiekt istnieje tylko raz, nie robisz żadnych kopii*).
> W maksymalnym momencie masz Ni+Ne, gdzie Ni to liczba
> elementów dodanych w pierwszej iteracji, Ne w drugiej.
Nawiązałeś do tamtego przykładu, a tam była jeszcze
pętla obejmująca to wszystko, więc pociągnąłem w tym
kierunku :) Ale masz rację, nie muszę mieć danych dwa
razy. Dla bezpieczeństwa muszę mieć strukturę o dobrych
właściwościach ogólnych, przykładem jest rb-tree. Okazało
się, że zaimplementowane rb-tree na tablicy działa i
szybciej w ogólnym przypadku, i umożliwia sztuczkę z
sortowaniem bez dodatkowej pamięci. Dlatego tak mocno
się przekonałem do takiej implementacji.
> Jeśli Ni jest duże, np rzędu Ni, to rzeczywiście na raz trzymasz dwa
> razy więcej elementów niż w przypadku drzewa, ale jeśli elementy
> nie sa za duże, to i tak jesteś do przodu, to nie potrzebujesz
> żadnych wskaźników.
>
> *) set_difference robi kopię. Ale wersję która modyfikuje źródło
> nie jest ciężko napisać.
Tak, można brać elementy z tyłu wektorów i wywoływać shrink_to_fit
co jakiś czas. Sztuczek jest wiele które w konkretnym przypadku
mogą przyspieszyć lub zaoszczędzić pamięć.
> Tylko raz, na poczatku, nie po każdej modyfikacji.
> Wstawienie/usunięcie jednego elementu w posortowany ciag
> jest O(n)
Rozumiem. Masz rację. Początkowo zrozumiałem, że w mojej
wersji drzewa wstawienie/usunięcie będzie kosztowało
O(N) po posortowaniu. Moim drzewie cały czas wstawienie i
usunięcie kosztują O(Log(N)).
Masz rację, że na początku można posortować dane. Sortowanie
prawdopodobnie będzie znacznie szybsze niż wstawianie do
drzewa. W dodatku, sortujemy same dane, a nie meta-dane
drzewa. Ja będę miał kopię, więc odtworzenie z kopii samych
danych będzie jeszcze szybsze. Algorytm:
for( j=0 ; j<M ; j++ )
set.insert( rand() );
for( j=0 ; j<K ; j++ ) {
set.insert( rand() );
for( k=0 ; k<L ; k++ )
set.search( rand() );
}
Dla L > M powinien zadziałać szybciej na posortowanej tablicy.
Jednak ten przykład podałem nie jako ostateczny cel, lecz
dlatego, aby upewnić się, że rozumiemy się co do liniowej
złożoności sortowania i logarytmicznej wyszukiwania, nawet
jeśli wyszukiwanie jest po sortowaniu i modyfikowaniu.
W praktyce czasami mogę mieć kilka insertów, albo L < M i
już na tablicy będzie ryzykownie.
Ja naprawdę chciałem uzyskać ogólną dobrą implementację, plus
to sortowanie jako jedno ulepszenie ekstra. Trochę boję się
stosować tablicy, bo po długim czasie programowania okaże się
że modyfikacji przypada więcej niż przewidziałem na początku i
będę musiał przerabiać.
> > 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) )
>
> W tej części postu mówiliśmy o wersji "tablicowej",
> gdzie drzewko posortowałeś. Więc tam modyfikacja
> zajmuje O(sortowanie). Albo tracisz bonus od szybkiego
> wyszukiwania i wtedy nie ma tematu.
Tak, bo zabrzmiałem zbyt dosłownie z tym przykładem w
którym wykonuję dokładnie jedną modyfikację :) To
był tylko przykład w celu który powyżej opisałem.
Masz rację, że gdy jest dosłownie jedna modyfikacja, to
na wektorze powinno działać szybciej.
Ale przynajmniej wiem dlaczego się nie rozumielismy :D
> Jaki, kurde, std::set?
> std::set_difference to algorytm działajacy na dwóch posortowanych
> zakresach (np wektorach).
> Ale racja, trzeba go zmodyfikować, by działał w miejscu.
Myślałem std::set_difference wypluwa std::set :) Nieważne. Ważne
że można to zaimplementować tak, aby działał w miejscu.
> > > 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.
>
>
>
> Wektor elementów do usunięcia nie rośnie, musisz go czyścić.
> Jeśli w pierwszej petli skasowałeś '13', a potem w piątej dodałeś
> 13, to 13 ma być w kontenerze.
Ale do usunięcia może napłynąć dużo takich samych liczb. Gdy usuwamy z
drzewa, to za pierwszym razem usuwamy, a potem próba usunięcia kończy
się niepowodzeniem. Gdy elementy do usunięcia kumulujemy w wektorze, to
wektor zawierający np. 4 różne liczby, może zawierać 40 liczb, czyli
może być 10krotny narzut pamięciowy. Przy usuwaniu z drzewa nie będzie
takiego narzutu. Tak samo dane do wstawienia mogą się skumulować w
wektorze, może być 10 razy dłuższy niż ilość różnych wartości.
> Liczac róznicę rób od razu odpowiednik unique.
Tak, ale zanim zrobię różnicę, to muszę tracić pamięć na kumulowanie
tych samych wartości. W drzewku nie ma tego problemu.
> Nie.
> Jeśli bardzo chcesz, mozęmy wrócić do tematu (choc nie wiem,
> do czego on daży, imho się trolociag zrobił), ale dopiero,
> jak postarasz się zrozumieć, jaki algorytm i dlaczego
> tam zapisałem.
Starałem się od początku, ale nie było to oczywiste, bo tamten
przykład podałem w innym celu i myślałem że z innego powodu
zarzucasz mi czas wstawiania O(N).
Nie ma problemu, mogę do bencznarków wrzucić i ten konkretny
przypadek z jednym insertem na N wyszukiwań. CHociaż bez
sprawdzania wiadomo na 99% że co do tego masz racje.
> Asymptotycznie to std::set daje to samo. myślałem, że
> walczysz o stałą;-)
A ja myślałem, że zarzucasz mi, że wstawianie mam gorsze
asymptotycznie, bo coś tam sortowanie psuje :D
Pozdrawiam
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) <=