首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有效滚动最大和最小窗口

有效滚动最大和最小窗口
EN

Stack Overflow用户
提问于 2013-02-12 00:49:53
回答 5查看 9.4K关注 0票数 13

我想高效地计算滚动最大值和最小值。这意味着比每次窗口移动时根据所有正在使用的值重新计算最大值/最小值更好。

这里有一个帖子问了同样的问题,有人贴出了一个解决方案,涉及某种堆栈方法,应该是基于其评级的工作。然而,我再也找不到它了。

在寻找解决方案或帖子时,任何帮助都将不胜感激。谢谢大家!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-02-12 00:59:59

您要使用的算法称为ascending minima (C++ implementation)

要在C#中实现这一点,您需要获得一个double ended queue类,NuGet上有一个名为Nito.Deque的好类。

我已经用Nito.Deque编写了一个快速的C#实现,但我只是简单地检查了一下,而且是凭空做的,所以它可能是错误的!

代码语言:javascript
运行
AI代码解释
复制
public static class AscendingMinima
{
    private struct MinimaValue
    {
        public int RemoveIndex { get; set; }
        public double Value { get; set; }
    }

    public static double[] GetMin(this double[] input, int window)
    {
        var queue = new Deque<MinimaValue>();
        var result = new double[input.Length];

        for (int i = 0; i < input.Length; i++)
        {
            var val = input[i];

            // Note: in Nito.Deque, queue[0] is the front
            while (queue.Count > 0 && i >= queue[0].RemoveIndex)
                queue.RemoveFromFront();

            while (queue.Count > 0 && queue[queue.Count - 1].Value >= val)
                queue.RemoveFromBack();

            queue.AddToBack(new MinimaValue{RemoveIndex = i + window, Value = val });

            result[i] = queue[0].Value;
        }

        return result;
    }
}
票数 7
EN

Stack Overflow用户

发布于 2013-02-12 01:01:52

这里有一种更有效的方法。您仍然必须偶尔计算该值,但是,除了某些退化数据(不断减少的值)之外,在此解决方案中会最小化该值。

我们会将自己限制在最大值以简化事情,但也可以简单地将其扩展到最小值。

你所需要的就是:

  • 窗口本身,初始为空。
  • 当前最大值(max),初始为任何值。
  • 当前最大值(maxcount)的计数,初始为零。

这个想法是使用maxmaxcount作为缓存来保存当前的最大值。在缓存有效的情况下,您只需返回其中的值,这是一个非常快速的恒定时间操作。

如果在您请求最大值时缓存无效,它将填充缓存,然后返回该值。这比上一段中的方法慢,但一旦缓存有效,随后的最大请求将再次使用该更快的方法。

下面是维护窗口和相关数据的方法:

获取下一个值N.

  • If窗口已满,删除最早的条目
  1. M。如果maxcount大于0并且M等于max,则递减maxcount。一旦maxcount达到0,缓存就无效了,但在用户请求最大值之前,我们不必担心这一点(在此之前,重新填充缓存是没有意义的)。
  2. N添加到滚动窗口。
  3. 如果窗口大小现在是1(该N是唯一的当前条目),则将max设置为N,并将<代码>D30设置为1,然后返回步骤1。<代码>H231<代码>H132如果<代码>D33大于0并且<代码>D34大于<代码>D35,将max设置为N,将maxcount设置为1,然后返回步骤1。
  4. 如果maxcount大于0且N等于max,则将maxcount.
  5. Go递增回到步骤1。

现在,在窗口管理正在进行的任何时候,您都可以请求最大值。这是一个独立的操作,不同于窗口管理本身。这可以按顺序使用以下规则来完成。

  1. 如果窗口为空,则没有最大值:引发异常或返回一些合理的标记值。
  2. 如果maxcount大于0,则缓存有效:只需返回max.
  3. Otherwise,缓存需要重新填充。浏览整个列表,按照下面的代码片段设置maxmaxcount

代码语言:javascript
运行
AI代码解释
复制
set max to window[0], maxcount to 0
for each x in window[]:
    if x > max:
        set max to x, maxcount to 1
    else:
        if x == max:
            increment maxcount

您主要维护最大值的缓存,并且仅在需要时才重新计算,这一事实使得这是一种比在添加条目时盲目地重新计算更有效的解决方案。

对于一些明确的统计数据,我创建了以下Python程序。它使用大小为25的滑动窗口,并使用从0到999 (包括0和999)的随机数(您可以使用这些属性来查看它们如何影响结果)。

首先是一些初始化代码。请注意stat变量,它们将用于计算缓存命中和未命中:

代码语言:javascript
运行
AI代码解释
复制
import random

window = []
max = 0
maxcount = 0
maxwin = 25

statCache = 0
statNonCache = 0

然后,根据我上面的描述,向窗口添加一个数字的函数:

