Informatika gyűjtemény

Egy szinttel feljebb Megoldás

2004050607080910

NézetNyomtat

Algoritmus

Generáljuk az n szám összes partícióját, és mindegyikre elindítjuk a szolitert.

A kupacok ábrázolása

Célszerű a kupacok méretét egy csökkenően rendezett listában tárolni, ekkor mindig a lista végéről kell törölni (egyesek), és egy új elemet kell rendezetten beszúrni.

A periódus felderítése

Ahhoz, hogy észleljük az ismétlődést, tudnunk kell, milyen állapotokban jártunk eddig. Mivel az összes állapotból ki fogunk indulni, felépíthetjük az állapotátmenetek irányított gráfját. (Minden állapotból /partícióból/ egy él indul ki.) Ha olyan állapotba lépünk, ami már szerepelt, leállhatunk.
A memóriaigény és a futási idő becsléséhez tudnunk kell, hogy n-től függően hány partíció van, vagy legalábbis kell egy jó felső becslés.

Partíciók száma

A partíciók számára nem ismert zárt formula, csak aszimptotikus becslések.
Néhány példa, a nagyságrend érzékeléséhez:
npartíciók száma
10 42
50 204226
100 190569292
150 40853235313
200 3972999029388
250 230793554364681
300 9253082936723602

Elméleti érdekességek

Ismert, hogy ha n háromszögszám, akkor a bolgár szoliter véges sok lépésben az $\{1,2,3,\ldots\}$ fixpontba érkezik, függetlenül a kiinduló állástól.
Sejtés: a bolgár szoliter bármely elemszám esetén egyetlen ciklusba érkezik, ami független a kiinduló állástól.

Kódok

Partíció generálás

Kramer András, (rekurzív változat), (C#): particio.cs
Uray János, (iteratív változat), (C++): particio.cpp

Bolgár szoliter

Uray János, (C++): bolgar.cpp
Sztranyák Attila, (Pascal): bolgar.pas
Kriván Bálint, (Ruby): bolgar.rb