Kommentit
vastaus
ei bogobogosort
Tapa, jolla toteutit bogobogosortisi, on itse asiassa nopeampi kuin bogosort becau muutamista syistä:
-
Kun olet onnistuneesti bogosort
k
-elementit, tarkistat heti, onkok+1
-elementit lajitellaan. Tämä tarkoittaa, että jos edellisessä sekoituksessa sattuit sekoittamaanm
-elementtejä kaikki järjestyksessä, sitten kun lajittelet kaksi ensimmäistä elementtiä, pääset hetim
.Oletetaan esimerkiksi, että saavutat 5 korttia ja epäonnistut sitten. Sekoitat 5 korttia ja aloitat sitten alusta kohdasta 2. Jos nämä 5 korttia sattuu olemaan lajiteltu järjestyksessä, saavut heti kuusi heti, kun laitat kaksi ensimmäistä korttia järjestykseen.
-
Pisteen 1 takia bogobogosort on todella nopeampi kuin bogosort, koska sen täytyy vain lajitella
n-1
-kortitn
. Kun se lajitteleen-1
kortit, se tarkistaan
-korttien järjestyksen ja saattaa epäonnistua. Mutta epäonnistumisessa se muuttaan
-kortteja siten, että joka kerta kun lajitteleen-1
kortit, sillä on1/n
mahdollisuus menestyä. Joten sekoitettujen korttien kokonaismäärä on luokkaa(n-1) * (n-1)! * n
, mikä yksinkertaistuu muotoon(n-1) * n!
verrattuna bogosorttiin, joka sekoittaan * n!
-kortit.Uskon, että sama periaate pätee kussakin vaiheessa, joten aika on jopa pienempi kuin
(n-1) * n!
. En ole varma tarkasta matematiikasta, mutta ohjelman suorittamisesta näyttää siltä, että bogobogosort toimii suunnilleen samaan aikaan kuin bogosort yhdellä kortilla vähemmän. Eli Sinun_bogobogosort (n) = bogosort (n-1).
Oikea bogobogosort
Kirjoitin bogobogosort-toimintosi uudestaan seuraavasti:
unsigned long bogobogosort(int *data, size_t n) { unsigned long c = 0; size_t b = 2; while (1) { if (sorted(data, b)) { if (b == n) break; b++; } else { b = 2; } c += b; shuffle(data, b); } return c; }
Tärkein ero tässä on se, että jokaisen menestyksen jälkeen, jossa se kasvaa b
, se muuttaa kannen uudelleen estääkseen yllä olevan piste 1: n. Tämän muutoksen myötä saan seuraavanlaisen tuloksen:
% ./a.out 6 bogosort shuffled 1044 cards in 0.000013 seconds. bogobogosort shuffled 54464568 cards in 0.500339 seconds.
Kommentit
- Wikipedian kuvauksen mukaan bogosortin ensimmäinen osa tarkistaa tilauksen data. Jos ensimmäiset N elementtiä ovat järjestyksessä, näiden N elementtien bogosortti ei tee yhtä sekoitusta. Joten jos minulla on
0 1 2 3 4 6 5
ja bogobogosort, siirryn bogosortista 2-5 elementtejä ilman sekoittamista, sekoita sitten 6 elementtiä (ja palaa takaisin bo gobogosorting 2). - @pmg Jos tämä on oikea bogobogosort-määritelmä, se osoittautuu nopeammaksi kuin bogosort (kuten OP ' s -ohjelma todistaa) . En ' ole perehtynyt bogobogosortin alkuperään, mutta jotta se " toimisi universumin lämpökuolemaan asti " väitetysti sen pitäisi näyttää enemmän kuin kirjoittamani.
sorties.c: In function ‘timedelta’: sorties.c:82:18: error: dereferencing pointer to incomplete type double aa = a->tv_sec + (a->tv_nsec / 1000000000.0); ^ sorties.c:82:31: error: dereferencing pointer to incomplete type double aa = a->tv_sec + (a->tv_nsec / 1000000000.0); ^ sorties.c:83:18: error: dereferencing pointer to incomplete type double bb = b->tv_sec + (b->tv_nsec / 1000000000.0); ^ ...
minkä version GCC: stä minun pitäisi suorittaa tämä?