【问题标题】:What is the fastest search algorithm for a list with names and numbers具有名称和数字的列表的最快搜索算法是什么
【发布时间】:2019-02-14 13:24:18
【问题描述】:

列表中有名称和编号。每个名字都有一个数字。该列表按名称排序,列表中的数字从最小到最大排序。我需要找到与每个名字相关的所有最大数字的总和

a 1, a 4, a 5, b 0, b 4, c 1, n 9, n 10

我需要输出

5 + 4 + 1 + 10 = 20

我需要在 O(logn) 时间内完成此操作。

【问题讨论】:

  • 看起来应该自己做的作业
  • 您不能在O(log n) 时间内对n 元素进行排序,因为检查所有元素的复杂性已经达到O(n)。如果您追求O(n * log n) 复杂度,那么有很多拟合算法。只需查找它们并使用您喜欢的一个。
  • 起初 - n 是什么?
  • 你不能在对数时间内做到这一点。在最坏的情况下,每个名称只有一个数字,因此您必须将它们全部相加:您不能在次线性时间内添加 n 个任意数字。
  • O(logn) 只有在您对列表中不同名称的数量有额外限制时才可能。如果不同名称的数量(接近)logn,您可以构造一个平均情况下为 O(logn) 的算法(使用列表如何排序的知识)

标签: java algorithm performance sorting


【解决方案1】:

伪代码,找到每个名字O(M)的最后一个O(log N)。

auto it = vec.begin();
while (it != vec.end()) { // O(M)
  auto last = find_last_with_same_name(it, it->name); 
  sum += last.value;
  it++;
}

对 O(log N) 使用 exponential_search 来查找最后一个因此是最大值的值。

总共是 O(M log N)。

如果 M,名字的数量是一个常数,你得到 O(log N),但这需要一些规则律师。

【讨论】:

    【解决方案2】:

    提示:

    扫描列表,维护“当前运行中的最大数字”和“总和的累加器”。每当一个元素与前一个不同时,将当前最大的数累加并重置为该元素的值。

    我让你负责正确的初始化和完成。

    这是 Θ(n),你不能让它更快。 在最坏的情况下,如果所有名称都不同,则需要输出所有数字的总和,而如果不全部读取它们就无法完成(正如 Andy 所说)。

    【讨论】:

      猜你喜欢
      • 2011-03-12
      • 2012-05-23
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2019-01-24
      相关资源
      最近更新 更多