【问题标题】:How to quickly find matching strings?如何快速找到匹配的字符串?
【发布时间】:2014-09-21 16:28:13
【问题描述】:

我正在使用 Lua -- 仅供参考,所以在 10^10 位之后,比较变得无效 IIRC。

我有一个包含 50,000 个名字的列表——该列表甚至可能增加到数十万个。我正在尝试显示在搜索栏中键入的部分名称的潜在匹配列表,因此如果我键入“And”,这些可能会弹出:

“安迪” “安德鲁” “安德烈” 等多达 20 场比赛。

每个名称都是唯一的——没有完全相同的名称。名称可以包含字母、数字、空格和句点。运行代码时,这些名称的表/数组不会以任何方式排序。在 Lua 中,如果可能的话,我如何在用户在搜索栏中输入名称时显示实时潜在匹配项?

【问题讨论】:

  • 预处理您的数据并将其存储在trie 中。是的,你可以在纯 Lua 中做到这一点。

标签: arrays sorting lua


【解决方案1】:

下面的简单程序对我来说很好用。没有花哨的数据结构,只是简单的蛮力搜索。使用/ 开始一个新查询。以. 结束程序。使用, 作为退格键。

/usr/share/dict/web2a 中的单词列表有 76205 个单词。它也适用于 /usr/share/dict//words,它有 235886 个字。

local t={}
for w in io.lines"/usr/share/dict/web2a" do
    t[w]=true
end

os.execute("stty cbreak </dev/tty >/dev/tty 2>&1")
local s=""
while true do
    io.write("> ",s)
    local c=io.read(1)
    if c=="." then break end
    if c=="/" then s="" elseif c=="," then s=s:sub(1,-2) else s=s..c end
    local n=0
    print()
    for w in pairs(t) do
        if w:sub(1,#s)==s then
            n=n+1
            print(n,w)
            if n>=10 then break end
        end
    end
end
os.execute("stty -cbreak </dev/tty >/dev/tty 2>&1");

【讨论】:

    【解决方案2】:

    由于每个名称都是唯一的,因此创建一个数据库并将所有名称存储在索引列中,并在每次击键后使用 LIKE 关键字运行查询。查询将快速运行,因为 LIKE 是一个字符串函数,并且您的索引也是基于字符串的。根据您的技术堆栈,它看起来类似于以下内容:

    Lua 基于 ANSI-C,由于 ANSI-C 不提供键绑定功能,因此默认 Lua 库也不提供。不过,我相信现在可以使用 Links-Lua 库中的 bind_key 函数将 Lua 函数绑定到按键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 2018-11-26
      • 1970-01-01
      相关资源
      最近更新 更多