Okej, więc, powiedzmy, że mam plik tekstowy (niekoniecznie zawierający każdy możliwy symbol) i chciałbym obliczyć częstotliwość każdego symbolu i, po obliczeniu częstotliwości, muszę uzyskać dostęp do każdego symbolu i jego częstotliwości od najczęstsze lub najmniej częste. Symbole nie muszą być znakami ASCII, mogą to być dowolne sekwencje bajtów, choć wszystkie o tej samej długości.Czy istnieje lepszy sposób obliczania częstotliwości wszystkich symboli w pliku?
Zastanawiałem się robi coś takiego (w Pseudokod):
function add_to_heap (symbol)
freq = heap.find(symbol).frequency
if (freq.exists? == true)
freq++
else
symbol.freq = 1
heap.insert(symbol)
MaxBinaryHeap heap
while somefile != EOF
symbol = read_byte(somefile)
heap.add_to_heap(symbol)
heap.sort_by_frequency()
while heap.root != empty
root = heap.extract_root()
do_stuff(root)
zastanawiałem się: czy istnieje lepszy, prostszy sposób obliczyć i przechowywać, ile razy każdy symbol występuje w pliku?
Wygląda na to, że masz dwie opcje: hashmap, która daje O (1) pobieranie częstotliwości, ale nie ma uporządkowanych (najczęstsze lub najmniej częste) wyników LUB O (lg n) wstawia i wyszukuje za pomocą drzewa wyszukiwania/sterty, ale daje ci zamówioną (najbardziej częste do najmniej częstych). –
Binarna sterty nie jest szczególnie dobra struktura danych, ponieważ znalezienie dowolnego węzła w sterty jest dość drogie. Lepiej byłoby z drzewem binarnym lub, jak inni zauważyli, pewnego rodzaju tablicą haszującą. –