Я ищу возможность реализовать на VBA алгоритм построения триэалгоритм, способный обработать значительный английский лексикон (~50,000 слов) за относительно короткое время (менее 15-20 секунд). Поскольку я по образованию программист C++ (и это мой первый опыт работы с VBA), я создал быструю пробную программу, которая смогла выполнить задачу на моем компьютере примерно за полсекунды. Однако когда пришло время протестировать порт VBA, на это ушло почти две минуты - неприемлемо много времени для моих целей. Код VBA приведен ниже:
Модуль класса Node:
Public letter As String
Public next_nodes As New Collection
Public is_word As Boolean
Модуль Main:
Dim tree As Node
Sub build_trie()
Set tree = New Node
Dim file, a, b, c As Integer
Dim current As Node
Dim wordlist As Collection
Set wordlist = New Collection
file = FreeFile
Open "C:\corncob_caps.txt" For Input As file
Do While Not EOF(file)
Dim line As String
Line Input #file, line
wordlist.add line
Loop
For a = 1 To wordlist.Count
Set current = tree
For b = 1 To Len(wordlist.Item(a))
Dim match As Boolean
match = False
Dim char As String
char = Mid(wordlist.Item(a), b, 1)
For c = 1 To current.next_nodes.Count
If char = current.next_nodes.Item(c).letter Then
Set current = current.next_nodes.Item(c)
match = True
Exit For
End If
Next c
If Not match Then
Dim new_node As Node
Set new_node = New Node
new_node.letter = char
current.next_nodes.add new_node
Set current = new_node
End If
Next b
current.is_word = True
Next a
End Sub
Мой вопрос заключается в том, можно ли ускорить этот алгоритм? Я видел в некоторых источниках, что Collection
-ы в VBA не так эффективны, как Dictionary
-ы, поэтому я попытался использовать Dictionary
-ую реализацию, но это заняло столько же времени, с еще худшим использованием памяти (500+ MB оперативной памяти, используемой Excel на моем компьютере). Как я уже сказал, я очень новичок в VBA, поэтому мои знания как его синтаксиса, так и общих возможностей/ограничений очень ограничены - вот почему я не верю, что этот алгоритм настолько эффективен, насколько это возможно; любые советы/предложения будут очень признательны.
Заранее спасибо
NB: Лексический файл, на который ссылается код, "corncob_caps.txt", доступен здесь (скачать файл "all CAPS")