某日事不多,点开sentinel-core代码学习,想看看qps、rt等是怎么统计的。

点开StatisticSlot类,发现里面是用DefaultNode增加qps,然后尝试点开

DefaultNode->StatisticNode->ArrayMetric->MetricsLeapArray->LeapArray...

晕...怎么这么多类- -||| 中间还有MetricBucket、LongAdder...

其中LeapArray类有个属性AtomicReferenceArray> array,表示这个jdk类也是第一次见orz

看注释写道Using sliding window algorithm,使用了滑动窗口算法。可是这代码太深奥T_T,表示打扰了,还是洗洗睡了Zzz....

--------------------------------------------------------------------------------------------------------------------------------------------

言归正传,虽然sentinel中的代码还看不懂,通过滑动窗口几个字,百度了解一下:)

找到一个经典的问题:

(一)给定一组大小为n的整数数组,计算长度为k的子数组和的最大值。

比如

数组为:1,2,3,4

最大值为:3+4=7

数组为:-1,4,7,-3,8,5,-2,6

最大值为:7-3+8=12

想到最简单思路,那就遍历所有子数组呗,求和然后比较。

int index = 0;//记录最大子数组第1个元素的索引,目前是0

int maxSum = 0;//记录最大子数组和,目前是从左开始第1个子数组

for (int i = 0; i < k; i++) {

maxSum+=array[i];

}for (int i = 1; i <= array.length - k; i++) {//遍历所有子数组,求和并比较

int curSum = 0;for (int j=0; j < k; j++) {//计算当前子数组和

curSum += array[i +j];

}if (curSum > maxSum) {//如果大于最大和,则记录

maxSum =curSum;

index=i;

}

}

运用滑动窗口思路,遍历时不嵌套循环计算所有值;外层遍历相当于窗口向右滑动,每次减去失效值加上最新值,即为当前窗口的和,然后再比较。

int index = 0;//记录最大子数组第1个元素的索引,目前是0

int maxSum = 0;//记录最大子数组和,目前是从左开始第1个子数组

for (int i = 0; i < k; i++) {

maxSum+=array[i];

}int curWindowSum =maxSum;for (int i = 1; i <= array.length - k; i++) {//从下个元素开始,即窗口向右滑动

curWindowSum = curWindowSum - array[i - 1] + array[k + i - 1];//减去失效值,加上最新值

if (curWindowSum > maxSum) {//如果大于最大和,则记录

maxSum =curWindowSum;

index=i;

}

}

可以看到代码差不多,只不过在计算求和时,采取了滑动窗口技术(思路),通过一减一加求和,消除了内部的循环。

注:这里为了突出语义,将变量名curSum改为curWindowSum

完整代码如下:

packagecom.cdfive.learn2018.algorithm;/*** 求数组array长度为k的子数组的最大和

*

* 算法1-cal

* 遍历所有子数组,求和并比较

* 嵌套循环 O(n*k)

*

* 算法2-calByLeapWinow

* 窗口向右滑动,减去失效值加上最新值

* 单层循环 O(n)

*

* input: array=[1,2,3,4] k=2

* output: 7 // 3+4

*

* input: array=[-1,4,7,-3,8,5,-2,6] k=3

* output: 12 // 7-3+8

*

*@authorcdfive

* @date 2018-12-02*/

public classSimpleLeapWindow1 {public static voidmain(String[] args) {

cal(new int[]{1, 2, 3, 4}, 2);

cal(new int[]{-1,4,7,-3,8,5,-2,6}, 3);

System.out.println("-------------");

calByLeapWinow(new int[]{1, 2, 3, 4}, 2);

calByLeapWinow(new int[]{-1,4,7,-3,8,5,-2,6}, 3);

}/*** 遍历所有子数组,求和并比较

* 嵌套循环 O(n*k)*/

public static void cal(int[] array, intk) {if (array.length == 0 || k <= 0 || k > array.length) {//非法参数不处理

return;

}int index = 0;//记录最大子数组第1个元素的索引,目前是0

int maxSum = 0;//记录最大子数组和,目前是从左开始第1个子数组

for (int i = 0; i < k; i++) {

maxSum+=array[i];

}for (int i = 1; i <= array.length - k; i++) {//遍历所有子数组,求和并比较

int curSum = 0;for (int j=0; j < k; j++) {//计算当前子数组和

curSum += array[i +j];

}if (curSum > maxSum) {//如果大于最大和,则记录

maxSum =curSum;

index=i;

}

}/**打印结果*/System.out.print(maxSum+ " // ");//打印最大和

System.out.print(array[index]);//先打印第1个值

for (int i = 1; i < k; i++) {int value = array[i +index];

System.out.print(value>= 0 ? ("+" + value) : value);//非负数前面打印+号

}

System.out.println();

}/*** 窗口向右滑动,通过减失效值加最新值求和并比较

* 单层循环 O(n)*/

public static void calByLeapWinow(int[] array, intk) {if (array.length == 0 || k <= 0 || k > array.length) {//非法参数不处理

return;

}int index = 0;//记录最大子数组第1个元素的索引,目前是0

int maxSum = 0;//记录最大子数组和,目前是从左开始第1个子数组

for (int i = 0; i < k; i++) {

maxSum+=array[i];

}int curWindowSum =maxSum;for (int i = 1; i <= array.length - k; i++) {//从下个元素开始,即窗口向右滑动

curWindowSum = curWindowSum - array[i - 1] + array[k + i - 1];//减去失效值,加上最新值

if (curWindowSum > maxSum) {//如果大于最大和,则记录

maxSum =curWindowSum;

index=i;

}

}/**打印结果*/System.out.print(maxSum+ " // ");//打印最大和

System.out.print(array[index]);//先打印第1个值

for (int i = 1; i < k; i++) {int value = array[i +index];

System.out.print(value>= 0 ? ("+" + value) : value);//非负数前面打印+号

}

System.out.println();

}

}

--------------------------------------------------------------------------------------------------------------------------------------------

参考:

c语言 滑窗法_滑动窗口算法(一)相关推荐

  1. python 滑窗法检测房颤分类

    python 滑窗法检测房颤分类 判断信号的峰值间的距离是否相差较少 废话不说,直接上程序!记得点赞!!!!!! 思路主要是使用滑窗找到最大值对应的位置,最大值对应的位置相差间距求出来,相邻较小的位置 ...

  2. 列表左右箭头滑动_我写了一套框架,把滑动窗口算法变成了默写题

    读完本文,你可以去力扣拿下如下题目: 76.最小覆盖子串 567.字符串的排列 438.找到字符串中所有字母异位词 3.无重复字符的最长子串 ----------- 鉴于前文 二分搜索框架详解 的那首 ...

  3. window两个窗口上下摆放_滑动窗口技巧

    读完本文,你可以去力扣拿下如下题目: 76.最小覆盖子串 567.字符串的排列 438.找到字符串中所有字母异位词 3.无重复字符的最长子串 ----------- 鉴于前文 二分搜索框架详解 的那首 ...

  4. 滑动窗口算法(C语言版讲解)

    滑动窗口算法(C语言讲解) 滑动窗口算法主要用于解决字符串查找对应排序的题型. 算法的基本思路 1.辅助算法 :快慢指针 由于要运用快慢指针的思想,这里读者需要先了解快慢指针. typedef str ...

  5. 滑动窗口算法_有点难度,几道和「滑动窗口」有关的算法面试题

    前言科普:什么是滑动窗口算法 滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合. 假设有数组 [a b c d e f g h ],一个大小为 3 的 **滑动窗 ...

  6. 学渣的刷题之旅 leetcode刷题 3. 无重复字符的最长子串(暴力法、滑动窗口)

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  7. c语言怎么实现滑动窗口算法,【C语言】滑动窗口算法

    1.滑动窗口的思想: 它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合.假设有数组 [a b c d e f g h ],一个大小为 3 的 滑动窗口 在其上滑动,则有: [a b c] ...

  8. Python数据结构与算法篇(四)-- 滑动窗口算法

    数组和链表代表着计算机最基本的两种存储形式:顺序存储和链式存储,所以他俩可以算是最基本的数据结构.数组是一种基础数据结构,可以用来处理常见的排序和二分搜索问题,典型的处理技巧包括双指针.滑动窗口等,数 ...

  9. 滑动窗口算法用法及实题详解

    在力扣常用解题法中,我们常常会看到这些: 滑动窗口 双指针 快慢指针/ 链表题目 原地链表翻转 区间合并 无序限定范围的数组元素查找O(N) BFS 树的DFS DFS/递归/回溯法 双堆模式 2分变 ...

最新文章

  1. 删除重复字符串的算法
  2. 裸板烧写 bootloader
  3. memmove函数使用时注意的问题
  4. mysql免安装5.7.17_mysql免安装5.7.17数据库配置
  5. Windows系统安全从定制IP策略开始
  6. python的__name__
  7. 制作一个简单HTML个人网页网页(HTML+CSS)web前端大作业
  8. 如何不用u盘将32位Windows转为64位Windows
  9. 【番外篇】波动率的几种模型
  10. anaconda安装及pytorch、tf、jupyter环境配置
  11. Cadence Orcad Capture Place pin的窗口的深入讲解图文
  12. C++ 函数调用过程中栈区的变化——(栈帧、esp、ebp)
  13. 计算机应用课程设计样式大全,《计算机应用基础》课程设计
  14. 大学计算机类专业按成绩分,那个大学的计算机专业比较好
  15. 选择所在城市html按字母,微信小程序实现根据字母选择城市功能
  16. 智能超表面(RIS)原理,具体实现,全向智能超表面(IOS)应用
  17. 基于Python实现的酒店住房管理系统
  18. 网游外挂编写完全攻略
  19. golang java微服务_Golang 微服务教程(四)
  20. CCRC信息安全服务资质认证简介

热门文章

  1. JAVA实现文件批量打包下载
  2. 多普达565 GPRS上网设置方法(搞这个头都大了)
  3. 从0开始 独立完成企业级Java电商网站开发(服务端)
  4. 计算机常见故障ppt,计算机硬件组成与常见故障排错.ppt
  5. Android 调用相机APP获取拍照图片和从相册选择图片
  6. mysql 魔乐_魔乐科技 李--兴--华 企业级架构会话授权管理 OAuth
  7. 去除map中的undefined
  8. 未来的工作都被计算机代替,未来计算机或机器人会替代人类的工作吗?为什么?_科技数码通...
  9. DIV2K数据集官网点击但是不能下载的解决方法
  10. CentOS7 离线安装 Zabbix5.0