成对优先级队列

时间:2009-02-27 17:57:00

标签: algorithm data-structures theorem-proving

我有一组A和一组B个,每个都有一个相关的数字优先级,其中每个A可能匹配部分或全部B反之亦然,我的主循环基本上包括:

按优先顺序选择最佳AB,并使用AB执行操作。

最明显的方法是使用(A,B)对的单个优先级队列,但如果有{100,000} A和100,000 B,那么{ {1}}对不适合内存(磁盘太慢)。

每个O(N^2)的另一种可能性是循环每个A。但是,这意味着全局优先级排序仅为B,我确实需要考虑两个组件的优先级。

(该应用程序是定理证明,其中上述选项分别称为对算法和给定的子句算法;每个的缺点都是已知的,但我没有找到任何对良好解决方案的引用。)

似乎指出了某种双层优先级队列,但在最坏的情况下,如果不使用A内存或O(N^2)时间,不清楚如何执行此操作。

有没有已知的方法呢?

澄清:每个O(N^2)必须使用所有相应的A处理,而不只是一个。

5 个答案:

答案 0 :(得分:1)

也许有些东西我不理解,但

为什么不将A和B放在单独的堆中,每个堆上都有get_Max,做你的工作,从相关堆中删除每个最大值并继续?

答案 1 :(得分:1)

你可以先处理最好的对,如果没有什么好处的话,为了完整性,用给定的子句算法来完成其余的。这可能导致一些双重工作,但我敢打赌,这是微不足道的。

您是否考虑过有序的paramodulation或叠加?

答案 2 :(得分:1)

A中的项目似乎具有单独的优先级,B中的项目具有单独的优先级,并且(A,B)对具有组合的优先级。只有合并后的优先级才有意义,但希望我们可以在整个过程中使用各个属性。但是,A中的项目与B中的项目之间也存在匹配关系,这是独立的优先级。

我假设,对于A中的所有a,B中的b1和b2,匹配(a,b1)和匹配(a,b2),则优先级(b1)> =优先级(b2)意味着CombinedPriority( a,b1)> = CombinedPriority(a,b2)。

现在,首先按递减顺序优先级排序B.设B(j)表示该排序顺序中的第j个元素。另外,让A(i)表示A的第i个元素(可能按顺序排列也可能不排序)。

令nextb(i,j)是找到最小的j'> = j的函数,使得匹配(A(i),B(j'))。如果不存在这样的j',则该函数返回null(或一些其他合适的错误值)。搜索j'可能只涉及从j向上循环,或者如果我们对匹配关系的结构有更多了解,我们可以更快地做一些事情。

为A中的所有索引i创建包含(i,nextb(i,0))的优先级队列Q,使得nextb(i,0)!= null。 Q中的对(i,j)按CombinedPriority(A(i),B(j))排序。

现在循环直到Q为空。拉出最高优先级对(i,j)并适当地处理(A(i),B(j))。然后重新插入(i,nextb(i,j + 1))到Q(除非nextb(i,j + 1)为空)。

总而言之,在所有对匹配的最坏情况下,这需要O(N ^ 2 log N)时间。通常,它需要O(N ^ 2 + M log N),其中M是匹配的数量。如果有更快的方法来计算nextb(i,j)只是向上循环,那么可以减少N ^ 2分量,但这取决于匹配关系的知识。

(在上面的分析中,我假设A和B的大小都是N.如果公式大小不同,公式很容易修改。)

在最坏的情况下,你似乎想要比O(N ^ 2)时间更好的东西,但是如果你需要处理每一场比赛,那么你有一个M的下限,可以是N ^ 2本身。我不认为你能够比O(N ^ 2 log N)时间做得更好,除非组合优先级有一些特殊的结构,允许你使用优于log-N的优先级队列。

答案 3 :(得分:0)

所以你有一套A和一组B,你需要从这个集合中选择一个(A,B)对,使得某些f(a,b)是其他任何一个(A, B)对。

这意味着您可以存储所有可能的(A,B)对并对它们进行排序,并且每次通过循环选择最高(每次迭代O(1)但O(N * M)内存)。

或者你可以循环遍历所有可能的对并跟踪当前的最大值并使用它(每次迭代O(N * M),但只有O(N + M)内存)。

如果我正确理解你,那就是你所要求的。

我认为这很大程度上取决于f()来确定是否有更好的方法。

如果f(a,b)= a + b,那么它显然非常简单,最高的A和最高的B就是你想要的。

答案 4 :(得分:0)

我认为您最初的想法是可行的,您只需要将您的As和B保存在单独的集合中,并在优先级队列中粘贴它们。如果每个引用需要16个字节(只是为了选择一个数字),那么10,000,000个A / B引用只需要大约300M。假设你的As和Bs本身不是太大,它应该是可行的。