【问题标题】:The most effective way of finding rank of item in a list?在列表中查找项目排名的最有效方法?
【发布时间】:2016-03-22 20:58:54
【问题描述】:

我有一个包含 k 列和 i 项的表格,其中 100 > k > 20 和 20000 > i em> > 10000.

我需要按每个项目的每一列获取 rank,然后处理该值,这在朴素算法中意味着按列排序并在排序列表中查找项目。

函数rank返回项目在有序列表中的位置。

到目前为止,它看起来像: 排序 n*log(n) k-次 => k*(n*log(n))
查找 n^2 k-times => k*(n^2)

这只是一个rank()。

这对于我正在构建的应用程序来说确实是不可接受的,所以我需要更好地了解如何计算或近似排名。

【问题讨论】:

  • 对于每一行,您将计算几个等级(每列一个),您打算如何对项目进行排序?
  • 你不能以最佳排序方式存储数据,即插入到排序集合中,然后你就只有查找成本。
  • 如果表或多或少是静态的,您可以使用某种索引,就像 DBMS 所做的那样,即按每列预先计算和存储排序顺序。
  • 其实在排序列表中查找应该是logn
  • 我看到的第一个优化 - 一旦您对列表进行排序,您就可以为每个项目分配排名,无需任何查找,所以它只有 N

标签: algorithm sorting ranking


【解决方案1】:

您可以为每列生成一个索引 0 到 i-1 的数组,然后根据列中的项目对索引进行排序。然后使用以下命令将排序后的索引转换为排名:

    for (j = 0; j < i; j++)
        rank[sorted_index[j]] = j;

您可能想要创建一个等级矩阵。

【讨论】:

    【解决方案2】:

    首先,在排序列表中查找一个元素是 log(n)。如果你寻找一个复杂度超过 O(n) 的项目,那就有问题了。

    其次,您可以将元素 x 映射到一对 (x, initialIndexBeforeSorting)。因此,在对您的列表进行排序之后,您可以在 O(1) 中获得您的“反向查找”(您遍历您的排序列并为每个项目 x,找到它的位置并更新他的排名)。 O(n logn + n) 而不是 O(n logn + n logn)。

    【讨论】:

    • 通过二分查找的简单查找在这里不起作用,因为相同的值应该获得相同的排名。所以查找项是 O(n) * n 项...
    • @notnull 二进制搜索也可以工作,只需稍作调整 - 在您找到数组中的项目索引后 - 向左移动,直到找到该值的最小索引
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多