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