从图表中获取最常出现的y值之一的最快方法是什么?我只有当地的最高和最低价值。我只需要一个(随机)y值。
例如,如果我有这样的图形:
最常见的y值可以是0或1(正如我所说,我只需要一个)。
谢谢。
答案 0 :(得分:2)
考虑从底部到顶部移动的水平扫描线。最初,它符合图表0次。如果它超过最小值,它开始比以前多两次曲线。如果它超过最大值,它开始减少两次曲线。如果遇到一个端点,它会开始更多或一次更少地满足曲线,具体取决于它旁边的点的类型。
实际上,最小值和最大值是交替的,因此您可以通过查看局部极值的奇偶校验来判断增量。
因此,您可以通过将极值值与增量一起排序来找到解决方案。
Extrema/increments
0 2 -2 6 0
+1 -2 +2 -2 +1
Sorted extrema/increments
-2 0 0 2 6
+2 +1 +1 -2 -2
Number of intersections (prefix sum of the increments)
0 2 3 4 2 0
答案 1 :(得分:1)
问题可以归结为以下细分问题:
给定一组1d段,找到包含在最大段数中的值。
这可以通过对所有段端点进行排序,然后扫描它们来解决。在扫描期间,人们知道每个扫描范围的“深度”,并且可以在一次通过中找到最大深度范围。
在您的示例中,细分如下:
[0,2] [-2,2] [-2,6] [0,6]
有序的端点列表:
[-2, [-2, [0, [0, 2], 2], 6], 6]
如您所见,最大深度(= 4)是在[0
和2]
之间获得的。
答案 2 :(得分:0)
答案是介于0和2之间的值,[0; 2[
以下是如何计算它的示例。
y values = 0, 2, -2, 6, 0
从此构建范围列表
[0; 2]
]2; -2]
]-2; 6]
]6; 0]
排列排序列表中范围列表中的可能值
[-2, ]-2, [0, ]2, [2, ]6, [6 // [ is inclusive and ] is exclusive
他们最初得分为0
0 0 0 0 0 0 0
[-2, ]-2, [0, ]2, [2, ]6, [6
迭代范围列表,如果它们在范围内,则为每个可能的值提供分数。
范围a:[0; 2]
0 0 1 1 1 0 0
[-2, ]-2, [0, ]2, [2, ]6, [6
范围b:]2; -2]
1 1 2 2 1 0 0
[-2, ]-2, [0, ]2, [2, ]6, [6
范围c:]-2; 6]
1 2 3 3 2 1 1
[-2, ]-2, [0, ]2, [2, ]6, [6
范围d:]6; 0]
1 2 4 4 3 2 1
[-2, ]-2, [0, ]2, [2, ]6, [6
范围[0;2[
的值为4,即最大值