【问题标题】:Find the rank of an element in an array without sorting在不排序的情况下查找数组中元素的排名
【发布时间】:2020-10-08 06:52:25
【问题描述】:

给定一个包含 n 个元素的数组和数组中的一个元素 x,有没有一种快速的方法可以在不排序的情况下找到 x 的秩?

由于我现在正在处理一个非常大的数组,因此具有 O(n) 时间复杂度的算法对于我来说仍然太慢而无法使用,这就是为什么我试图找到除排序之外的其他替代方法。

编辑:

所以现在我的算法是这样的:

for x in list:
    A = x.dot(B) ## return a numpy array
    rank = findRank(a, A) ## find the rank of a in A
    doSomething2(rank)

所以这里我的瓶颈是findRank(),在我当前的实现中,我首先对数组进行排序,然后在排序后的数组中找到元素的排名。

【问题讨论】:

  • 这就是 db 的用途。以 sql orderby 为例。如果您的数组太大以至于排序太慢,那么将其放入数据库中。您使用的是什么技术?
  • 你需要一个 O(n) 算法:如果你不看一个元素,那个值可能会改变 x 的顺序。因此,您至少需要检查每个值。当然,除非您使用排序或其他一些数据结构来准备数组。
  • 你需要对同一个数组的不同 x 进行多次查询吗?请提供更多问题详情
  • 如果你每次都创建数组,你已经在创建上花费了 O(n) 时间,所以我不明白为什么你不会同时查找排名,或者这样做在 O(n) 过程中。
  • 在编辑中,您描述了一个 O(nlogn) 的算法,但您应该通过简单的扫描和计数在 O(n) 中完成。

标签: algorithm sorting


【解决方案1】:

如果不进行额外准备(创建树形数据结构或排序),这些准备本身至少需要 O(n) 时间,您无法指望确定亚线性时间内未排序数组中的值:该数组中的每个值都可能在确定该排名中发挥作用,因此您需要检查所有数组值。

由于算法已经具有线性时间复杂度来执行:

A = x.dot(B) ## return a numpy array

...这应该不是问题。

您在 cmets 中提到您对 findRank 的实现排序为 A。这是次优的,因为它表示 O(nlogn) 时间复杂度。

相反,只需计算数组中小于您需要排名的值的值的数量。这将对应于从零开始的排名:

rank = np.sum(A < a)

【讨论】:

  • 您的回答以“您无法确定未排序数组中某个值的排名”开头;然后你继续解释如何确定一个未排序的值的排名。
  • 感谢@Stef。我打算说“......在亚线性时间”。已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 2012-08-31
  • 2011-06-28
  • 1970-01-01
  • 2014-01-07
相关资源
最近更新 更多