我能提供的最通用的解决方案是构建类似inverted index 的东西。您只需要在表中为每个可能的术语(在您的情况下为数字)创建一条记录。此类表中的值表示您可以在其中找到您的术语的数组。
代码可能如下所示:
local evens = { 2, 4, 6, 8, name = 'evens'}
local odds = {1, 3, 5, 7, name = 'odds'}
local low = { 1, 2, 3, 4, name = 'low'}
local high = {15, 16, 17, 18, 19, name = 'high'}
local inv_index = {}
function add_to_index(index, numbers)
for i, number in ipairs(numbers) do
local indexed = index[number]
if not indexed then
index[number] = { numbers }
else
table.insert(indexed, numbers)
end
end
end
add_to_index(inv_index, evens)
add_to_index(inv_index, odds)
add_to_index(inv_index, low)
add_to_index(inv_index, high)
-- which arrays contains the number "4"?
for k, indexed in pairs(inv_index[4]) do
print(indexed.name) -- prints "evens" and "low"
end
此解决方案的缺点是内存消耗,尤其是在可能的数字数量很大的情况下。另一种方法是对每个数组进行排序并对其执行binary search。 lua 有一个implementation。
如果您可以修改数组,则可以将数字存储在某种集合中:
local evens = { [2] = true, [4] = true, [6] = true, [8] = true }
local low = { [1] = true, [2] = true, [3] = true, [4] = true }
local odds = { [1] = true, [3] = true , [5] = true, [7] = true }
local x = 4
print(evens[x] ~= nil) -- true
print(low[x] ~= nil) -- true
print(odds[x] ~= nil) -- false