代码语言:javascript
运行
AI代码解释
复制
def addNum(n):
    global window
    global max
    global maxcount
    if len(window) == maxwin:
        m = window[0]
        window = window[1:]
        if maxcount > 0 and m == max:
            maxcount = maxcount - 1

    window.append(n)

    if len(window) == 1:
        max = n
        maxcount = 1
        return

    if maxcount > 0 and n > max:
        max = n
        maxcount = 1
        return

    if maxcount > 0 and n == max:
        maxcount = maxcount + 1

接下来,从窗口返回最大值的代码:

代码语言:javascript
运行
AI代码解释
复制
def getMax():
    global max
    global maxcount
    global statCache
    global statNonCache

    if len(window) == 0:
        return None

    if maxcount > 0:
        statCache = statCache + 1
        return max

    max = window[0]
    maxcount = 0
    for val in window:
        if val > max:
            max = val
            maxcount = 1
        else:
            if val == max:
                maxcount = maxcount + 1
    statNonCache = statNonCache + 1

    return max

最后,测试工具:

代码语言:javascript
运行
AI代码解释
复制
random.seed()
for i in range(1000000):
    val = int(1000 * random.random())
    addNum(val)
    newmax = getMax()

print("%d cached, %d non-cached"%(statCache,statNonCache))

请注意,每次向窗口添加数字时,测试工具都会尝试获取最大值。在实践中,这可能不是必需的。换句话说,这是生成的随机数据的最坏情况。

出于伪统计的目的,运行该程序几次,我们得到(为了报告目的而格式化和分析):

代码语言:javascript
运行
AI代码解释
复制
 960579 cached,  39421 non-cached
 960373 cached,  39627 non-cached
 960395 cached,  39605 non-cached
 960348 cached,  39652 non-cached
 960441 cached,  39559 non-cached
 960602 cached,  39398 non-cached
 960561 cached,  39439 non-cached
 960463 cached,  39537 non-cached
 960409 cached,  39591 non-cached
 960798 cached,  39202 non-cached
=======         ======
9604969         395031

因此,您可以看到,对于随机数据,平均只有3.95%的情况会导致计算命中(缓存未命中)。绝大多数使用的是缓存值。这应该比每次插入到窗口时必须重新计算最大值要好得多。

将会影响该百分比的一些因素包括:

  • 窗口大小。更大的大小意味着缓存命中的可能性更大,从而提高了百分比。例如,将窗口大小加倍几乎将缓存未命中率减半(至1.95%)。
  • 可能值的范围。这里的选择较少意味着窗口中有更多的缓存命中。例如,将范围从0..999缩小到0..9,在减少缓存未命中方面有很大改进(0.85%)。
票数 3
EN

Stack Overflow用户

发布于 2013-02-12 01:03:37

我假设“窗口”指的是从a[start]a[start + len]的范围,并且start一直在移动。考虑到最小值,最大值是相似的,并且移动到窗口a[start + 1]a[start + len + 1]。然后,只有当(a) a[start + len + 1] < min (进来的值较小)或(b) a[start] == min (刚刚离开的最小值之一;重新计算最小值)时,窗口的最小值才会改变。

