-
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
atman.pl!.POSTED!not-for-mail
From: bartekltg <b...@g...com>
Newsgroups: pl.comp.programming
Subject: Re: sortowanie
Date: Sun, 14 Oct 2012 00:04:30 +0200
Organization: ATMAN - ATM S.A.
Lines: 147
Message-ID: <k5cohl$7u5$1@node1.news.atman.pl>
References: <k59gbj$be7$1@node2.news.atman.pl>
<6...@g...com>
<k59jgh$mb7$1@mx1.internetia.pl> <k59jvr$360$1@node1.news.atman.pl>
<k59q5n$np3$1@mx1.internetia.pl> <k5a1ih$slr$1@node2.news.atman.pl>
<k5bd6c$a6c$1@mx1.internetia.pl> <k5blvn$3nk$1@node1.news.atman.pl>
<k5chsn$f2b$1@mx1.internetia.pl>
NNTP-Posting-Host: 144-mi3-6.acn.waw.pl
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: node1.news.atman.pl 1350165877 8133 85.222.69.144 (13 Oct 2012 22:04:37 GMT)
X-Complaints-To: u...@a...pl
NNTP-Posting-Date: Sat, 13 Oct 2012 22:04:37 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120907
Thunderbird/15.0.1
In-Reply-To: <k5chsn$f2b$1@mx1.internetia.pl>
Xref: news-archive.icm.edu.pl pl.comp.programming:199835
[ ukryj nagłówki ]W dniu 2012-10-13 22:05, Michoo pisze:
> On 13.10.2012 14:14, bartekltg wrote:
>> Złożoność oczywiście pozostaje, ale jakieś tam korzyści
>> w działaniu mogą się pojawić.
>> Ale mam coś lepszego. Autor pewnej bardzo popularnej książki
>> do "c++ i szablonów" buduje wyszukiwanie binarne latając
>> po kontenerze ++owaniem iteratora. Komentuje to "++ jest szybkie".
> Nie trafiłem - można prosić o tytuł? (Ja za to spotkałem profesora z
> ciekawą definicją "native code". ;) )
Chyba Pasja c++. Próbowałem przekartkować i odszukać
ten kwiatek, ale na szybko nie widzę.
>>>> Żeby nie był to problem czysto akademicki,
>>>> niech to będzie 'końcówka qsorta'. Wtedy wywoływany
>>>> obszar i tak już najpewniej jest pod ręką.
>>>
>>> Ale w takiej sytuacji jest heapsort działający zawsze w n*log(n) ;)
>>
>> Mylisz sytuację.
>> Nie chodzi o problem qsorta z niektórymi danymi,
>> tylko o to, że gdy, w czasie zrównoważonego działania,
>> dochodzimy do rekursywnego wywołania qsorta dla odpowiednio
>> małych obszarów, odpala się jakiś mały zwarty n^2.
> Z tego co kojarzę standardowym jest użycie heapsorta albo mergesorta
> zależnie, czy zależy nam na stabilności. Po co używać coś o złożoności
> n^2 skoro ma się rozwiązania n*log(n)?
Ale standardowym w jakiej sytuacji? Ja mówię o odcięciu
gałęzi rekurencji i walnięciu tam n^2.
_Wydaje_ mi się, że ty mówisz o odpaleniu heapsorta,
gdy qsort dokonuje złych podziałów.
http://www.sgi.com/tech/stl/sort.html //notes[2]
http://en.wikipedia.org/wiki/Introsort
Po co używać n^2 zamiast nlogn?
Bo to n^2 jest szybsze, gdy n jest małe.
I wydajne biblioteczne implementacje robią to tak,
że jak qsort dochodzi do rekurencyjnego wywołania
na tablicy np 20, odpala n^2.
Jak nadal nie wierzysz, zerknij do STLa;)
http://www.sgi.com/tech/stl/download.html
plik stl_algo.h
linijka ~1466, sort.
odpalamy insertionsort (__introsort_loop 1423) z zadanym limitem.
Jest to qsort, z jedną odnoga rekurencji wykonywaną w pętli.
I teraz dwie specjalne zmienne.
Po pierwsze, bada głębokość rekurencji. Jeśli jest większa,
niż zadana, przerzuca na partialsort(first,last,last),
który to jest zaimplementowany kopcem.
Jest to cześć, o której mówisz.
Ale jeśli głębokość nie przekroczy wyznaczonej granicy,
leci qsort. Aż do momentu, gdy
(__last - __first > __stl_threshold)
Wtedy wychodzimy z introsort!
Sprząta, czyli sortuje te odcinku insertionsort
odpalany w sort zaraz po introsort.
To jest usprawnienie, o którym mówiłem.
>> q_med to qsort z medianą z ilu wartości? Wszystkich z przedziału?
> z 3 losowych
Hmm, spory narzut dało:/
>> Wyniki.. cóż, mnie zaskoczyły. Sprawdziłem nawet zamieniajac
>> w procedurze testowej funkcje miejscami.
> A ja jak źle spojrzałem na wykres - insertion u nie też był odrobinę
> szybszy.
> http://grota.be/~michoo/smieci/sort2.png
A dopiero co pisałeś 'nie ma co dyskutować' ;)
Przewaga stała na skali logarytmicznej. Czyli
stale 'a razy szybszy'. Ale znacznie mniejsza przewaga
niż u mnie. Jakbyś gdzieś odkopał kod, chętnie bym zobaczył.
>> Trochę mnie to dziwi. Błędu w implementacji nie widzę.
>> czyżby znów cache i liniowy spacer po pamięci?
> Średnio wychodzi trochę mniej operacji. Selection ma zawsze 1/2n^2 a
> insertion tyle pesymistycznie a średnio połowę. Btw właśnie tak mi
> wyszło, że insertion można przedstawić jako "bąbelki od drugiej strony".
Różni się jednym 'szczegółem'. Bąbelek robi mnóstwo swapów,
insertionsort zapisuje sobie 'bąbelka' na boku i robiąc
na niego miejsce operuje tylko na przesuwanych obiektach.
Nie mówiąc już o tym, że naiwnie napisany bąbelek zaczyna
od dołu, zamiast z najbliższego miejsca nieposortowanej
tablicy i leci do samego końca, nawet, gdy nie trzeba już
nic poprawiać.
Ale podobieństwo oczywiście jest
>
>
> Co ciekawe mój selection był minimalnie szybszy od Twojego, mimo dużego
> podobieństwa:
> void selection(int n,T* data)
> {
> for(int i=0,p=0;i<n;++i,p=i){
> for(int j=i+1;j<n;++j)
> if(data[j]<data[p])
> p=j;
> std::swap(data[i],data[p]);
> }
> }
Hmm, a jak porównywałeś?
Jeśli niedużo, to obstawiam korzyści z zera:)
Kompilator sobie odwraca i zamiast porownywać
z n porównuje z n?
Podgląd asm tego nie potwierdza. Różnica była
dla małych n<100. Przekazanie trzeciego parametru?
Po przerobieniu tego na wersję z początkiem i końcem
void selection2(int * data,int first,int n)
{
for(int i=first,p=first;i<n;++i,p=i){
for(int j=i+1;j<=n;++j)
if(data[j]<data[p])
p=j;
std::swap(data[i],data[p]);
}
}
z dokładnością do szumu jest to samo.
pzdr
bartekltg
Następne wpisy z tego wątku
- 14.10.12 00:04 bartekltg
- 14.10.12 00:10 M.M.
- 14.10.12 00:18 bartekltg
- 14.10.12 00:21 M.M.
- 14.10.12 00:35 PK
- 14.10.12 00:41 bartekltg
- 14.10.12 00:49 bartekltg
- 14.10.12 00:51 PK
- 14.10.12 00:54 bartekltg
- 14.10.12 00:58 bartekltg
- 14.10.12 00:59 PK
- 14.10.12 01:03 bartekltg
- 14.10.12 01:08 bartekltg
- 14.10.12 01:19 Edek Pienkowski
- 14.10.12 01:16 PK
Najnowsze wątki z tej grupy
- 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
- Press Release - AEiC 2023, Ada-Europe Reliable Softw. Technol.
- Ada-Europe - AEiC 2023 early registration deadline approaching
- Ada-Europe Int.Conf. Reliable Software Technologies, AEiC 2023
- Ile cykli zajmuje mnożenie liczb 64-bitowych?
Najnowsze wątki
- 2024-05-26 O co chodzi?
- 2024-05-26 PJ autobus-tramwaj
- 2024-05-26 Renault Trafic i lampka z czerwonym STOP
- 2024-05-26 cena pięciocyfrowa
- 2024-05-26 Re: Jak dobra KE "okrada" złą Rosję "dla Ukrainy"
- 2024-05-25 supercap
- 2024-05-25 Sulzbach => Technischer Rollouter (d/m/w) <=
- 2024-05-25 Warszawa => Senior Account Manager <=
- 2024-05-25 Warszawa => Mid PHP Developer (Laravel) <=
- 2024-05-25 Warszawa => Mid PHP Developer (Laravel) <=
- 2024-05-25 Warszawa => Interactive/Experience Designer <=
- 2024-05-25 Warszawa => Key Account Manager <=
- 2024-05-25 Warszawa => SAP WM Consultant / Execution <=
- 2024-05-25 Warszawa => Key Account Manager <=
- 2024-05-25 Re: znów ten wrocław