【发布时间】:2015-12-02 21:25:22
【问题描述】:
我有一个像
这样的数组[5.5, 6.0, 6.0, 6.5, 6.0, 5.5, 5.5, 5.0, 4.5].
这个数组的所有数字相差0.5,两个连续数字的最大差异也是0.5(它们可以相同;如示例中所示)。并且有一个移动区间或框,例如,它涵盖了 3 个连续的数字,如下所示:
[(5.5, 6.0, 6.0), 6.5, 6.0, 5.5, 5.5, 5.0, 4.5] # min: 5.5, max: 6.0
盒子一个接一个地向右移动:
[5.5, (6.0, 6.0, 6.5), 6.0, 5.5, 5.5, 5.0, 4.5] # min: 6.0, max: 6.5
[5.5, 6.0, (6.0, 6.5, 6.0), 5.5, 5.5, 5.0, 4.5] # min: 6.0, max: 6.5
问题是,我怎样才能找到每次盒子移动时盒子内数字的最小值和最大值?
当盒子和数组的大小像这个例子一样小时,我可以处理它,但我需要将它应用于数组大小 100000 和盒子大小 10000。使用我的方法(我使用 for-loop 计算每个最大值和最小值每次盒子通过),花费了太多时间(我还有 100 个数组要做并且需要重复运行)。有时间限制,所以我需要像计算一样在 0.5 秒内运行它。
【问题讨论】:
-
想一想 - 每次你“移动窗口”你都会丢掉第一个数字并获得一个新的最后一个数字,所以在很多情况下,最小值和最大值都赢了根本不会改变,否则更新将是微不足道的。你真的尝试过实现这个吗?
-
@jonrsharpe 如果我们丢弃的是旧的 max/min,我们将不得不再次搜索整个框以寻找新的。
-
@PeterWood 是正确的,但仅在这种情况下。
-
我认为
bisect可能是维护盒子的有效方法。
标签: python arrays python-3.x max min