Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找给定数组段中的最小数_Java_Algorithm_Data Structures_Array Algorithms - Fatal编程技术网

Java 查找给定数组段中的最小数

Java 查找给定数组段中的最小数,java,algorithm,data-structures,array-algorithms,Java,Algorithm,Data Structures,Array Algorithms,假设我们有一个大的整数数组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:查询数) 我试过了,但找不到怎么做。它一定是关于寻找和存储一些

假设我们有一个大的整数数组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:查询数)


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

需要考虑的两个选项:

  • O(n)预计算和每个查询O(logn)
  • 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组合使用。

    对每个问题生成一个“解决方案”、“最小值”和“最大值”

    然后,当您传递到数组的下一个元素时,如果您达到一个问题的索引==min,那么solution=该索引的编号。 只要你没有达到最大值,你就可以将解决方案和索引中的数字进行比较,然后实施解决方案。
    (好的,当我发布时,我意识到这是n*m,对不起)

    初始过程可以是O(n^2)吗?@Sweeper我想你想创建一个最小值矩阵。但是初始过程也应该比O(n^2)好。现在我正在尝试一种O(N logN)方法,如果有效的话,我会在这里写。实际上,半个矩阵就足够了,但它仍然是O(N^2)。是的,你说得对。你的第一个解决方案看起来像是自下而上构建的最小堆。