Я ищу для реализации VBA trie - алгоритм построения, способный обрабатывать существенные Английский лексикон (~ 50 000 слов) за относительно короткий промежуток времени (менее 15-20 секунд). Поскольку я практиковал программист на С++ (и это мой первый опыт выполнения VBA), я разработал простую концептуальную программу, которая могла выполнить задачу на моем компьютере примерно через полсекунды. Однако, когда пришло время проверить порт VBA, потребовалось почти две минуты, чтобы сделать то же самое - недопустимо большое количество времени для моих целей. Код VBA ниже:
Node Модуль класса:
Public letter As String
Public next_nodes As New Collection
Public is_word As Boolean
Основной модуль:
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
Мой вопрос тогда просто, может ли этот алгоритм ускоряться? Я видел из некоторых источников, что VBA Collection
не так эффективны, как Dictionary
, и поэтому я попытался реализовать реализацию на основе Dictionary
, но потребовалось равное количество времени, чтобы выполнить еще худшее использование памяти (500+ МБ ОЗУ, используемое Excel на моем компьютере). Как я уже сказал, я чрезвычайно новичок в VBA, поэтому мои знания как его синтаксиса, так и его общих возможностей/ограничений очень ограничены - вот почему я не считаю, что этот алгоритм настолько эффективен, насколько это возможно; любые советы/предложения были бы с благодарностью.
Заранее спасибо
Примечание. Файл лексики, обозначенный кодом "corncob_caps.txt", доступен здесь (загрузите "все CAPS", файл)