Featured image of post 数据结构-环形数组

数据结构-环形数组

1 什么是环形数组

简单来说,环形数组就是头尾相接的数组

image

环形数组有以下特点:

  • 长度固定
  • 下标不越界
  • 需要两个指针标识数组的真实头尾下标

2 物理实现

实际上在实现环形数组结构的时候,用的就是普通数组,只需要将环形数组的下标转为普通数组的下标即可。

2.1 下标算法

由环形数组的结构很容易想到,当下标移动位数等于数组长度时就回到了原来的位置,所以移动时转了几圈并不影响结果,只需要对移动位数取余,然后移动余数位即可。

2.1.1 正向移动

比如数组长度是8,当前索引位置在5,向前3位则下标应变为0。

所以正向移动的算法是:(当前下标+步数) % 总长度

image

2.1.2 反向移动

反向移动如果和正想移动一样直接取余,得到的依然是负数,这在python中其实已经可以直接用了,但是在java/c++/go等语言中数组不支持负数索引,需要再处理一下。

比如数组长度是8,当前位置为 2,移动-3,那么下标应该是 7。

反向移动的算法是:(当前下标+步数) % 总长度 +总长度

image

3 应用场景

  • 环形缓冲池
  • 时间轮定时器