【问题标题】:Efficient Way to Find Pair Orderings?查找配对订购的有效方法?
【发布时间】:2011-06-11 22:43:06
【问题描述】:

假设我有三个数组abc,它们的长度相等N。每个数组的元素都来自totally ordered set,但没有排序。我还有两个索引变量ij。对于所有i != j,我想计算索引对的数量,例如a[i] < a[j]b[i] > b[j]c[i] < c[j]。有什么方法可以在小于 O(N ^ 2) 的时间复杂度内完成,例如创造性地使用排序算法?

注意:这个问题的灵感是,如果你只有两个数组,ab,你可以找到索引对的数量,例如a[i] < a[j]b[i] > b[j]in O(N log N) with a merge sort。我基本上是在寻找对三个数组的概括。

为简单起见,您可以假设任何数组中没有两个元素是相等的(没有关系)。

【问题讨论】:

  • 当这个算法完成时你想要一个数组吗?例如。一个按排序顺序存储来自abc 的所有元素的数组?
  • 您能否举例说明什么是“明确定义的总排序”?
  • 集合上的全序具有反对称、传递性和整体性;有关更多信息,请参阅 Wiki 文章。 en.wikipedia.org/wiki/Total_order
  • @David:数组中的元素是完全有序集合的成员,即它们可以排序,但不是。
  • @David,对不起,我应该说“对于每个数组,元素都是一些完全有序集合的成员”。然而,@dsimcha 的措辞是更常用的表达方式。

标签: algorithm math sorting statistics theory


【解决方案1】:

通过对数组a进行排序,同时重新排列数组b和c,我们可以假设a[i] i b[j] 和 c[i] b[j] 并且 c[i]

现在看来这种查询可以用二维segment tree来完成:http://en.wikipedia.org/wiki/Segment_tree一次迭代的代价是O(log^2 n),总复杂度是O(n log^2 n)。

(请注意,我在这里假设数组的元素是数字。没关系,因为使用排序我们总是可以将数组的元素替换为从 1 到 n 的数字,从而保留顺序。)

编辑:实际上,称为 Fenwick 树或二叉索引树的更简单的结构就足够了。见此链接:http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees#2d

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多