Even een stapje terug: Per abuis bekeek ik laatst mijn oplossing bij de eerste uitdaging. Ik was niet geheel ontevreden met mijn oplossing van weleer, maar ik zag wel vrij snel in dat het mogelijk was om een oplossing te maken die 'beter' was (de rij rockets hoeft niet meer omgedraaid te worden).
Code: Selecteer alles
solution = foldl insertReplace [] rockets
where
insertReplace ys x = h ++ (x : (drop 1 t))
where
(h, t) = span (> x) ys
rockets = [6684, 8285, 6049, 933, 2383, 6443, 5208, 71, 2884, 3592, 4106, 166, 8214, 758, 5606, 6526, 5171, 1746, 7039, 1179, 7626, 3678, 9212, 8986, 8415, 4193, 5151, 6562, 7724, 1614, 6103, 4462, 8012, 923, 4654, 8494, 8842, 79, 9129, 1740]
Nu begon ik mij dingen af te vragen over de efficientie. Ik denk dat dit programma O(n^2) is, maar ik vermoed dat het O(log(n)) kan. Mijn vraag aan jullie is of jullie dat ook denken.
Even in woorden wat hier gebeurt:
Je hebt een rij van getallen die van hoog naar laag zijn gesorteerd en een nieuw getal. Dit nieuwe getal moet in de rij gezet worden. Als het nieuwe getal kleiner is dan elk getal in de rij dan wordt het nieuwe getal aan het einde van de rij gezet. Anders vervangt het het eerste getal in de rij waar het hoger dan is.
Mijn idee waarom dit O(log(n)) kan: Sla de getallen in de rij op in een of andere boomstructuur zodat je makkelijk dit getal kan vinden (bijvoorbeeld: linker tak altijd hoger dan huidige node, rechter lager, en dan een gebalanceerde boom). De hoogte van zo'n boom zou log(n) zijn, dus verwacht ik dat de efficientie dat ook ongeveer is. Mee eens?