具有层次结构和多个过滤器的搜索算法

时间:2016-04-20 11:09:34

标签: java algorithm search

这是我的问题。

假设我们有一个包含多个对象的列表A,其中每个对象都有几个字段。我需要搜索列表 字段的层次结构。我的问题是什么是最好的优化算法。

我所知道的是:

循环槽列表搜索A,如果没有返回

循环槽列表搜索B,如果没有返回

循环槽列表以搜索C.

等等...

Say C从搜索中返回一些东西,然后我需要应用其他过滤器,称之为D和E,如果D和E匹配,则返回C.

如果它不匹配(D或E),我会再次循环搜索列表以搜索F,这也可能需要匹配相同的D和E.

考虑到列表A的大小可以改变,并且每个对象内的过滤器都可以改变。

我的问题是我正在进行此搜索以匹配两个对象,并且对于列表B中的每个对象,我在列表A中执行此搜索。 问题是B可以有数千个条目。 在某些情况下,完成算法需要几个小时。

对不起抽象的东西,我甚至不知道这是否是正确的地方,但是任何帮助都会受到赞赏。

我在JAVA编程。

由于

2 个答案:

答案 0 :(得分:0)

你解释的问题目前有点令人费解。 如果我弄错了,我很抱歉。我采取的是:

  

我的问题是我正在进行此搜索以匹配两个对象,并且   对于列表B中的每个对象,我在列表A中执行此搜索。问题是B.   可以有数千个条目。在某些情况下需要几个小时   完成算法。

您有2个列表,并且您希望根据对象的某些字段找到几乎重复的内容。

首先想到的是使用可用的java哈希创建哈希函数,该哈希函数为每个对象计算一个仅包含要比较的字段的哈希。假设您正在寻找共享字段field_a和field_b但不是field_c的对象,那么我的哈希函数看起来像(hash(field_a) * 8) ^ hash(field_b)或类似的东西。现在,您可以使用它来构建哈希映射或列表数组。

现在使用它,您将浏览列表并将对象添加到哈希映射中。然后你拿第二个列表计算你的对象的哈希值,看看你是否得到了匹配。如果哈希匹配,则需要比较对象本身,以防万一由于哈希冲突而导致错误匹配(这些应该很少见,但会发生)。

所以现在在这个列表中搜索的东西几乎是常数O(1),(取决于你期望得到多少结果,以及哈希计算的成本是多少)。

您应该能够在一次通过中计算所有哈希值(适用于所有条件)(由于内存缓存而比执行每个哈希的pas值略快)。寻找比赛应该非常快。

注意:如果您看到许多哈希冲突(对象具有相同的哈希值,但它们不匹配),请稍微更改哈希函数。

答案 1 :(得分:0)

立即对所有列表进行迭代,如果您从列表break找到了正确的匹配操作,那么您不必 告诉程序分别完成每个循环。