算法 RingBuffer
https://en.wikipedia.org/wiki/Circular_buffer
某大外企面试问到到一个,当时有点紧张,然后用链表实现,最后写的也有些问题,要求的单元测试也没有完成。
两种实现,使用数组或者链表,相对来说不需要随机访问,使用链表会更好,实现上链表也更容易些。
接口定义,实际使用应该定义泛型接口
package com.ljw.javatest; // Ringbuffer is a circle, and has a head and tail.
// When add item, add item at tail, if item's quantity exceed max,
// then delete the head item.
public interface RingBuffer{ public void addItem(int value);
//return the oldest item
public Integer getItem();
//delege the oldest item
public void deleteItem();
//return item from head to tail
public Integer[] getAll();
}
链表实现,定义了一个内部类存储节点
package com.ljw.javatest;
public class RingBufferWithLinked implements RingBuffer{
class Node{
Integer value;
Node next;
Node(Integer value){
this.value=value;
}
}
private int max;
private int count;
private Node head;
private Node tail;
public RingBufferWithLinked(int max) throws Exception {
if(max<=0){
throw new Exception("invalid max");
}
this.max=max;
this.count=0;
}
@Override
public void addItem(int value) {
if(head==null){
head=new Node(value);
tail=head;
count++;
return;
}
Node temp = new Node(value);
tail.next = temp;
tail = temp;
if (count < max) {
count++;
return;
}
head=head.next;
}
@Override
public Integer getItem() {
if(head!=null){
return head.value;
}
return null;
}
@Override
public void deleteItem() {
if(head==null){
return;
}
head=head.next;
count--;
if(count==0){
head=tail=null;
}
}
@Override
public Integer[] getAll() {
if(head==null){
return null;
}
Integer[] result=new Integer[count];
int i=0;
Node temp=head;
while(temp!=null){
result[i++]=temp.value;
temp=temp.next;
}
return result;
}
}
数组实现,如果说不好,可能就是需要分配连续空间,以及最大不能超过数组最大长度
package com.ljw.javatest;
import java.util.List;
public class RingBufferWithArray implements RingBuffer {
public static void main(String[] args) {
}
Integer[] buffer;
int head;
int tail;
int max;
int count;
public RingBufferWithArray(int max) throws Exception {
if (max <= 0) {
throw new Exception("invalid max");
}
buffer = new Integer[max];
this.max = max;
count = 0;
head = -1;
tail = -1;
}
@Override
public void addItem(int value) {
if (count + 1 > max) {
buffer[head] = value;
tail = head;
if (head == max - 1) {
head = 0;
} else {
head++;
}
} else {
count++;
if (count == 1) {
head=tail=0;
buffer[head]=value;
}
else {
if (tail == max - 1) {
tail = 0;
buffer[tail] = value;
} else {
buffer[++tail] = value;
}
}
}
}
@Override
public Integer getItem() {
if (head == -1) {
return null;
} else {
return buffer[head];
}
}
@Override
public void deleteItem() {
if (count == 0) {
return;
}
buffer[head] = null;
count--;
if (count == 0) {
head = tail = -1;
}
if (head++ == max) {
head = 0;
}
}
@Override
public Integer[] getAll() {
if (head == -1) {
return null;
}
Integer[] result = new Integer[count];
for (int i = 0, temp = head; i < count; i++, temp++) {
if (temp == max) {
temp = 0;
}
result[i] = buffer[temp];
}
return result;
}
}
测试,主要的边界情况是max=1,以及增加元素超过时如何处理。
package com.ljw.javatest;
public class App {
public static void main(String[] args) throws Exception {
int max=3;//max=1;
RingBuffer rb=new RingBufferWithLinked(max);
rb.addItem(1);
print(rb.getItem()==1);
rb.deleteItem();
print(rb.getItem()==null);
int add=2;
for(int i=0;i<max+add;i++){
rb.addItem(i);
}
Integer[] result=rb.getAll();
for(int i=0;i<max;i++){
print(result[i]==i+add);
}
}
public static void print(Object value){
System.out.println(value);
}
}
算法 RingBuffer的更多相关文章
- 算法:基于 RingBuffer 的 Queue 实现《续》
背景 上篇实现了一个简单的队列,内部使用了 _count 计数,本文采用另外一种模式,不用 _count 计数. RingBuffer 不用 _count 计数的话,为了区分队列的满和空,需要在数组中 ...
- 算法:基于 RingBuffer 的 Queue 实现
背景 如果基于数组实现队列,常见的选择是采用 RingBuffer,否则就需要移动数组元素. RingBuffer 很容易看出 RingBuffer 的思想,这里就不赘述了. 您可以思考一个问题:图中 ...
- 算法:基于 RingBuffer 的 Deque 实现
背景 前两篇文章介绍了 Queue 的实现,很多类库都引入了 Deque,Deque 可以两头添加和删除,然后在 Deque 之上构建 Queue 和 Stack. Deque 代码 using Sy ...
- 算法(第四版)C# 习题题解——2.2
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更为方便的版本见:http ...
- 算法(第四版)C# 习题题解——1.3
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 这一节内容可能会用到的库文件有 ...
- Disruptor底层实现讲解与RingBuffer数据结构讲解
Disruptor术语 RingBuffer:被看作Disruptor最主要的组件,然而从2.0开始RingBuffer仅仅负责存储和更新在Disruptor中流通的数据.对一些特殊的使用场景能够被用 ...
- 从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论
1. 引言 - 近似近邻搜索被提出所在的时代背景和挑战 0x1:从NN(Neighbor Search)说起 ANN的前身技术是NN(Neighbor Search),简单地说,最近邻检索就是根据数据 ...
- 一篇文章彻底搞懂snowflake算法及百度美团的最佳实践
写在前面的话 一提到分布式ID自动生成方案,大家肯定都非常熟悉,并且立即能说出自家拿手的几种方案,确实,ID作为系统数据的重要标识,重要性不言而喻,而各种方案也是历经多代优化,请允许我用这个视角对分布 ...
- 物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区
物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区 随着5G的普及,物联网安全显得特别重要,himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Applicatio ...
- 彻底搞懂snowflake算法及百度美团的最佳实践
写在前面的话 一提到分布式ID自动生成方案,大家肯定都非常熟悉,并且立即能说出自家拿手的几种方案,确实,ID作为系统数据的重要标识,重要性不言而喻,而各种方案也是历经多代优化,请允许我用这个视角对分布 ...
随机推荐
- 让集成更安心,让连接更高效:鸿蒙生态伙伴SDK优选库双端赋能
2025年8月30日,鸿蒙生态大会在深圳圆满举办.在主题为"共建鸿蒙SDK统一规范,筑基千行百业生态繁荣"的鸿蒙生态伙伴SDK分论坛上,重点介绍了SDK优选库的最新进展,解读了SD ...
- 2025年中国代码托管平台榜单:Gitee位居榜首,得益于本土优势与生态繁荣
Gitee领跑中国代码托管市场:本土化优势与全球化视野的双重奏 在数字经济蓬勃发展的今天,代码托管平台已成为企业数字化转型的重要基础设施.中国代码托管市场正以惊人的速度扩张,预计到2025年市场规模将 ...
- GB28181/RTSP监控视频网页多窗口播放时如何自动主子码流切换支持同时播放更多路视频
浏览器在做监控视频播放时,本身性能达不到CS客户端的性能.加上GB28181协议默认只能取到下级视频主码流的问题,使浏览器同时多窗口播放时播放路数不是很多. 1.为什要智能码流 监控摄像头的视频画面, ...
- LiveRTMP推送RTSP视频源进行RTMP直播
LiveRTMP ##RTSP视频源进行RTMP直播 /* NVSource从RTSPClient获取数据后回调给上层 */ int Easy_APICALL __RTSPSourceCallBack ...
- 简易数字电压表+ADC0809+总线方式实现一路数据转换
1 实验现象 2 实验原理(略) 3 系统设计(略) 4 硬件设计 5 软件设计 5.1 主函数 #include "DisplaySmg.h" #include "AD ...
- 网页代码:window.open()打开窗口的几种方式
1. 在当前窗口打开百度,并且使URL地址出现在搜索栏中. window.open("http://www.baidu.com/", "_search"); w ...
- HarmonyOS 3:操作系统一小步,万物互联一大步
「 三年三代,作为全球发展最快的操作系统,华为今天正式发布了HarmonyOS 3. 」 到今天为止,搭载HarmonyOS 2的华为设备数就超过了3亿,HarmonyOS Connect生态设备累计 ...
- 模拟集成电路设计系列博客——4.3.2 双晶体管MOSFET-C积分器
4.3.2 双晶体管MOSFET-C积分器 MOSFET-C滤波器类似于全差分有源RC滤波器,除了电阻被等效的线性区MOS晶体管所取代.由于有源RC和MOSFET-C滤波器紧密关联,对于设计者来说,一 ...
- 模拟集成电路设计系列博客——4.1.4 二阶Gm-C滤波器
4.1.4 二阶Gm-C滤波器 下图展示了一个全差分二阶\(G_m-C\)滤波器,其传输函数可以表达为: \[H(s)=\frac{V_{out}(s)}{V_{in}(s)}=\frac{s^2C_ ...
- ORA-01092 ORA-00604 ORA-08103故障处理---惜分飞
联系:手机/微信(+86 17813235971) QQ(107644445) 标题:ORA-01092 ORA-00604 ORA-08103故障处理 作者:惜分飞版权所有[未经本人同意,不得以任何 ...