180607-手写定长数组

文章链接:https://liuyueyi.github.io/hexblog/2018/06/07/180607-手写定长数组/

手写定长数组

有个背景场景如下:

一天划分为1440分钟,每分钟记录一个数据块,然后用一个数据结构存储着1440个数据块,随着时间的推移,每过一分钟,向这个数据结构中添加一块,并移除最前的那个;其次就是我希望根据当前的时间,可以获取往前n分钟的数据块

简单来说,上面的需求解析如下:

  • 一个数组,容量为1440
  • 频繁的新增和删除
  • 随机的访问

后面两个就限制了ArrayList和LinkedList的使用场景了,所以为了满足这个场景,然后写了一个简单的数据结构

I. 滑动定长数组

来两个偏移量,将数组看成一个循环的结构,一个Start,一个End,分别记录开始和结束,直接在End处添加数据,每次删start处的数据;定位则计算与End或者Start的偏移量来做,超简单的实现如下:

 @SuppressWarnings("unchecked")
public static class DArray<T> {
    private Object[] arys;
    private int size;
    private int start;
    private int end;
    @Getter
    private int capacity;

    public DArray(int size) {
        this.size = size;
        this.arys = new Object[size];
        start = 0;
        end = start;
        capacity = 0;
    }

    public void add(T obj) {
        arys[end] = obj;
        end = (++end) % size;
        ++capacity;
    }

    public T remove() {
        if (capacity == 0) {
            return null;
        }

        Object obj = arys[start];
        arys[start] = null;
        start = (++start) % size;
        --capacity;
        return (T) obj;
    }

    public T index(int index) {
        return (T) arys[(start + index) % size];
    }
}

II. 其他

一灰灰Blog: https://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

扫描关注

blogInfoV2.png

原文地址:https://www.cnblogs.com/yihuihui/p/9157318.html

时间: 2024-11-09 00:06:18

180607-手写定长数组的相关文章

快学Scala 第三课 (定长数组,变长数组, 数组循环, 数组转换, 数组常用操作)

定长数组定义: val ar = new Array[Int](10) val arr = Array("aa", "bb") 定长数组赋值: arr(0) = "cc" 变长数组定义: val ab = new ArrayBuffer[String]() val ab1 = ArrayBuffer[String]() 定长数组增加元素: ab += "aa" ab += ("bb", "cc&q

&lt;数据结构系列1&gt;封装自己的数组——手写动态泛型数组

哈哈,距离上一次写博客已经快过去半个月了,这这这,好像有点慢啊,话不多说,开始我们的手写动态泛型数组 首先是我们自己写一个自己的动态数组类,代码如下所示: public class Array<E> { //成员变量:数据,大小 private E[] data; private int size; //构造函数,传入数组的容量capacity public Array(int capacity) { data=(E[])new Object[capacity]; size=0; } //无参

教你如何使用Java手写一个基于数组实现的队列

一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作.队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加. 在Java中队列又可以分为两个大类,一种是阻塞队列和非阻塞队列. 1.没有实现阻塞接口: 1)实现java.util.Queue的LinkList, 2)实现java.util.Abstra

数据结构-串的定长顺序存储

串的定长顺序存储类似于线性表的顺序存储结构,用一组连续的存储单元存储串值的字符序列. 在串的定长顺序存储结构中,按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区,则可以用定长数组表示: 1 /*串定长顺序存储表示*/ 2 #define MAXSTRLEN 255 //串在MAXSTRLEN大小 3 typedef unsigned char SString[MAXSTRLEN + 1]; //所有串的0号单元存储串的长度 串的基本操做函数如下: 1 /*生成一个其值等于chars的

Tensorflow快餐教程(1) - 30行代码搞定手写识别

去年买了几本讲tensorflow的书,结果今年看的时候发现有些样例代码所用的API已经过时了.看来自己维护一个保持更新的Tensorflow的教程还是有意义的.这是写这一系列的初心. 快餐教程系列希望能够尽可能降低门槛,少讲,讲透. 为了让大家在一开始就看到一个美好的场景,而不是停留在漫长的基础知识积累上,参考网上的一些教程,我们直接一开始就直接展示用tensorflow实现MNIST手写识别的例子.然后基础知识我们再慢慢讲. Tensorflow安装速成教程 由于Python是跨平台的语言,

手写数组去重

//本来以为挺简单,还是天真,考虑,NaN,{}. 1:arr.splice(i+1,1);//表示插入删除元素,表示删除i+1个元素,1表示删除一个 //手写数组去重                          var arr = [1,2,3,3]; //排序的数组 arr.sort();//排序好了就不写了                          for(var i=0;i<arr.length-1;i++)                          {      

长春开手撕定额发票“哪里能开,怎么开,如何开”

长春开手撕定额发票 (保真)[电V:188.ぁ.2028.ぁ.6526张生]αα:6300.ぁ.55060]]]“装饰.搬运.劳务费.咨询费.修理费.加工修理.机械租赁 华为Mate X发布之后,其创新的外折叠式设计广受好评.由于华为采用了不同于三星的双屏折叠设计,同时余承东在发布会上大肆夸赞华为研发实力,让很多网友认为目前只有华为才能做出Mate X这样的外折叠屏手机.然而,事实似乎并非如此. OPPO副总裁沈义人昨天在微博上曝光自家外折叠屏手机,除了屏幕边框比华为Mate X

c++后台开发面试常见知识点总结(六)算法手写

链表倒转  leetcode-206 连续子数组最大和问题(和最大的连续子序列的和)   leetcode-53 输出字符串中最长的回文子串长度?  leetcode-5 一个字符串,求最长无重复子串的长度?  leetcode-3 最长递增子序列  leetcode-300 反转一个字符串......(手写代码) leetcode-344 数组中存在一个大于n/2次的数,如何以最优方法查找它?LeetCode 169 \ 229 一个字符串中{}  [ ]  ()匹配问题     LeetCo

IOS基础UI之(三)手写UI和storyboard方式实现图片移动和缩放

手写UI是最早进行UI界面布局的方法,优点是灵活自由,缺点是使代码看起来比较长.平时学习的时候可以多尝试手写ui,这样会更深入熟悉控件.storyboard开发效率相对比较高.实际开发中看情况而定!! 下面用这两种方式分别实现图片移动和缩放. 功能描述: 1. 界面布局 2.点击相应的按钮,对显示的图片移动.缩放. 效果如下:    掌握点: 一:熟悉代码的描述UIButton属性 1.UIButton状态 UIControlStateNormal          // 正常状态 UICont