多键近似查找的快速算法

时间:2017-01-23 13:31:35

标签: algorithm lookup

我已经为一个问题制定了一个解决方案,我将参数存储在一组表中,我希望能够根据多个条件查找参数。

例如,如果标准1和标准2都可以是A或B,那么我将有四个潜在参数 - 每个组合A和A,A和B,B& A和B& B。对于这些标准,我可以连接字段或类似的东西,并创建一个唯一的键来快速查找每个值。

不幸的是,我的所有标准都不是这样的。一些标准是数字的,我只关心结果是否位于边界之上或之下。这本身也不是问题 - 我可以使用二分搜索或相对快速的东西来找到高于或低于我的值的最近的键。

我的问题是我需要在同一个表格中包含多个。换句话说,我可以有三个标准 - 两个具有A / B条目,一个具有小于x /大于x类型的条目,其中x不会被修复。所以在这个例子中我会有一个包含8个条目的表。我不能只对边界进行二分搜索,因为由于其他标准,最近的边界不一定适用。例如,如果前两个标准是A& B,则最近的边界可能是100,但如果前两个标准是A& A,则最近的边界可能是50.如果我想查找A,A, 101,然后我希望它认识到50是最接近的边界 - 不是100。

我有一个程序来进行查找,但随着表变大,它变得非常慢 - 它基本上会经历每个条件,检查是否仍然可以匹配,如果是,它会查看更多标准 - 如果不是,它会继续检查表中的下一个条目。换句话说,我的程序需要逐个循环遍历表条目并检查匹配。我试图通过确保输入到过程的表尽可能小并确保它查看最不可能匹配的条件(以便它尽可能快地检查每个条目)来优化它,但是它仍然很慢。

最大的表可能是200行,有大约10个标准需要检查,但许多表要小得多(可能是10x5)。问题是我需要在应用程序期间多次调用该过程,因此具有一些初始开销的算法不一定能使事情变得更好。我确实有一些范围可以在运行之前更改表的格式,但我希望尽可能远离它(虽然认识到它可能是唯一的前进方式)。

我做了很多研究,但我没有运气。有谁知道任何旨在解决这类问题的算法?我真的希望有一些聪明的哈希函数或某些东西,这意味着我不必循环遍历表格,但是从我有限的知识中,这样的东西会在这里挣扎。我有信心我能够很好地理解这个问题,逐步优化我目前的解决方案,但我想确保我没有错过更好的解决方案。

对问题的长期和抽象描述道歉 - 希望我很清楚我正在尝试做什么。如果不清楚,我会修改我的问题。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这基本上是查询优化器在SQL中所做的事情。存在快速,免费的内存数据库,正是出于此目的。结帐sqlite https://www.sqlite.org/inmemorydb.html

听起来您正在为每个查询执行所谓的“全表扫描”,这就像查询优化器的最后手段。

答案 1 :(得分:0)

正如我所理解的那样,您希望按照

等标准选择条目
A& not B & x1 >= lower_x1 & x1 < upper_x1 & x2 >= lower_x2 & x2 < lower_x2 & ...

最简单的方法是让它们按所有可能的xi排序,其中i = 1,2 ..在不同的集合中,并且分开的单词&#39;对于A,B,......的各种组合。

搜索工作如下:

  1. 按布尔标准组合选择适当的世界
  2. 对于每个 i ,找到相应集合中lower_xi..upper_xi范围的总体(此操作为O(log(N))
  3. 选择人口最低的 i
  4. 在通过lower_xi..upper_xi范围迭代实例时,通过检查其他上限/下限标准来过滤结果(对于所有x j ,其中 j!= i
  5. 请注意,这是一般解决方案。当然,如果你知道你的绑定之间的某种关系,你可以使用按项目值的各个组合排序的列表。