【问题标题】:Search Algorithm with hierarchy and several filters具有层次结构和多个过滤器的搜索算法
【发布时间】:2016-04-20 11:09:33
【问题描述】:

这是我的问题。

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

我知道的是:

循环槽列表寻找A,如果没有返回

循环槽列表寻找B,如果没有返回

循环槽列表寻找C。

等等……

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

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

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

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

对不起,抽象的东西,我什至不知道这是不是问这个问题的正确地方,但任何帮助将不胜感激。

我正在用 JAVA 编程。

谢谢

【问题讨论】:

    标签: java algorithm search


    【解决方案1】:

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

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

    您有 2 个列表,您想根据对象的某些字段查找几乎重复的列表。

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

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

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

    您应该能够一次计算所有哈希值(适用于您的所有条件)(由于内存缓存,将比执行一次哈希值略快)。寻找匹配应该非常快。

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

    【讨论】:

    • 感谢花时间写这个,现在有用怀疑,以后肯定会用,但是不适用于这个问题,我说的过滤器不只是相等,但可以更大或更小,我什至有一些复杂的过滤器,几个完整的逻辑。我正在搜索的是一种算法,它允许搜索列表而不必每次都循环遍历,如果这有意义的话,某种链接列表与搜索树的混合。
    • 听起来您的条件可能类似于arbitrary_hash_function(data) = value。在这种情况下,没有什么可以优化它。
    【解决方案2】:

    只需一次对所有列表进行迭代,如果您从列表break 中找到正确的匹配项,则无需操作 告诉程序分别遍历每个循环。

    【讨论】:

    • 感谢您的回答,我已经考虑过这个想法,但是对于这个问题,它的观点过于简单化。我没有解释整个搜索算法,因为它会变得非常具体。我正在寻找的是某种算法,可以使用通过的过滤器优化搜索。因为如果我在第一组参数中没有找到任何东西很重要,一个循环是不够的,不是没有逻辑,这会使搜索变慢,因为它删除了循环,但它对检查和逻辑的影响很大后面。
    猜你喜欢
    • 2011-05-26
    • 2013-06-11
    • 1970-01-01
    • 2021-12-27
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多