Chcę zbudować iterator do generowania dwóch (bardzo zbliżonych) typów nieskończonych ciągów. Nazwijmy je "dwójkowy" i "trójkowy".
Dwójkowy ma postać:
aabaabcaabaabcdaabaabcaabaabcde....
Trójkowy ma postać:
aaabaaabaaabcaaabaaabaaabcaaabaaabaaabcd...
Dwójkowy można zbudować tak:
- Startujemy od ciągu złożonego z jednej litery
- W każdej kolejnej iteracji, łączymy ciąg ze swoją kopią, a na koniec dodajemy najmniejszą, nie użytą jeszcze literę.
Kolejne kroki konstrukcji wyglądają więc tak:
- a
- aab
- aabaabc
- aabaabcaabaabcd
itd
Trójkowy można zbudować analogicznie, tylko w punkcie drugim, zamiast łączenia z jedną dodatkową kopią, łączymy z dwiema dodatkowymi kopiami.
Zamiast sklejania ciągów chcę mieć jednak iterator do generowania ciągów. Po wygenerowaniu n-tego znaku iterator powinien zawierać w sobie stan o rozmiarze O(lg n) (względnie O(lg2 n) jeżeli zakładamy zmienną długość typów danych, np BigInteger, ale załóżmy, dla prostoty, że nie wygenerujemy nigdy więcej jak np 260 znaków). Wygenerowanie jednego znaku (w dowolnym stanie iteratora) powinno mieć złożoność zamortyzowaną O(1).
Ma ktoś pomysł? :D
PS:
A może takie ciągi mają już swoją nazwę i ktoś ma już sposób na ich generowanie?