优化 Lua 表查找算法

我有一个 LUA 表:

local tableDatabase = {
  name = uniqueName,
  class = val_one_to_eight,   -- 不唯一
  value = mostly_but_not_guaranteed_unique_int}

这个表可以按照上述任何一个字段进行排序,并可能包含非常大的数据集。

现在为了插入值,我只是使用 ipairs 对表进行迭代,直到我找到:

 insertedvalue.uniqueName > tableDatabase.uniqueName
 --(如果它们是所选排序顺序,则比较其他参数。)

我需要这个函数能够非常快地工作。有没有什么搜索算法可以推荐,用于找到插入到表中的索引,或者有没有一些方法可以在 Lua 表上工作以优化插入速度?

点赞
用户8621712
用户8621712

据我所知,对于严格有序结构,可以使用二分搜索或类似的算法。Lua 用户提供了可直接使用的函数。链接

2020-11-04 23:27:35
用户6632736
用户6632736

为什么不在 name 上创建一个索引呢?如果速度不够快,你可以让 __index 变得不够通用,也就是硬编码到 name 上的唯一索引。

-- 返回一个表。......是应创建唯一索引的字段列表:
function indexedTable (...)
    local t = {
        __indices = {},
        __insert = function (self, value)   -- 代替 table.insert。
            self [#self + 1] = value    -- 隐式调用元方法 __newindex。
        end
    }
    -- 初始化索引:
    for _, index in ipairs {...} do
        t.__indices [index] = {}
    end
    setmetatable (t, {
        -- 允许 t [{name = 'unique'}]:
        __index = function (t, key)
            if type (key) == 'table' then
                for index_key, index_value in pairs (key) do
                    local value = t.__indices [index_key] [index_value]
                    if value then
                        return value
                    end
                end
            else
                return rawget (t, key)
            end
        end,
        -- 更新 t 上的所有索引 [k] = v,但不适用于 table.insert,因此使用 t:__insert"
        __newindex = function (t, key, value)
            -- 如果您愿意,在此处插入唯一性约束。
            for index_key, index in pairs (t.__indices) do
                index [value [index_key]] = value
            end
            rawset (t, key, value)
        end
    })
    return t
end

-- 测试:

local tableDatabase = indexedTable ('name')

-- 不要使用 table.insert,因为它不能通过元方法进行自定义:
tableDatabase:__insert {
    name    = 'unique1',
    class   = 1,
    value   = '有点独特'
}

tableDatabase:__insert {
    name    = 'unique2',
    class   = 2,
    value   = '有点独特'
}

tableDatabase:__insert {
    name    = 'unique3',
    class   = 2,
    value   = '有点独特,但不完全'
}

local unique2 = tableDatabase [{name = 'unique2'}]  -- 索引搜索。
print (unique2.name, unique2.class, unique2.value)
2020-11-05 05:58:57