高效的匹配算法

时间:2011-06-27 01:05:46

标签: algorithm data-structures

我有一个问题来确定对象是否包含给定属性的子集。例如,我想在N个对象中寻找具有a,b,c,d ... M属性的对象。

例如

search a,b,c,d    object A - e,g,a,c
                  object B - a,b,c
                  object C - d,c,b
                  object D - a,b,c,d,e

将返回对象B和对象C.

最直接的解决方案是检查每个对象并查看它是否具有a,b,c..M的属性。最糟糕的情况是O(mn),因为我需要遍历所有对象并检查所有属性a,b,c..M。你可以假设N很大,如果M增加,运行时间会增加。有没有其他有效的方法来解决这个问题?感谢

3 个答案:

答案 0 :(得分:1)

  1. 首先将您正在测试的集合转换为字典。

  2. 对于每一个,设置检查该组中的每个元素是否包含在字典中。

  3. 这需要O(n + m)时间,其中n是第一组中元素的数量,m是所有其他集合中元素的总数。

    这是python中的解决方案:

    def list_sets(search, objects):
        d = dict( [ (x, True) for x in search ] )
        return [ x for x in objects if all( [ y in d for y in x  ] ) ]
    

    示例输入:

    print list_sets( [ 'a', 'b', 'c', 'd' ],
        [   [ 'e', 'g', 'a', 'c' ],
            [ 'a', 'b', 'c' ],
            [ 'd', 'c', 'b' ],
            [ 'a', 'b', 'c', 'd', 'e' ] ] )
    

    结果:

      

    [['a','b','c'],['d','c','b']]

答案 1 :(得分:1)

不太可能比O(MN)更快地制造东西。

问题在于找到答案我们必须分析所有对象和[可能]所有属性。

OTOH它可能(不确定)可以在O(MN)中进行一些预处理或更多,然后能够更快地回答......

答案 2 :(得分:0)

您可以执行第一次传递以拒绝其属性集大小超过搜索集大小的任何对象。

这不会改善最坏情况下的性能,但可以根据您的数据改善实际生活性能。