【问题标题】:Finding minimum number in a given array segment在给定的数组段中查找最小数
【发布时间】:2019-07-31 20:01:44
【问题描述】:

假设我们有一个很大的整数数组 A。我们想要回答许多查询,例如:

  • 查找索引 0 到 100 之间的最小值
  • 找到索引 4 和 90 之间的最小值
  • ...

示例:A = {6, 1, 7, 5, 3}

  • 索引 0 和 1 之间的最小值为 1
  • 索引 2 和 3 之间的最小值为 5
  • 索引 0 和 4 之间的最小值为 1

遍历每个查询的元素并找到最小值的明显方法在性能方面是不够的。我不知何故需要一次性存储所需的信息,然后在恒定时间内回答查询。所以算法不应该是二次的。需要比 O(N * M) 更好的东西。 (N:数组大小,M:查询次数)

我试过了,但找不到怎么做。它一定是关于查找和存储一些总和并以某种方式使用它们的东西。有任何想法吗?感谢阅读。

【问题讨论】:

标签: java algorithm data-structures array-algorithms


【解决方案1】:

需要考虑的两个选项:

  1. O(n) 预计算和 O(logn) 每个查询
  2. O(nlogn) 预计算和每个查询 O(1)

第一种方法是通过递归计算偶数位置的所有对的最小值,然后在 4 的倍数位置计算所有 4,然后在所有 8 的倍数位置计算所有 8,依此类推。然后,每当您想要访问特定范围的最小值时,您可以将其分解为您已经拥有的部分并计算其中的最小值。

例如,要找到元素 1..10 的最小值,请使用 1 和 2..3 和 4..7 以及 8..9 和 10 中的最小值。

第二个方法是计算所有位置的所有对的最小值,然后是所有位置的所有 4,然后是所有位置的所有 8。当你有一个特定的范围时,你将它构造为两个部分的最小值并计算这两个部分的最小值。

例如,要找到元素 1..10 的最小值,请使用最小值 1..8 和最小值 3..10。

【讨论】:

  • 您的第一个解决方案看起来像是自下而上构建的最小堆。
【解决方案2】:

为每个问题制定一个“解决方案”、一个“最小值”和一个“最大值”

然后,当您传递到数组的下一个元素时,如果您到达问题的索引==min,则解决方案=该索引的数量。 只要您没有达到最大值,您就可以将解决方案与该索引中的数字和实际解决方案进行比较。 (好吧,我在发帖时意识到这是 n*m,抱歉)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多