我在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中执行此操作的最快方法是什么?我可以想到(我认为)缓慢的方式,但我的功能编程缺乏经验让我想知道是否有一种我永远猜不到的方式。
答案 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中的运算符,但在这种情况下,我认为将比较器作为参数并明确地命名它会稍微更具可读性。