如何在O(nlogn)时间复杂度

时间:2016-11-09 16:11:51

标签: algorithm binary-search-tree

我的考试有一个问题,我必须提出一个有效的算法。问题是这样的:

我们有一些具有两个属性的对象:

H = <1,1000000> 
R = <1,1000000>

如果H1>H2R1>R2,我们可以将一个对象插入另一个对象。输入包含HR对,每行一对。如果当前对象可以插入到任何先前的对象中,我们选择具有最小H的对象,然后我们销毁它们。打印输出中的左对象数。

我想知道如何使用二叉搜索树或分段树或使用fenwick树在O(n.log(n))时间复杂度中解决此问题。

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用fenwick树的解决方案,如下所示;

  • 让我们首先按R对整个数组进行排序(现在,我们并不关心H),并为每个项目分配一个标记(等于它#39) ; s在排序数组中的位置)。
  • 让我们回到原来的阵列。我们将在给定的数组上运行扫描。比方说,我们有一个fenwick树,它将代替累积总和,仅为H存储最大值(从开始到该位置)。
  • 对于某个项目,比方说,我们无法将其放入另一个项目中。然后我们将它插入树中。我们将插入与其令牌相同的位置。
  • 所以,现在,我们有一个fenwick树,它只包含我们迄今为止处理过的物品。其他值为0.树中的项目按R排序顺序排列。
  • 现在,如何确定我们是否可以将当前项目放到另一个对象上?我们实际上可以在fenwick树上为当前项H运行二进制搜索(上限)。并且,由于项目已按R顺序排序,而不是整棵树,我们需要在有效范围内进行搜索。
  • fenwick树中的二进制搜索可以在O(log(n))中完成。查看查找具有给定累积频率的索引部分this文章。