Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
Arrays 在未排序的数组中查找小于平均值的差异?_Arrays_Algorithm - Fatal编程技术网

Arrays 在未排序的数组中查找小于平均值的差异?

Arrays 在未排序的数组中查找小于平均值的差异?,arrays,algorithm,Arrays,Algorithm,我需要在未排序的数组中找到2个元素,以便它们之间的差异小于或等于(最大-最小)/(数组中的元素数) 在O(n)中 我知道最大值和最小值 有人能想到什么吗 谢谢大家! 步骤1:使用。不要对单个桶进行排序 应该很清楚从这里可以做什么,以及如何调整桶的大小。步骤1:使用。不要对单个桶进行排序 应该很清楚从这里该做什么,以及如何确定桶的大小 桶数=2n 每个存储桶中的值=(最小+k((最大最小)/2n)) 桶数=2n 每个bucket中的值=(min+k((max-min)/2n))正确的问题应该是:

我需要在未排序的数组中找到2个元素,以便它们之间的差异小于或等于(最大-最小)/(数组中的元素数)

在O(n)中

我知道最大值和最小值

有人能想到什么吗

谢谢大家!

步骤1:使用。不要对单个桶进行排序

应该很清楚从这里可以做什么,以及如何调整桶的大小。

步骤1:使用。不要对单个桶进行排序

应该很清楚从这里该做什么,以及如何确定桶的大小

  • 桶数=
    2n

    每个存储桶中的值=
    (最小+k((最大最小)/2n))
    
  • 桶数=
    2n


    每个bucket中的值=
    (min+k((max-min)/2n))正确的问题应该是:
    在数组A=[a0,a2,…an]中,找到两个元素A,b,使它们之间的差值小于或等于:(M-M)/n>|A-b,其中M=max(A)和M=min(A)

    我建议的解决方案是使用quickSelect,预期时间复杂度为O(n)。实际上最坏的情况是O(n^2)。这是一种折衷,因为大多数情况下它是O(n),但它需要O(1)空间复杂性(如果以迭代方式实现quickSelect,并且使用while循环而不是递归来实现我的伪代码)

    主旨: 在每次迭代中,我们使用quickSelect查找中值,如果
    |max-medianValue |>| min-medianValue |
    我们知道应该搜索数组的左侧。这是因为两边的元素数量相同,但中间值更接近最小值,因此应该有元素之间的差异更小。否则我们应该在右边搜索

    每次我们这样做,我们知道新的最大或最小的子阵列应该是中位数。 我们继续搜索,每次将数组的大小除以2

    预期运行时证明: 假设n个元素上的每次迭代预期采用c*n+d。 因此,我们:


    正确的问题应该是: 在数组A=[a0,a2,…an]中,找到两个元素A,b,使它们之间的差值小于或等于:(M-M)/n>|A-b,其中M=max(A)和M=min(A)

    我建议的解决方案是使用quickSelect,预期时间复杂度为O(n)。实际上最坏的情况是O(n^2)。这是一种折衷,因为大多数情况下它是O(n),但它需要O(1)空间复杂性(如果以迭代方式实现quickSelect,并且使用while循环而不是递归来实现我的伪代码)

    主旨: 在每次迭代中,我们使用quickSelect查找中值,如果
    |max-medianValue |>| min-medianValue |
    我们知道应该搜索数组的左侧。这是因为两边的元素数量相同,但中间值更接近最小值,因此应该有元素之间的差异更小。否则我们应该在右边搜索

    每次我们这样做,我们知道新的最大或最小的子阵列应该是中位数。 我们继续搜索,每次将数组的大小除以2

    预期运行时证明: 假设n个元素上的每次迭代预期采用c*n+d。 因此,我们:



    (cn+d)+0.5(cn+d)+0.25(c*n+d)+……+(1/log{2}(n))(cn+d)@Binary-Worrier:它有什么区别?;-)@挥霍了很多,但这至少意味着retag@Greg迪恩:哦,这就是区别!;-)@斯帕顿:我的部分工作是指导不同级别的初级程序员。仅仅提供一个完整的答案对学习者没有什么好处。如果是家庭作业,我会就如何解决这个问题给出有用的建议,但不会给出完整的解决方案。还有+1格雷格·迪恩,应该重读一遍,所以,我自己和其他拼写错误可以更正标题“difference”。没有人会理解我的“滑稽”评论@二元担忧者:它有什么区别?;-)@挥霍了很多,但这至少意味着retag@Greg迪恩:哦,这就是区别!;-)@斯帕顿:我的部分工作是指导不同级别的初级程序员。仅仅提供一个完整的答案对学习者没有什么好处。如果是家庭作业,我会就如何解决这个问题给出有用的建议,但不会给出完整的解决方案。还有+1格雷格·迪恩,应该重读一遍,所以,我自己和其他拼写错误可以更正标题“difference”。没有人会理解我的“滑稽”评论这是正确的解决方案。我不确定“非常明显”,需要担心的一件事是有两种情况需要检查:一种情况是一个pidgeonhole有多个pidgeon,另一种情况是所有pidgeonhole都有一个pidgeon。Sid Datta将详细介绍。这是正确的解决方案。我不确定“非常明显”,需要担心的一件事是有两种情况需要检查:一种是一个pidgeonhole有多个pidgeon,另一种是所有pidgeonhole都有一个pidgeon。Sid Datta会更详细。这很有效,尽管你可以使用n个桶,您只需比较连续的值。我认为在某些情况下,这没有解决问题。如果n个项目出现在备用存储桶中,那么一行中永远不会有两个非空存储桶,但在存储桶j的“顶部”附近有一个值,在存储桶j+2的“底部”附近有另一个值,会怎么样。它们之间的距离小于(max-min)/n。但是,正如Jimmy所说,在本例中,存储桶已对数组进行了完全排序,这意味着您可以通过O(n)传递来完成,以找到解决方案或证明不存在解决方案。尽管您可以使用n个存储桶,您只需比较连续的值。我认为在某些情况下,这没有解决问题。如果n个项目出现在备用存储桶中,那么有n个呢
    run(arr):
       M = max(arr)
       m = min(arr)
       return findPairBelowAverageDiff(arr,0,arr.length,m,M)
    
    findPairBelowAverageDiff(arr, start, end,  min,  max) :
          if start + 1 < end:
                medianPos = start + (end - start) / 2
             // median that is between start and end in the arr.
                quickSelect(arr,  start,  medianPos,  end)
                if max - arr[medianPos] > arr[medianPos] - min:
                    return findPairBelowAverageDiff(arr, start, medianPos, 
                                    min, arr[medianPos])
                else :
                    return findPairBelowAverageDiff(arr, medianPos, 
                                            end, arr[medianPos], max);
           else :
                return (arr[start],  arr[start + 1])