在Lua中二进制搜索数组数组

时间:2013-10-22 15:43:21

标签: lua binary-search

我在Lua中编写了一个二进制搜索函数,记录了它在Python中是如何工作的,它在单个数组(表)上工作。

    function bisect_left(a, x, lo, hi)
        lo = lo or 1
        hi = hi or nil
        if lo < 0 then
            error('lo must be non-negative')
        end
        if hi == nil then
            hi = #a
        end
        while lo < hi do
            mid = math.floor((lo+hi) / 2)
            if a[mid] < x then 
                lo = mid+1
            else
                hi = mid
            end
        end
        return lo
     end

然后我遇到需要搜索排序的数组数组(表的表)。它们按索引1

排序
squares = {{300, 400, 123456, 9}, {400, 500, 323456, 9}, {420, 610, 5123456, 9}, {530, 700, 8123456, 9}, {840, 960, 9123456, 1}}

在Python中,我会做一些像重载比较运算符 cmp 之类的事情,比如

Class overload(object):
    def __init__(self, value, index):
        self.value = value
        self.index = index
    def __cmp__(self, other):
        return cmp(self.value, other[self.index])

在Lua中执行此操作的最快方法是什么?我可以想到(我认为)缓慢的方式,但我的功能编程缺乏经验让我想知道是否有一种我永远猜不到的方式。

1 个答案:

答案 0 :(得分:2)

首先,看看第一个例子中你的比较器是什么。我们来看一个简单的界限:

if lo < 0 then

这可以写成:

if numericCompare(lo, 0) then

numericCompare显然是function numericCompare(a,b) return a < b end

然后,将所有比较更改为您可能称之为tableCompare的内容,并实现所述比较器,大概是

function tableCompare(a,b)
    return a[1] < b[1]
end

通常,由于Lua表的性质,tab[1]访问速度应该相当快。编码,配置文件,然后尝试优化。

Yoy可以重载Lua中的运算符,但在这种情况下,我认为将比较器作为参数并明确地命名它会稍微更具可读性。