Rozwiązanie oparte na haszcie
Nie jestem pewien, dlaczego hashtable sprawia, że złożoność Ω (n2)) gdyby nto liczba znaków (nie słów).
Jeśli wykonujesz iterację po każdym znaku w dokumencie i podczas iteracji, oblicz kod skrótu tego słowa, przejdziesz npostacie. Oznacza to, że zaraz po napotkaniu litery zaczyna się słowo, więc zacznij obliczać skrót aż do końca słowa (istnieją specjalne przypadki interpunkcji, ale nie mają one wpływu na złożoność). Dla każdego słowa, po obliczeniu skrótu, dodaj je do tablicy skrótów. Ma to na celu uniknięcie dwukrotnego przejścia do każdego słowa, tzn. Najpierw iterację dokumentu w celu znalezienia słów, a następnie wstawienie ich do tablicy haszującej, chociaż w takim przypadku złożoność może być równieżΩ ( n ).
Zderzenia w tablicy hashującej z pewnością stanowią problem, a w zależności od tego, jak duży był oryginalny hashtable i jak dobry jest algorytm hashujący, można zbliżyć się do O ( 1 ) do wstawiania i liczenia, a tym samym O ( n )dla algorytmu, choć kosztem pamięci. Nadal jednak nie potrafię docenić, jak najgorszy przypadek można stwierdzićO (n2)) gdyby n to liczba znaków.
Zakłada się, że algorytm mieszający jest liniowy w czasie w stosunku do liczby znaków.
Rozwiązanie oparte na sortowaniu Radix
Alternatywnie, zakładając, że angielski, ponieważ długość słów jest dobrze znana, zamiast tego utworzę siatkę i zastosuję sortowanie radix, które jest O ( k N) gdzie k będzie maksymalną długością słowa w języku angielskim, oraz N.to łączna liczba słów. Danyn to liczba znaków w dokumencie, oraz k jest stałą, asymptotycznie to kwoty O ( n ).
Teraz policz częstotliwość każdego słowa. Ponieważ słowa są posortowane, będziemy porównywać każde słowo z poprzednim słowem, aby sprawdzić, czy jest to to samo, czy inne. Jeśli jest taki sam, usuwamy słowo i dodajemy liczbę do poprzedniego. Jeśli jest inny, po prostu policz 1 i przejdź dalej. To wymaga2 n porównania gdzie n to liczba znaków, a zatem O ( n ) w złożoności jako całości.
Kilka najdłuższych słów w języku angielskim jest absurdalnie długie , ale potem można ograniczyć długość słowa do rozsądnej liczby (np. 30 lub mniejszej) i obciąć słowa, przyjmując margines błędu, który może z tym wynikać.