Как я могу оптимизировать эту функцию Lua? - PullRequest
0 голосов
/ 26 мая 2020

В настоящее время просто ищу способ ускорить этот код.

Эта функция в настоящее время принимает строку s и int k и возвращает подстроку длины s k с наибольшим количеством гласных.

Пример:

s = caberqiitefg
k = 5

Вывод:

erqii

erqii - это подстрока длины 5 с наибольшим количеством гласных в s.

Возвращает «Не найдено!» если в строке нет гласных.

function findSubstring(s, k)
    local sub = string.sub
    local gsub = string.gsub
    local vowels = "[aeiou]"
    local empty = ""
    local _, numberOfVowels = gsub(s, vowels, empty)
    if numberOfVowels == 0 then
        return "Not found!"
    end
    local mostVowels = nil
    local vowelnum = 0
    for i = 1, #s - k + 1 do
        local curr = sub(s, i, k + i - 1)
        local _, nvow = gsub(curr, vowels, empty)
        if mostVowels == nil or (nvow > vowelnum) then
            mostVowels = curr
            vowelnum = nvow
        end
    end
    return mostVowels
end

1 Ответ

0 голосов
/ 27 мая 2020

Не совсем, но я обнаружил, что эта модифицированная версия работает лучше в некоторых случаях


function findSubstring2(s, k)
    local sub = string.sub
    local gsub = string.gsub
    local vowels = "[aeiou]"
    local empty = ""
    local _, numberOfVowels = gsub(s, vowels, empty)
    if numberOfVowels == 0 then
        return "Not found!"
    end

    local candidate = nil
    local vowelnum = 0
    local i=1
    while i <= #s-k+1 do
        local curr = sub(s, i, k + i - 1)
        local _, nvow = gsub(curr, vowels, empty)
        if nvow > vowelnum then
            candidate = curr
            vowelnum = nvow
        end
        i=i+(curr:find(vowels) or #curr)
    end
    return candidate
end

Как вы можете видеть, она всегда переходит к следующей гласной, что 1. делает ее быстрее для высоких k в длинном s с длинными цепочками согласных перед целевой строкой и 2. означает, что он может пропустить допустимую последовательность, имеет первую гласную после #s-k (последняя позиция, с которой может начинаться подстрока), что у вас должно быть для смягчения некоторым особым случаем.

Стоит ли это ускорение, зависит от того, как выглядит ваша средняя строка ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...