1 什么是环形数组
简单来说,环形数组就是头尾相接的数组
环形数组有以下特点:
- 长度固定
- 下标不越界
- 需要两个指针标识数组的真实头尾下标
2 物理实现
实际上在实现环形数组结构的时候,用的就是普通数组,只需要将环形数组的下标转为普通数组的下标即可。
2.1 下标算法
由环形数组的结构很容易想到,当下标移动位数等于数组长度时就回到了原来的位置,所以移动时转了几圈并不影响结果,只需要对移动位数取余,然后移动余数位即可。
2.1.1 正向移动
比如数组长度是8,当前索引位置在5,向前3位则下标应变为0。
所以正向移动的算法是:(当前下标+步数) % 总长度
2.1.2 反向移动
反向移动如果和正想移动一样直接取余,得到的依然是负数,这在python中其实已经可以直接用了,但是在java/c++/go等语言中数组不支持负数索引,需要再处理一下。
比如数组长度是8,当前位置为 2,移动-3,那么下标应该是 7。
反向移动的算法是:(当前下标+步数) % 总长度 +总长度
3 应用场景
- 环形缓冲池
- 时间轮定时器