Lua:k维点集

Lua: set of k-dimensional points

我想确保我随机生成的 kD 点不会碰巧相同。为了有效地测试它,我想使用一个集合(至少我会在 C++ 中这样做)。

我知道在 Lua 中,表可以通过将对象作为值插入任何非零键(通常只是 true 或整数多组)。 但问题是 Lua 中的表在默认情况下只是比较 w.r.t。他们的地址,即使所有矢量分量(在我的例子中)都相等,这当然是不同的。

所以我想我会为我的观点实施一个 equal and/or less than 元方法。但这没有用(见下面的代码)。有人可以帮忙吗?

local k = 3
local mt = {}

mt.__eq = function( a, b )
    for dim = 1, k do
        if a[dim] ~= b[dim] then return false end
    end
    return true
end

mt.__lt = function( a, b )
    for dim = 1, k do
        if     a[dim] < b[dim] then
            return true
        elseif a[dim] > b[dim] then
            return false
        end
    end
    return false -- equal
end

local set = {}

local p1 = { 1, 2, 3 }
setmetatable( p1, mt )
set[p1] = true

local p2 = { 1, 2, 3 }
setmetatable( p2, mt )
set[p2] = true -- should just overwrite the old value

print( "p1 == p2 --> "..tostring( p1 == p2 ) )
print( "p1 <  p2 --> "..tostring( p1 <  p2 ) )

local setSize = 0
for _, _ in pairs( set ) do
    setSize = setSize + 1
end
print( "Size of the set: "..setSize )

Lua 没有允许您尝试做的事情的设施。也就是说,没有元方法可以使两个不同的用户数据或两个不同的 table 映射到 table 索引系统的相同索引。

您必须手动执行此操作。通过保持排序的向量列表,您可以有效地编写自己的集合。 table.sort 可以完成这项工作,因为您已经有了合适的 __lt 元方法。

如果有人感兴趣:我想出了另一个对我有用的 work-around。

可以使用一组 x-coordinates,而不是仅将集合项与 "true" 或“1”相关联,各个值是集合本身(y-coordinates);等等。

这导致了一个 tree-like 结构,其中每个叶子的路径代表一个点(坐标序列)并且具有相同第一个坐标的点具有共同的父节点。而且所有的点都是唯一的。