Search 优化Lua表搜索

Search 优化Lua表搜索,search,lua,lua-table,Search,Lua,Lua Table,我有一张LUA表: local tableDatabase = { name = uniqueName, class = val_one_to_eight, --not unique value = mostly_but_not_guaranteed_unique_int} 此表可以按上述任何一项进行排序,并且可能包含非常大的数据集 现在为了插入,我只是在ipairs表中迭代,直到找到: insertedvalue.uniqueName > tableDatabase.

我有一张LUA表:

local tableDatabase = {
  name = uniqueName,
  class = val_one_to_eight,   --not unique
  value = mostly_but_not_guaranteed_unique_int}
此表可以按上述任何一项进行排序,并且可能包含非常大的数据集

现在为了插入,我只是在ipairs表中迭代,直到找到:

 insertedvalue.uniqueName > tableDatabase.uniqueName
 --(or comparing the other parms instead if they are the selected sort order.)

我需要这个功能来超快速工作。有没有人可以推荐一种搜索算法来查找要插入的表中的索引,或者我可以使用某种方法来处理lua表以优化插入速度?

正如我所知,对于严格有序的结构,可以使用二进制搜索或类似算法。
Lua用户可以使用函数。

正如我所知,对于严格有序的结构,您可以使用二进制搜索或类似的算法。
Lua用户已准备好使用该功能。

为什么不在
名称上创建索引?如果速度不够快,您可以使
\u索引
不那么通用,即对
名称
上的唯一索引进行硬编码

--返回一个表。。。字段列表,应为其创建唯一索引:
函数可索引(…)
局部t={
__索引={},
__insert=函数(自身,值)--而不是table.insert。
self[#self+1]=value——隐式地调用metamethod u newindex。
结束
}
--初始化索引:
对于u,在ipairs{…}do中的索引
t、 __索引[索引]={}
结束
可设置元(t{
--允许t[{name='unique'}]:
__索引=函数(t,键)
如果类型(键)=“表”,则
对于索引_键,索引_成对值(键)do
局部值=t.u索引[索引键][索引值]
如果值那么
返回值
结束
结束
其他的
返回rawget(t,键)
结束
完,,
--更新t[k]=v上的所有索引,但在table.insert上不起作用,因此请使用t:\u insert“
__newindex=函数(t、键、值)
--如果需要,请在此处插入唯一性约束。
对于索引_键,成对索引(t._索引)do
索引[值[索引键]]=值
结束
rawset(t、键、值)
结束
})
返回t
结束
--测试:
本地tableDatabase=indexedTable('name')
--Not table.insert,因为它不能通过元方法进行自定义:
tableDatabase:\uu插入{
名称='unique1',
类别=1,
值='有点独特'
}
tableDatabase:\uu插入{
名称='unique2',
类别=2,
值='有点独特'
}
tableDatabase:\uu插入{
名称='unique3',
类别=2,
值='有点独特,但不是绝对'
}
本地unique2=tableDatabase[{name='unique2'}]--索引搜索。
打印(unique2.name、unique2.class、unique2.value)

为什么不在
名称
上创建索引?如果不够快,可以使
\uu索引
不那么通用,也就是说,硬编码是
名称
上唯一的索引

--返回一个表….是字段列表,应为其创建唯一索引:
函数可索引(…)
局部t={
__索引={},
__insert=函数(自身,值)--而不是table.insert。
self[#self+1]=value——隐式地调用metamethod u newindex。
结束
}
--初始化索引:
对于u,在ipairs{…}do中的索引
t、 __索引[索引]={}
结束
可设置元(t{
--允许t[{name='unique'}]:
__索引=函数(t,键)
如果类型(键)=“表”,则
对于索引_键,索引_成对值(键)do
局部值=t.u索引[索引键][索引值]
如果值那么
返回值
结束
结束
其他的
返回rawget(t,键)
结束
完,,
--更新t[k]=v上的所有索引,但在table.insert上不起作用,因此请使用t:\u insert“
__newindex=函数(t、键、值)
--如果需要,请在此处插入唯一性约束。
对于索引_键,成对索引(t._索引)do
索引[值[索引键]]=值
结束
rawset(t、键、值)
结束
})
返回t
结束
--测试:
本地tableDatabase=indexedTable('name')
--Not table.insert,因为它不能通过元方法进行自定义:
tableDatabase:\uu插入{
名称='unique1',
类别=1,
值='有点独特'
}
tableDatabase:\uu插入{
名称='unique2',
类别=2,
值='有点独特'
}
tableDatabase:\uu插入{
名称='unique3',
类别=2,
值='有点独特,但不是绝对'
}
本地unique2=tableDatabase[{name='unique2'}]--索引搜索。
打印(unique2.name、unique2.class、unique2.value)

这有什么好处?这看起来像是过热的散列搜索。它只是用给定的key=value搜索一个条目并返回。名称不是表可以排序的唯一参数。它可以按上述任何字段进行排序。当我去度假时,我基本上得给整张桌子重新编制索引。我不确定这会比我现在做的更有效率。@user3758015,我不理解你的评论。在我的解决方案中,我根本不排序表。我创建了一个或多个直接指向表项(也是表)的索引,它们不需要重新组织表排序、插入或删除。我的解决方案的局限性在于它只处理由一个字段组成的唯一索引。这有什么好处?这看起来像是过热的散列搜索。它只是用给定的key=value搜索一个条目并返回。名称不是表可以排序的唯一参数。它可以按上述任何字段进行排序。当我求助时,我将不得不对