Bogosort vs bogobogosort [stängt]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Stängd. Denna fråga är utanför ämnet . För närvarande accepteras inte svar.

Kommentarer

  • För mig kastar det 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); ^ ... vilken version av GCC ska jag köra den här?
  • I ' m på FreeBSD, med clang 3.4.1. Men du kan ta bort tidskoden för en helt standardversion av programmet.
  • Jag ' Jag röstar för att stänga den här frågan som utanför ämnet eftersom någon rimlig definition av " förbättring " kan inte tillämpas på den här koden, som bara syftar till att göra prestanda så dålig som möjligt.
  • Jag ' har stängt frågan eftersom koden ' inte fungerar som avsett (du ' frågar varför bogobogosort inte ' t fungerar långsamt).
  • Det ' är en bättre beskrivning av bogobogosort-algoritmen vid dangermouse.net/esoteric/bogobogosort.html – detta implementerar inte algoritmen som beskrivs där.

Svar

Inte bogobogosort

Hur du implementerade din bogobogosort är det faktiskt snabbare än bogosort becau se av några anledningar:

  1. När du lyckats bogosortera k -element, kontrollerar du omedelbart om k+1 element sorteras. Det betyder att om du på en tidigare blandning råkar blanda m element i ordning, kommer du omedelbart att nå m.

    Antag till exempel att du når fem kort och sedan misslyckas. Du blandar 5 kort och börjar sedan om 2. Om dessa 5 kort råkar vara i sorterad ordning når du omedelbart 6 så snart du ordnar de två första korten.

  2. På grund av punkt 1 är din bogobogosort faktiskt snabbare än bogosorten eftersom den bara behöver sortera n-1 -kort istället för n . När det har sorterat n-1 -kort kontrollerar det ordningen på n -kort och kan misslyckas. Men om det misslyckas, blandar det om n -kort så att varje gång det sorterar n-1 -kort har det ett 1/n chans att så småningom lyckas. Så det totala antalet kort som blandas är i storleksordningen (n-1) * (n-1)! * n vilket förenklar till (n-1) * n!, jämfört med bogosorten som blandar n * n! -kort.

    Jag tror att samma princip gäller i varje steg, så tiden är ännu mindre än (n-1) * n!. Jag är inte säker på den exakta matematiken, men från att köra ditt program verkar det som om bogobogosort körs ungefär samma tid som bogosort med ett kort färre. Det vill säga Your_bogobogosort (n) = bogosort (n-1).

En ordentlig bogobogosort

Jag skrev om din bogobogosort-funktion för att vara så här:

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; } 

Huvudskillnaden här är att det efter varje framgång där det ökar b, blandar det om däcket för att förhindra att punkt 1 ovan inträffar .. Med denna förändring får jag output så här:

% ./a.out 6 bogosort shuffled 1044 cards in 0.000013 seconds. bogobogosort shuffled 54464568 cards in 0.500339 seconds. 

Kommentarer

  • Enligt beskrivningen på Wikipedia kontrollerar den första delen av bogosort efter beställning data. Om de första N-elementen är i ordning gör en bogosort av dessa N-element inte en enda blandning. Så om jag har 0 1 2 3 4 6 5 och bogobogosort så går jag från bogosort från 2 till 5 element utan att blanda, blanda sedan 6 element (och gå tillbaka till bo gobogosorting 2).
  • @pmg Om det är rätt definition av bogobogosort visar det sig att vara snabbare än bogosort (som OP ' s program visar) . Jag ' är inte bekant med bogobogosorts ursprung men för att den ska " springa tills universumets värmedöd " som påstått, det ska se mer ut som den typ jag skrev.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *