什么是滑动窗口算法?例子?

2024-03-05

在解决几何问题时,我遇到了一种称为滑动窗口算法的方法。

确实找不到任何学习材料/详细信息。

该算法是关于什么的?


我认为它更多的是一种技术而不是算法。这是一种可用于各种算法的技术。

我认为通过以下示例可以最好地理解该技术。想象一下我们有这个数组:

[ 5, 7, 1, 4, 3, 6, 2, 9, 2 ]

我们如何找到五个连续元素的最大和?好吧,我们首先看看5, 7, 1, 4, 3看到总和是20。然后我们看看下一组五个连续元素,即7, 1, 4, 3, 6。这些的总和是21。这比我们之前的总和还要多,所以7, 1, 4, 3, 6目前是我们迄今为止最好的。

让我们看看是否可以改进。1, 4, 3, 6, 2?不,这总计为16. 4, 3, 6, 2, 9?总和就是24,所以现在这是我们得到的最佳序列。现在我们进入下一个序列,3, 6, 2, 9, 2。总和就是22,这并没有打败我们目前最好的24。我们已经到达了终点,所以我们已经完成了。

以编程方式实现这一点的强力方法如下:

const getMaxSumOfFiveContiguousElements = (arr) => {
  let maxSum = -Infinity;
  let currSum;

  for (let i = 0; i <= arr.length - 5; i++) {
    currSum = 0;

    for (let j = i; j < i + 5; j++) {
      currSum += arr[j];
    }

    maxSum = Math.max(maxSum, currSum);
  }

  return maxSum;
};

这个的时间复杂度是多少?它是O(n*k)。外循环正在经历n - k + 1项,但是当n远大于k,我们可以忘记k + 1部分并调用它n项目。然后内循环正在经历k项,所以我们有O(n*k)。尝试像这样想象它:

我们能把这个简化为O(n)?让我们回到这个数组:

[ 5, 7, 1, 4, 3, 6, 2, 9, 2 ]

首先我们得到总和5, 7, 1, 4, 3。接下来我们需要求和7, 1, 4, 3, 6。像这样想象它,每组五个元素周围都有一个“窗口”。

第一个窗口和第二个窗口有什么区别?好吧,第二个窗口去掉了5在左边但添加了一个6在右侧。所以既然我们知道第一个窗口的总和是20,为了得到第二个窗口的总和,我们采取20,减去5,并添加6 to get 21。我们实际上不必遍历第二个窗口中的每个元素并将它们相加(7 + 1 + 4 + 3 + 6)。这将涉及重复和不必要的工作。

这里滑动窗口方法最终是两个操作而不是五个操作,因为k is 5。这并不是一个巨大的改进,但你可以想象对于更大的k(以及更大的n)这确实有帮助。

以下是使用滑动窗口技术的代码的工作方式:

const getLargestSumOfFiveConsecutiveElements = (arr) => {
  let currSum = getSum(arr, 0, 4);
  let largestSum = currSum;

  for (let i = 1; i <= arr.length - 5; i++) {
    currSum -= arr[i - 1]; // subtract element to the left of curr window
    currSum += arr[i + 4]; // add last element in curr window
    largestSum = Math.max(largestSum, currSum);
  }

  return largestSum;
};

const getSum = (arr, start, end) => {
  let sum = 0;

  for (let i = start; i <= end; i++) {
    sum += arr[i];
  }

  return sum;
};

这就是滑动窗口技术的要点。在其他问题中,您可能会做一些比获取窗口内元素的总和更复杂的事情。或者窗口本身可能具有不同的大小,而不是我们在这里看到的固定大小 5。但是滑动窗口技术的基本应用应该为您提供构建的基础。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是滑动窗口算法?例子? 的相关文章

  • 反转二进制网络

    如何反转二元方程 以便找到哪些输入将产生给定的输出 Example Inputs i0 through i8 Outputs o0 through o8 Operators XOR AND 二元方程 1 i0 1 i1 0 i2 1 i3
  • 在 Java 中实现排列算法的技巧

    作为学校项目的一部分 我需要编写一个函数 该函数将接受整数 N 并返回数组 0 1 N 1 的每个排列的二维数组 该声明看起来像 public static int permutations int N 该算法描述于http www usn
  • 使用FFT算法计算

    给定在平面上的点 1 0 2 0 n 0 上发现的一组 n 个粒子电荷载流子 在 i 0 点发现的粒子电荷记为 Qi 作用在粒子上的力由以下公式给出 C is a Coulomb s constant 给出一个算法来计算 Fi 对于总复杂度
  • 缩短文本并仅保留重要句子

    德国网站 nandoo net 提供了缩短新闻文章的可能性 如果使用滑块更改百分比值 文本会发生变化并且某些句子会被遗漏 您可以在这里看到它的实际效果 http www nandoo net read article 299925 http
  • 如何查找给定字符串中仅出现一次的第一个字符[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用主方法求解 T(n) = 2T(n/2) + n/log n 和 T(n) = 4T(n/2) + n/log n 之间的差异

    我最近偶然发现了一个资源 其中 2T n 2 n log ntypeMM 宣布复发无法解决 我接受它作为一个引理 直到今天 另一种资源被证明是矛盾的 在某种意义上 根据资源 下面的链接 其中的 Q7 和 Q18 是建议 分别在问题中的1和2
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 有人可以解释以下异或属性

    我的一个论坛提到给定的数组n数字 arr 0 n 1 以下条件成立 is the xor运算符 f l r f 0 r f 0 l 1 where f l r arr l arr l 1 arr r 我检查了上面的数组数量和不同的值l an
  • 在 C++ 中通过引用传递 std 算法谓词

    我正在尝试从 a 中删除元素std list并保留已删除元素的一些统计信息 为此 我使用列表中的remove if 函数 并且我有一个谓词 我想使用这个谓词来收集统计数据 这是谓词的代码 class TestPredicate privat
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 数组中连续元素的最大乘积

    我在现场面试的时候被问到了这个算法问题 由于没有要求我签署保密协议 我将其发布在这里寻求答案 给定一个数组REAL不包含 0 的数字 找到产生最大乘积的连续元素 该算法应在线性时间内运行 我考虑过以下方法 使用两个数组 第一个是利用DP思想
  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • 包围一组点的多边形

    我有一组 S 点 2D 由 x 和 y 定义 我想找到 P 包围该组所有点的最小 含义 具有最少数量的点 多边形 P 是S 有没有已知的算法来计算这个 我在这个领域缺乏文化令人惊讶 感谢您的帮助 对于这个问题有很多算法 它被称为 最小边界框
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • 需要一种将网络块范围折叠为超集范围列表的算法

    我的数学不及格 我需要一种有效的方法将网络范围缩小为超集 例如如果我输入 IP 范围列表 1 1 1 1至2 2 2 5 1 1 1 2至2 2 2 4 10 5 5 5至155 5 5 5 10 5 5 6至10 5 5 7 我想返回以下
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它

随机推荐

  • Log4j 配置 - 不同的日志记录到不同的文件

    对于某些人来说 这可能是一个非常简单的问题 但就我个人而言 我发现 Log4j 配置非常困难 并且学习进行脑部手术可能不那么具有挑战性 我正在尝试让多个记录器登录到不同的文件中 这是我的 log4j properties 文件中的内容 Ro
  • Github桌面认证失败

    使用 Windows 10 Github Desktop Git 2 19 1 windows 1 64位 VisualStudio VSTS 背景 设法添加我的计算机中的存储库 但我无法用它做任何事情 我可以访问远程存储库 我之前使用过
  • Magento getUrl 不适用于目录/类别对象?

    我已经能够实例化一个类别对象来检索其名称 但是当我使用getUrl方法它不会返回类别列表页面的 URL 或任何其他内容 上面的代码会产生 HTML 输出 li a href name of sub cat a li 有谁知道我如何从
  • 黑莓 Twitter 集成以发布照片

    我正在开发一个应用程序 用户可以在运行 OS 5 0 的 BlackBerry Storm 和 Torch 系列手机上将照片分享到 Facebook 和 Twitter 对于 Facebook 我使用了草莓项目 但对于 Twitter 我找
  • 如何使用多个 CBCharacteristicProperties 和权限初始化 CBMutableCharacteristic

    我正在创建一个新的 CBMutableCharacteristic 以在我正在制作的蓝牙应用程序中使用 我从教程中得到了一些代码 如下所示 customCharacteristic CBMutableCharacteristic alloc
  • 如何在React项目中添加Service Worker

    我想在我的 React 项目中添加 Service Worker 项目已准备就绪 默认服务似乎不起作用 即使当我尝试导入它时 它也会出现以下错误 尝试导入错误 registerServiceWorker 不包含默认导出 导入为 regist
  • GWT 模块的模块标记中的 rename-to 是什么意思?

    GWT 模块中模块标记的 rename to 属性是什么意思 是可选的吗 它 导致编译器表现得好像模块的名称与长的 完全限定的名称不同 http code google com webtoolkit doc latest DevGuideO
  • 在 MySql 中提取具有特定模式的子字符串

    我有一个文本字段 如下所示 option A sum A g3et B 我想获取里面的文字 没有重复项 获得意义 A B 不可能出现双重like的情况 我知道这是一种在数据库中保存数据的可怕方法 我无法更改数据的保存方式 我只需要从本专栏中
  • 红宝石。合并嵌套哈希而不覆盖

    我有一个嵌套哈希 X 1 2 3 gt X O 2 3 gt X O X 3 gt X O X O 我想合并给定的嵌套哈希 X 1 2 3 gt X O 2 3 gt X O 2 X gt X O O X 这样 X 1 2 3 gt X O
  • 如何更改Windows Phone应用程序中按钮的背景颜色?

    我正在使用 C 和 silverlight 4 开发 Windows Phone 7 应用程序 我是 silverlight 的新手 我的应用程序中有两个用于不同目的的按钮 我想在单击按钮时动态更改按钮的颜色 所以我使用下面的代码 Inco
  • 办公自动化、VSTO 和 Open XML SDK 之间有什么区别?

    办公自动化 VSTO 和 Open XML SDK 之间有什么区别 我们需要所有这些还是其中一些已经过时了 办公自动化是指使用 COM 互操作以编程方式操作 Office 程序 或更常见的是通过 Office 程序操作 Office 文档
  • 默默忽略remove()

    实体 A 引用 多对一 实体 B 具有从 B 到 A 的反向 映射 引用 此外 还存在 A 到 C 的引用以及 C 到 A 的反向引用 当我发出entityManager remove A 然后flush 时 不会生成 删除 但也没有例外
  • ld:找不到 AudioUnit 框架

    我正在添加另一个项目 即使我添加了所需的所有库 我也会收到此错误 这是错误详细信息 Ld Users alialzahrani Library Developer Xcode DerivedData IMS3 ezltqoccjhjpvua
  • 如何在 React.js 中预加载图像?

    如何在 React js 中预加载图像 我有下拉选择组件 其工作方式类似于菜单 但我必须预加载项目的图像图标 因为有时它们在第一次打开时不可见 我努力了 https github com sambernard react preload h
  • 使用 xslt 从 xml 转换而来的平面文件中的行数

    下面是我用来将 xml 转换为平面文件的 xsl 它还满足各种其他所需条件
  • iOS7 深色键盘和浅色键盘之间的切换

    In iOS7 we have both a dark and a light keyboard Is it possible for me to change between these in my app by code textfie
  • 当任何包含公式的单元格发生更改时触发宏

    我有一个包含大约 50 个单元格 包含公式 的工作表 这些单元格根据外部工作簿中的单元格而变化 当这些单元格中的任何一个更改其值时 我想触发某个宏 Worksheet change 事件不起作用 并且 Worksheet Calculate
  • C# RichEditBox 性能极慢(加载 4 分钟)

    The RichEditBoxC 中的控件 我使用 VS 2005 性能较差 我将包含 45 000 行彩色文本的 2 5 MB RTF 文件加载到控件中 需要 4 分钟 我将相同的 RTF 加载到 Windows XP 写字板的 RTF
  • Python Flask 从像 render_template 这样的变量渲染文本

    我知道烧瓶功能render template 我必须给出模板的文件名 但现在我想渲染模板的字符串 即模板的内容 这就说得通了 但我现在不想解释原因 如何简单地渲染模板的文本 您可以使用render template string http
  • 什么是滑动窗口算法?例子?

    在解决几何问题时 我遇到了一种称为滑动窗口算法的方法 确实找不到任何学习材料 详细信息 该算法是关于什么的 我认为它更多的是一种技术而不是算法 这是一种可用于各种算法的技术 我认为通过以下示例可以最好地理解该技术 想象一下我们有这个数组 5