另一种可能更有效的方法是用第一个窗口填充优先级队列,并在每个值进入/离开时进行更新,但我不认为这样做更好(优先级队列不适合于“从中间挑选随机元素”(当窗口前进时需要做的事情)。而且代码会复杂得多。最好坚持简单的解决方案,直到证明性能是不可接受的,并且这段代码负责(大部分)资源消耗。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14823713

复制
相关文章
判断浏览器窗口滚动到最底部
首先是昨天我们说的vue中绑定@scroll事件,别忘了加对应的高度,以及检查overflow-y:
阿超
2022/08/21
9000
(2)sparkstreaming滚动窗口和滑动窗口演示
一、滚动窗口(Tumbling Windows) 滚动窗口有固定的大小,是一种对数据进行均匀切片的划分方式。窗口之间没有重叠,也不会有间隔,是“首尾相接”的状态。滚动窗口可以基于时间定义,也可以基于数据个数定义;需要的参数只有一个,就是窗口的大小(window size)。
NBI大数据
2022/09/05
1.2K0
(2)sparkstreaming滚动窗口和滑动窗口演示
最小窗口子串
已知字符串S与字符串T,求在S中的最小窗口(区间),使得这个区间中包含 了字符串T中的所有字符。 例如: S = “ADOBECODEBANC” ;T = "ABC " 包含T的子区间中,有“ ADOBEC”, “CODEBA”, “BANC” 等等;最小窗口 区间是 “BANC” LeetCode 76. Minimum Window Substring
小飞侠xp
2018/08/28
2440
(2)FlinkSQL滚动窗口demo演示
滚动窗口(Tumbling Windows) 滚动窗口有固定的大小,是一种对数据进行均匀切片的划分方式。窗口之间没有重叠,也不会有间隔,是“首尾相接”的状态。滚动窗口可以基于时间定义,也可以基于数据个数定义;需要的参数只有一个,就是窗口的大小(window size)。
NBI大数据
2022/08/08
4440
(2)FlinkSQL滚动窗口demo演示
API获取窗口滚动条位置
以前都是找内存读取滚动条位置,后来遇到一个游戏客户端的滚动条内存基址怎么也找不到,做了很多努力都失败了,因为这个内存基址已经不属于程序领空。最后感觉这个滚动条应该是系统直接控制的, 和程序本身关系不大,所以直接调用系统的API应该可以获得。本人小白, API了解的不多,网上查了查资料才会用这个API了,现在回想起来,以前真是走了很多弯路,能直接用API获取的数据,我居然那么多次都去找内存、找基址。好在这次老办法遇到困难,才知道了这个简单办法。 下面是AAU(AARDIO)中获取窗口滚动条位置的API用法:
用户2135432
2018/06/04
1.9K0
过滤窗口最小化事件
本文以简单的例子实现windows平台下的过滤窗口最小化事件功能。 例子: #include <QApplication> #include <QWidget> #include <QAbstractNativeEventFilter> #include <windows.h> class NativeFilter : public QAbstractNativeEventFilter { bool nativeEventFilter(const QByteArray &eventType,
Qt君
2023/03/17
1.1K0
过滤窗口最小化事件
LeetCode 727. 最小窗口子序列(滑动窗口)
给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 。
Michael阿明
2021/02/19
1.9K0
每日三题-有效的括号、最长有效括号、最小栈
👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 算法 🌈 算法类型:Hot100题 🌈 每日三题 有效的括号 最长有效括号 最小栈 有效的括号 解法一 使用栈保存符号的左边框 如果出现有边框就与栈顶符号进行匹配 如果匹配失败则return false 注意: 对栈的使用要注意判空 class Solution { public boolean isValid(String s) {
才疏学浅的木子
2022/11/13
2220
每日三题-有效的括号、最长有效括号、最小栈
dotnet C# 图片等比限制最大和最小大小缩放算法
如下图,我要将图片的大小进行等比缩放,此时我要求图片的宽度和高度大于最小尺寸,但是要求宽度和高度都不大于最大尺寸,如果这两个规则冲突,优先满足不大于最大尺寸
林德熙
2020/05/12
2K0
使用分治思想 求数组中的最大和最小值
代码具体实现如下: package com.zuoyan.algorithm; public class FindMinMax { //Main函数进行测试 public static void main(String[] args) { int[] a=new int[]{1,10,2,19,365,-2,100,28}; MinMax minMax = getMinMax(a, 0,a.length-1); Syste
梅花
2020/09/28
1.5K0
c#:winform鼠标拖动窗口大小时,设定窗口最小尺寸
winform 程序运行过程中,用户用鼠标拖动窗体大小时,如将窗体调整得极小,可能窗体上的控件就面目全非(或看不到了),用下面的代码可以设定窗口的最小尺寸,以防止这种情况 private void Form1_ResizeEnd(object sender, EventArgs e)         {             //this.Text = "2width:" + this.Width.ToString() + " height:" + this.Height.ToString()
菩提树下的杨过
2018/01/22
1.6K0
《剑指Offer》- 连续子数组的最大和或最小和
本文是《剑指Offer》系列(JavaScript版)的第一篇,题目是“连续子数组的最大和或最小和”。
胡哥有话说
2020/05/07
9030
Python Tkinter 窗口的管理与设置(一):窗口的最小框架
窗口的最小框架,仅4行代码就可以搞定 代码: # 导入模块,取别名 import tkinter as tk # 实例化一个窗体对象 root = tk.Tk() # 设置窗口的大小长宽为30
松鼠爱吃饼干
2021/04/07
1.2K0
Python Tkinter 窗口的管理与设置(一):窗口的最小框架
Windows程序设计——窗口键盘消息滚动事件[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171006.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
5460
七十四、滑动窗口最值问题
滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合。一般用来求最值问题。
润森
2022/08/17
3160
七十四、滑动窗口最值问题
155. 最小栈 & 20. 有效的括号
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
chuckQu
2022/08/19
1730
Python中设置指定窗口为前台活动窗口(最顶层窗口)win32gui
参考链接:Python中设置指定窗口为前台活动窗口(最顶层窗口)win32gui: https://blog.csdn.net/bailichun19901111/article/details/105042145
forxtz
2020/10/10
8.5K0
Python中设置指定窗口为前台活动窗口(最顶层窗口)win32gui
pycharm鼠标滚动控制字体大小_pycharm窗口放大
打开file里面的setting,然后打开Keymap,再搜索框中输入increase,点击increase Font Size,双击Add Mouse Shortcut(先不用点OK)
全栈程序员站长
2022/09/27
1.3K0
pycharm鼠标滚动控制字体大小_pycharm窗口放大
点击加载更多

相似问题

列表的最小/最大和最频繁元素

318

创建滚动子列表的最大和最小列表

317

WINAPI中的最大和最小窗口大小

13

最大和最小日期

12

最小最大和Javascript

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档