Цель:
Напишите функцию, которая принимает два параметра: (1) строку, представляющую текстовый документ, и (2) целое число, указывающее количество возвращаемых элементов. Реализуйте функцию таким образом, чтобы она возвращала список строк, упорядоченных по частоте слов, начиная с наиболее часто встречающегося слова. Используйте свое лучшее суждение, чтобы решить, как слова разделены. Ваше решение должно выполняться за время O(n), где n — количество символов в документе.
Я думал, что в худшем случае на вход функции может поступить общее количество слов в документе, что сведет проблему к сортировке слов по их частоте. Это натолкнуло меня на мысль, что нижняя граница временной сложности будет равна O (n log n), если я буду использовать метод сравнительной сортировки. Итак, я подумал, что лучшим подходом было бы реализовать сортировку подсчетом. Вот мой код.
Я хотел бы, чтобы вы сказали мне, верен ли мой анализ, я аннотировал код своим представлением о временной сложности, но он определенно может быть неверным. Какова фактическая временная и пространственная сложность этого кода? Также я хотел бы услышать, действительно ли это хороший подход, есть ли какие-либо альтернативные подходы, которые можно было бы использовать на практике.
### n is number of characters in string, k is number of words ###
def word_frequencies(string, n)
words = string.split(/\s/) # O(n)
max = 0
min = Float::INFINITY
frequencies = words.inject(Hash.new(0)) do |hash,word| # O(k)
occurrences = hash[word] += 1 # O(1)
max = occurrences if occurrences > max # O(1)
min = occurrences if occurrences < min # O(1)
hash; # O(1)
end
### perform a counting sort ###
sorted = Array.new(max + words.length)
delta = 0
frequencies.each do |word, frequency| #O(k)
p word + "--" + frequency.to_s
index = frequency
if sorted[index]
sorted[index] = sorted[index].push(word) # ??? I think O(1).
else
sorted[index] = [word] # O(1)
end
end
return sorted.compact.flatten[-n..-1].reverse
### Compact is O(k). Flatten is O(k). Reverse is O(k). So O(3k)
end
### Total --- O(n + 5k) = O(n). Correct?
### And the space complexity is O(n) for the hash + O(2k) for the sorted array.
### So total O(n).
text = "hi hello hi my name is what what hi hello hi this is a test test test test hi hi hi what hello these are some words these these"
p word_frequencies(text, 4)