Есть ли способ ускорить этот алгоритм VBA?

Я ищу возможность реализовать на 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")

11
задан chris neilsen 14 June 2014 в 01:01
поделиться