如何在数字流中找到数字的等级?

时间:2013-11-28 09:21:59

标签: c++ algorithm

我们获得了无限的数字流

Input stream --> 3 4 5 8 19 23 3 4 100 4 

任何给定数字的等级将是右边较小数字的数量。

Rank of 100 = 1
Rank of right 4 = 0
Rank of middle 4 = 0
Rank of left 4 = 1 (only 3 is smaller than 4)
Rank of 23 = 3 (3,4,4)
Rank of 19 = 3 (3,4,4)
Rank of 8 = 3

我觉得我们可以创建BST并使用该特定节点存储排名。你们有没有看到其他解决方案?

1 个答案:

答案 0 :(得分:2)

让我们假设(现在)您正在尝试计算小于您的数字数量,这些数字在您之前已经存在于文件中。

假设片刻的唯一性,具有此输出的人可以在线性时间内构建排序序列(因为它们将被赋予最终插入位置)。因此,对于N个数字序列,任何基于比较的方法都必须采用O(NlogN)来计算此输出。

因此,你真的不能比自平衡树结构做得更好,它可以为每一步提供logN保证。

基本算法:您阅读,插入,检查位置/距离与开始,输出,重复。

这假设您的树结构为您提供快速/简便的距离/位置指标。树可以很容易地做到这一点,它很容易记账,不幸的是std :: map没有,所以你需要找/写一个。

假设问题实际上是另一种方法,只需将数字存储在一个向量中,然后按上面的方式处理它们,但顺序相反。

另外,因为它们是数字,所以可能有一个基数/桶分类方法,每步可以做得比logN好,特别是如果实际范围很小。