Potrzebuje pomocy z ponizszym zadaniem:
Uzywajac jezyka JAVA mam napisac program (cos w rodzaju slownika T9 jak w telefonach komorkowych).
Program ma miec podstawowy interfejs graficzny z 12 klawiszowa klawiatura (taka jak w komorkach) i pole tekstowe gdzie wpisujemy tekst.
Na poczatek tworzymy slownik wyrazow na podstawie jakiegos tekstu (tekst potem wczutujemy do programu). Kazdy wyraz zostanie zapisany w tablicy (array) a obok niego podana jest jego czestotliwosc wystepowania.
Po wpisaniu pierwszej litery z klawiatury, program powinien wyswietlic najczesciej uzywane slowa zaczynajace sie z tej litery tak, zeby mozna bylo szybko wybrac ktorys z sugerowanych wyrazow.
Po wpisaniu kazdej kolejnej litery program powinien zawezic liczbe wyrazow i znowu wyswietlic liste z najczesciej uzywanymi slowami.
Jesli po wpisaniu jakiejs kombinacji klawiszy, nie ma zadnych sugestii, powinna pojawic sie opcja aby recznie dodac slowo do slownika.
Moj najwiekszy problem w tej chwili, to: Jakiej struktury danych uzyc, do stworzenia takiego programu i jak napisac algorytm? Chcialem jeszcze zaznaczyc ze zalezy mi na jak najlepszej wydajnosci = najmniejszej zlozonosci algorytmu. Kilka sugestii ponizej:
1) Dwu wymiarowe tablice (2 dimensional arrays).
Ta opcja byla by chyba bardzo nieefektywna, ze wzledu na marnowanie miejsca. Jesli np: najdluzszy wyraz mialby dlugosc ‘n’, trzeba byloby stworzyc miejsce dla 26^n (26 do potegi n) * 26 bo tyle jest liter w angielskim alfabecie?!?
Nie wiem czy to co napisalem powyzej ma sens, tak wiec prosze podajcie wszystkie ZA i PRZECIW tej struktury danych do implementacji powyzszego programu (czy to w ogole mozliwe).
2) Tablica Mieszajaca (Hash Table).
Slyszalem, ze tablica mieszajaca jest dobra do znajdowania konkretnych elementow (wyrazow), ale w tym przypadku, po wcisnieciu kazdej litery, powinnismy otrzymac liste sugestii, tak wiec... czy Tablica Mieszajaca w tym przypadku bylaby dobrym rozwiazaniem? Jesli tak, jak to by wygladalo?
3) Odmiana Drzewa Binarnego (z angielskiego: TRIE)
Mniej znana struktura danych, ktora z tego co sie dowiedzialem wydaje sie byc najlepsza do implementacji powyzszego programu. Niestety nie moglem znalezc za wiele informacji w internecie na temat TRIE’s i nie wiem dokladnie jak by to mialo dzialac... Bylbym wdzieczny, gdyby ktos wypowiedzial sie rowniez na temat tej struktury danych do implementacji powyzszego programu. Czy jest ona najlepsza, czy moze jedyna?
Ponizej moje ‘wyobrazenie’ implementacji programu z uzyciem TRIE’s (odmiana Drzewa Binarnego) oraz pare pytan. Uprzedzam, ze to co napisalem moze sie nie trzymac kupy i nie miec sensu... ale chcialbym przedstawic jak to obecnie wyglada w mojej glowie, zebyscie mogli mi w jakis sposob pomoc. Bylbym bardzo wdzieczny za poprawnienie ponizszego tekstu, lub opisanie poprawnego dzialania programu z uzyciem drzewa TRIE wlasnymi slowami.
a) Samo drzewo TRIE implementujemy uzywajac ArrayList dostepnej w JAVA?
b) Wartosc kazdego Noda w tym drzewie to link do obiektu (ArrayList, w ktorym znowu przechowujemy 26 obiektow z literami od A do Z i z ich liczbowa czestotliwoscia wystepowania).
c) I tak, jesli w programie wpiszemy jako szukane slowo pierwsza litere ‘C’, to program odwiedzi pierwszy Nod w drzewie (header), i stamtad przejdzie to obiektu w tablicy o 2 indeksie (litery ‘C’).
d) Teraz idziemy o jeden poziom w dol
e) Odczytujemy liste wszystkich slow zaczynajacych sie na ‘C’. (TYLKO NIE WIEM JAK ODCZYTUJEMY TE SLOWA??)
f) Sprawdzamy, ktore ze slow sa najczesciej uzywane (przez porownanie czestotliwosci poszczegolnych slow)
g) Zwracamy kilka najczesciej uzywanych slow zaczynajacych sie na ‘C’. (I TUTAJ NIE WIEM W JAKI SPOSOB MOZEMY POLACZYC NASZE AKTUALNE MIEJSCE W DRZEWIE 'NP: 'C' z tablica calego slownika, z ktorego bedziemy wczytywac wszystkie slowa zaczynajace sie na 'C').
h) Po dodaniu kolejnej litery ‘C’ + ‘A’, program odwiedza 1 Nod i przechodzi do indeksu 2 (z litera ‘C’)
i) Nastepnie idzie o jeden poziom nizej (na lewo od C, bo A < C), odwiedza Nod i wchodzi do tablicy (array), gdzie wchodzi na 0 index (gdzie jest litera ‘A’).
j) Nastepnie program odczytuje liste wszystkich slow zaczynajacych sie na ‘CA’. CZY COS TAKIEGO MOZNA ZROBIC POPRZEZ POROWNANIE LITER NA PIERWSZYCH DWOJ MIEJSCACH WYRAZU (charAt(0) i charAt(1))??
k) Program sprawdza, ktore slowa sa najczesciej uzywane, poprzez porownanie wartosci ‘czestotliwosc’ pomiedzy poszczegolnymi slowami.</span>
Zastanawiam sie do czego (w jaki sposob) mozna uzyc indeksowania samego drzewa zeby miec szybki dostep do konkretnego noda? Np: Skad bedziemy wiedziec, ze slowa rozpoczynajace sie na ‘CA’ beda ponizej Noda o indeksie np: 20, a nie w Nodzie o indeksie 100?
Do tej pory skupialem sie na rozwiazaniu problemu przyjmujac, ze uzywamy klawiatury QWERTY, gdzie kazdy klawisz odpowiada 1 literze.
Kolejnym krokiem i zarazem nastepnym problemem bedzie implementacja programu z uzyciem 12 klawiszowej klawiatury telefonu, gdzie 1 klawisz odpowiada 3 lub 4 literom... co na pewno uczyni caly algorytm bardziej zlozonym...
Pozdrawiam i z gory dziekuje za wszelka pomoc/wskazowki