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的更多相关文章

  1. 算法:基于 RingBuffer 的 Queue 实现《续》

    背景 上篇实现了一个简单的队列,内部使用了 _count 计数,本文采用另外一种模式,不用 _count 计数. RingBuffer 不用 _count 计数的话,为了区分队列的满和空,需要在数组中 ...

  2. 算法:基于 RingBuffer 的 Queue 实现

    背景 如果基于数组实现队列,常见的选择是采用 RingBuffer,否则就需要移动数组元素. RingBuffer 很容易看出 RingBuffer 的思想,这里就不赘述了. 您可以思考一个问题:图中 ...

  3. 算法:基于 RingBuffer 的 Deque 实现

    背景 前两篇文章介绍了 Queue 的实现,很多类库都引入了 Deque,Deque 可以两头添加和删除,然后在 Deque 之上构建 Queue 和 Stack. Deque 代码 using Sy ...

  4. 算法(第四版)C# 习题题解——2.2

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更为方便的版本见:http ...

  5. 算法(第四版)C# 习题题解——1.3

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 这一节内容可能会用到的库文件有 ...

  6. Disruptor底层实现讲解与RingBuffer数据结构讲解

    Disruptor术语 RingBuffer:被看作Disruptor最主要的组件,然而从2.0开始RingBuffer仅仅负责存储和更新在Disruptor中流通的数据.对一些特殊的使用场景能够被用 ...

  7. 从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论

    1. 引言 - 近似近邻搜索被提出所在的时代背景和挑战 0x1:从NN(Neighbor Search)说起 ANN的前身技术是NN(Neighbor Search),简单地说,最近邻检索就是根据数据 ...

  8. 一篇文章彻底搞懂snowflake算法及百度美团的最佳实践

    写在前面的话 一提到分布式ID自动生成方案,大家肯定都非常熟悉,并且立即能说出自家拿手的几种方案,确实,ID作为系统数据的重要标识,重要性不言而喻,而各种方案也是历经多代优化,请允许我用这个视角对分布 ...

  9. 物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区

    物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区 随着5G的普及,物联网安全显得特别重要,himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Applicatio ...

  10. 彻底搞懂snowflake算法及百度美团的最佳实践

    写在前面的话 一提到分布式ID自动生成方案,大家肯定都非常熟悉,并且立即能说出自家拿手的几种方案,确实,ID作为系统数据的重要标识,重要性不言而喻,而各种方案也是历经多代优化,请允许我用这个视角对分布 ...

随机推荐

  1. 国产化浪潮下,Gitee如何成为技术团队的项目管理新基建?

    国产化浪潮下,Gitee如何成为技术团队的项目管理新基建? 在数字化转型加速的今天,项目管理工具已成为企业技术栈中不可或缺的一环.随着国产化替代趋势的深化,本土开发者对兼具高效协作与安全合规的工具需求 ...

  2. 【iOS】去除第三方warning

    转载请注明出处 在开发中,我们常常遇到警告(warning).有的是我们自己写出来的,可以解决.有的则是导入的第三方库造成的. 在强迫症看来,一些警告可能会不好看,回想去掉.那么如何去除这些呢? 方法 ...

  3. 【拓展】图的渲染工具-Mermaid

    [拓展]图的渲染工具-Mermaid 目录 [拓展]图的渲染工具-Mermaid Mermaid简介 Mermaid能绘制哪些图 绘图示例 流程图Flowchart 饼图Pie 甘特图Gantt Me ...

  4. 智能加速计算卡设计原理图:688-基于 VM1302的双路100G光纤PCIe4.0X16加速计算卡

    一.产品概述 基于Xilinx芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v4.0 x16智能加速计算卡,该智能卡拥有高吞吐量.低延时的网络处理能力以及辅助CPU ...

  5. 国产化板卡设计原理图:2288-基于FMC接口的JFM7K325T PCIeX4 3U VPX接口卡

    基于FMC接口的JFM7K325T PCIeX4 3U VPX接口卡 一.板卡概述 标准VPX 3U板卡, 基于JFM7K325T 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG90 ...

  6. 题解:P14065 [PO Final 2022] 对弈 / Laserschack

    题目传送门 先警示后人: 我在看题目的时候看成了 \(1 \le r,c \le 4000\) 然后被迫想了一个 \(\operatorname{O}(\operatorname{RC} \ \ope ...

  7. 本地编译安装python包时,指定版本

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  8. 【有源码】在线视频教育平台系统+SpringBoot+VUE+前后端分离

    学弟,学妹好,我是爱学习的学姐,今天带来一款优秀的项目:在线视频教育平台. 本文介绍了系统功能与部署安装步骤,如果您有任何问题,也请联系学姐,偶现在是经验丰富的程序员! 一. 系统演示 管理后台-截图 ...

  9. 大模型基础补全计划(五)---seq2seq实例与测试(编码器、解码器架构)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   无 前言       本文是这个系列第五篇,它们是 ...

  10. 软件神器 --- 安卓本地虚拟机 之 51虚拟机,vmos,挽念虚拟机、光速虚拟机、X8沙箱

    软件神器 安卓本地虚拟机 之 51虚拟机,vmos,挽念虚拟机