🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #309381

Re: losowy element z QMap lub std:set

#309381
From: M.M.
Date: Sat, 12 Aug 2017 10:15
60 lines
4159 bytes
On Saturday, August 12, 2017 at 10:41:12 AM UTC+2, Wojciech Muła wrote:

> > Jak można to zrobić efektywniej? Trzeba zakodzić swoje drzewo czerwono
> > czarne? Jakbym zakodził swoje, to bym miał od razu na kiedyś statystyki 
> > pozycyjne...

> Wepnij własny alokator do std::map, niech on sobie trzyma liniową
> strukturę danych. I wtedy random robisz na tej strukturze.

Dziękuję za odpowiedź. To dobre rozwiązanie, chociaż nie mam 
doświadczenia z allocatorami, pewnie bym się namęczył zanim 
bym przebrnął przez to. Jeśli ktoś ma doświadczenie z 
allocatorami to zaproponowane przez Ciebie rozwiązanie chyba
jest optymalne pod względem nakładu pracy.

Po przemyśleniu doszedłem do ciut innego rozwiązania. Chciałem 
wyprowadzić klasę z QMap, a potem nadpisać wstawianie i usuwanie. 
W osobnej strukturze chciałem trzymać iteratory.

Potem jednak zastanowiłem się dalej i napisałem swoją wersję 
drzewa czerwono czarnego. Nie używam (jawnie) allocacji. Całość
oparłem o klasę QVector. Elementy drzewa nie mają wskaźników
do rodzica i potomków, lecz mają indeksy w QVector.

Uzyskałem w ten sposób szereg niezamierzonych i nieprzewidzianych
efektów. 

Po pierwsze, gdy program mało robi poza operacjami na drzewie, to 
działa od 1.5 do nawet 2 razy szybciej niż QMap i std::set. Mam
na myśli takie operacje jak wstawianie, przeszukiwanie z 
przodu do tyłu i z tylu do przodu, lower_bound, upper_bound, 
wyszukiwania i usuwania jeszcze nie sprawdzałem. Gdyby 
program tylko operował na drzewie, co jest niemożliwe, to pewnie
wersja na QVectorze działałąby 3 razy szybciej.

Drugi efekt, dane w qvector można posortować w czasie trochę
ponad liniowym względem ilości danych. Gdy jest dużo wyszukiwania,
to opłaca się posortować, a potem wyszukiwać binarnie na
wektorze. Wyszukiwanie na wektorze jest znacznie szybsze niż
na drzewie, może z 5 razy.

Kolejny efekt, mogę zwracać z drzewa referencje do danych nie-const.
Jeśli wiem że modyfikacja danych nie wpłynie na porządek w drzewie,
to nie muszę robić czasochłonnych:
remove
modify
insert

Dalej, gdy chodzi o QMap, to niestety ten szablon działa tylko dla
pary elementów, czyli trzeba zdefiniować pustą klasę Empty. Myslę, że
kompilatory całkowicie nie potrafią wywalić operacji na pustej klasie i
dodatkowo spowalniają cały kod.


Najdziwniejsze jest że moja wersja działa szybciej. Nie wiem dlaczego.
QMap nie jest thread-safety, std::set chyba też nie jest, więc żadnych
istotnych różnic w funkcjonalności nie widzę. Czyżby implementacja na
QVector dawała takie przyspieszenie?

Pozdrawiam
Technical Details
Message-ID: <6123a455-1178-499c-b864-718ff4a2a5ad@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin.stu.neva.ru!peer02.am4!peer.am4.highwinds-media.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!m34no162376iti.0!news-out.google.com!n39ni303qtf.1!nntp.google.com!w51no616233qtc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <3daf52db-2ca9-43fb-9ac4-fb0a5e010681@googlegroups.com> <928d2ead-1810-493c-b73d-e84c3b3775f9@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 10.99.98.2 with SMTP id w2mr12208486pgb.113.1502532911289;        Sat, 12 Aug 2017 03:15:11 -0700 (PDT)
X-Received: by 10.31.69.82 with SMTP id s79mr106985vka.2.1502532911200; Sat, 12 Aug 2017 03:15:11 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin.stu.neva.ru!peer02.am4!peer.am4.highwinds-media.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!m34no162376iti.0!news-out.google.com!n39ni303qtf.1!nntp.google.com!w51no616233qtc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Sat, 12 Aug 2017 03:15:10 -0700 (PDT)
In-Reply-To: <928d2ead-1810-493c-b73d-e84c3b3775f9@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=178.36.207.100; posting-account=xjvq9QoAAAATMPC2X3btlHd_LkaJo_rj
NNTP-Posting-Host: 178.36.207.100
References: <3daf52db-2ca9-43fb-9ac4-fb0a5e010681@googlegroups.com> <928d2ead-1810-493c-b73d-e84c3b3775f9@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <6123a455-1178-499c-b864-718ff4a2a5ad@googlegroups.com>
Subject: Re: losowy element z QMap lub std:set
From: "M.M." <mmarszik@gmail.com>
Injection-Date: Sat, 12 Aug 2017 10:15:11 +0000
X-Received-Body-CRC: 4261346
X-Received-Bytes: 4565
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit