【问题标题】:Find Duplicates Based on Ranking根据排名查找重复项
【发布时间】:2019-01-05 16:02:50
【问题描述】:

一个接受两个参数(数组、排名)并返回一个数组的函数。

该函数应根据排名返回重复的数字,例如: 如果ranking参数为5,函数会返回重复的5个数字,即使有10个重复的数字,函数也应该只返回重复次数最多的5个,因为ranking = 5。

我正在寻找有效的解决方案 O(N) 来解决这个问题。

我知道我们可以使用哈希映射来计数,然后对其进行排序,然后将返回的数组限制为“排名”变量,但这个解决方案不是 O(N)。

【问题讨论】:

  • 您能否提供一个或两个输入数组和所需输出的示例?我对most duplicate numbers 的含义有些困惑。另外,我可能有误解,但是函数如何决定返回哪些 N个元素?
  • 我们在这里处理什么,文件?数据库?两者/其他?来源是什么?
  • 发给我的帖子不清楚,可能过于宽泛。我出去了。
  • @FunkFortyNiner 你不是在处理文件或数据库,只是存储在内存中的变量。
  • 您似乎不太可能在 O(n) 中 count and then sort

标签: php algorithm sorting duplicates numbers


【解决方案1】:

您不需要排序。一旦你计算了所有的重复次数,你就可以只通过哈希映射一次,只保留最高的 5 个。

选项 1

  1. 遍历填充hash map的数组,Key为数字,value为出现次数。 O(N)
  2. 那么你需要一个与排名值(r) 大小相同的数组。在这里,您将存储排名靠前的数字。
  3. 然后,您只需要遍历哈希映射 O(N),然后将数字添加到数组中,前提是它的出现次数高于重复次数较少的数字 O(R)。在这里,您可以通过使用存储在数组中的值作为键访问哈希映射来访问出现次数。这将是对哈希映射中每个条目的 r 次直接访问。
  4. 您有数组中的前 r 号。

O(N + RN) = O(RN) (这是最坏的情况。只有在没有重复数字的情况下,第3步的通过才会是N。如果有则小于N,但没关系)

选项 2

与之前相同,但您在执行步骤 1 的同时执行步骤 3。 您在第三步跳过哈希映射,但总是会做 O(RN)

【讨论】:

  • La Rosa:你能举个例子吗?通常哈希图没有排序,所以如果我取前 5 个元素,它不会是前 5 个。
  • 我不明白你在最坏的情况下如何得出O(N + RN) == O(N) 的结论。如果R 始终为n-10,则考虑N 的增长情况。
  • 我还是线性的。同理,N = KN = 2N = 34N = 2 +N。你不关心常量,你只关心最主要的术语
  • 我收回了。实际上,我指的是关于哈希映射的长度的最坏情况。不是在谈论 R。如果 R 与 N 有关系,那么你就会遇到一个完全不同的问题,并且可能会接近 N²。但是对于原始问题,O(RN) 是正确的
  • 是的,我认为 O(RN) 更有意义。尽管 R 与 N 无关,但 R 的最坏情况 与 N 相关。
猜你喜欢
  • 2016-02-27
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
相关资源
最近更新 更多