热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

01图解数据结构之数组实现容器

数组是一种线性的数据结构
优点:定点查询--速度快 尾部添加容易
缺点:长度固定,操作不便
注:集合的基类见第一篇:图解数据结构之开篇+集合基类

01--图解数据结构之数组实现容器
一个数组.png

一、java数组的使用

/**
 * 作者:张风捷特烈
 * 时间:2018/9/19 0019:8:59
 * 邮箱:[email protected]
 * 说明:数组测试
 */
public class ClientOfArray {

    public static void main(String[] args) {
        //生成数组--方式1
        int[] id = new int[5];
        for (int i = 0; i 

二、自定义数组:ArrayGroup

1.成员及构造
/**
 * 成员数组
 */
private T[] datas;

/**
 * 无参构造--默认容量10
 */
public ArrayGroup() {
    this(10);
}

/**
 * 一参构造
 * @param capacity 集合容量
 */
public ArrayGroup(int capacity) {
    //实例化数组
    datas = (T[]) new Object[capacity];
}

 @Override
 public String toString() {
     StringBuilder sb = new StringBuilder();
     sb.append(String.format("ArrayGroup:size =%d,capacity=%d\n",size,datas.length));
     sb.append("[");
     for (int i = 0; i 
2.定点添加元素:

思路:定点后的所有元素后移一位,空出顶点位,让待添加元素入驻

01--图解数据结构之数组实现容器
数组定点添加.png
添加方法实现:
@Override
public void add(int index, T el) {
    if (size == datas.length) {
        throw new IllegalArgumentException("Add failed! Array is full");
    }
    if (index <0 || index > size) {
        throw new IllegalArgumentException("Add failed! Make sure index <0 || index > size");
    }
    //从最后一个元素开始,到定点位置元素,后移一位
    for (int i = size-1; i >=index ; i--) {
        datas[i + 1] = datas[i];
    }
    datas[index] = el;
    size++;
}
添加方法测试:
 ArrayGroup arrayGroup = new ArrayGroup<>();
 arrayGroup.addLast("风");
 arrayGroup.addLast("特");
 arrayGroup.addLast("烈");
 arrayGroup.add(1,"捷");
 arrayGroup.addFirst("张");
 System.out.println(arrayGroup);
 //ArrayGroup:size =5,capacity=10
 //[张, 风, 捷, 特, 烈]

3.查找

定点查找

@Override
public T get(int index) {
    if (index <0 || index >= size) {
        throw new IllegalArgumentException("Get failed! Make sure index <0 || index > size");
    }
    return datas[index];
}

定元素查找

 @Override
 public int[] getIndex(T el) {
     //临时数组
     int[] tempArray = new int[size];
     //重复个数
     int count = 0;
     //遍历集合,获取该元素重复个数,及位置数组
     for (int i = 0; i 

4.定点设置
 @Override
 public T set(int index, T el) {
     if (index <0 || index >= size) {
         throw new IllegalArgumentException("Set failed! Make sure index <0 || index > size");
     }
     T oldEl = get(index);
     datas[index] = el;
     return oldEl;
 }

5.定点移除

思路:从删除元素索引的下一位开始到结尾,依次左移

01--图解数据结构之数组实现容器
数组定点移除.png
@Override
public T remove(int index) {
    if (index <0 || index >= size) {
        throw new IllegalArgumentException("Remove failed! Make sure index <0 || index > size");
    }
    T temp = get(index);
    //从删除元素索引的下一位开始到结尾,依次左移
    for (int i = index + 1; i 

6.清空

这里要注意一点,从后往前删除。因为从头删,每次后面都要全部移位,消耗很大。
正向10W数据清空:正向clear:方法耗时:10.549秒
逆向100W数据清空:耗时0,可见天壤之别。所以一个好的算法作用是很大的

@Override
public void clear() {
    for (int i = size-1; i <= 0; i--) {
        remove(i);
    }
    size = 0;
}

7.定点插入集合
@Override
public Group contact(int index, Group group) {
    //从index处遍历本数组,将待插入数据一个一个插入
    for (int i = index; i 

三、测试

    private static void otherTest(ArrayGroup arrayGroup) {
        arrayGroup.addLast("a");
        arrayGroup.addLast("a");
        arrayGroup.addLast("b");
        arrayGroup.addLast("c");
        arrayGroup.addLast("f");
        arrayGroup.addLast("a");
        arrayGroup.addLast("e");
        arrayGroup.addLast("d");

        System.out.println(arrayGroup);
        //ArrayGroup:size =8,capacity=10
        //[a, a, b, c, f, a, e, d]

        //定点删除操作
        String remove = arrayGroup.remove(3);
        System.out.println(remove);//c
        System.out.println(arrayGroup);
        //ArrayGroup:size =7,capacity=10
        //[a, a, b, f, a, e, d]

        //定元素删除
        int a = arrayGroup.removeEl("a");
        System.out.println(a);//0
        System.out.println(arrayGroup);
        //ArrayGroup:size =6,capacity=10
        //[a, b, f, a, e, d]

        //定元素全删除
        boolean ok = arrayGroup.removeEls("a");
        System.out.println(ok);//true
        System.out.println(arrayGroup);
        //ArrayGroup:size =4,capacity=10
        //[b, f, e, d]

        //定点修改
        String toly = arrayGroup.set(3, "toly");
        System.out.println(toly);//d
        System.out.println(arrayGroup);
        //ArrayGroup:size =4,capacity=10
        //[b, f, e, toly]

        //是否存在元素
        boolean cOntains= arrayGroup.contains("b");
        System.out.println(contains);//true

        //定点插入集合
        ArrayGroup arrayGroup2 = new ArrayGroup<>();
        arrayGroup2.addLast("1");
        arrayGroup2.addLast("2");
        arrayGroup.contact(2,arrayGroup2);
        System.out.println(arrayGroup);
        //ArrayGroup:size =6,capacity=10
        //[b, f, e, 1, 2, toly]

        //末尾插入集合
        arrayGroup.contact(arrayGroup2);
        System.out.println(arrayGroup);
        //ArrayGroup:size =8,capacity=10
        //[b, f, e, 1, 2, toly, 1, 2]
        
        //清空
        arrayGroup.clear();
        System.out.println(arrayGroup);
        //ArrayGroup:size =0,capacity=10
        //[]
    }

四、动态数组:

1、扩容方法
/**
 * 扩容 
 *
 * @param newCapacity 新容量
 */
private void grow(int newCapacity) {
    T[] newData = (T[]) new Object[newCapacity];
    for (int i = 0; i 
2、添加满了扩容
 @Override
 public void add(int index, T el) {
     if (size == datas.length) {
         grow((int) (GROW_RATE * datas.length));
     }
3、移除元素后,动态修改总容量
 //缩容
 if (size == datas.length /4 && datas.length/2 !=0){
     grow(datas.length /2);
 }

五、测试ArrayGroup:

方法\数量 复杂度 1000 10000 10W 100W 1000W
addLast O(1) 0.0004秒 0.0025秒 0.0141秒 0.0687秒 1.26014秒
addFirst O(n) 0.0063秒 0.2706秒 19.5379秒 ---- ----
add O(n) -- -- -- -- --
removeLast O(1) 0.0005秒 0.0036秒 0.0091秒 0.02301秒 :0.1607秒
removeFirst O(n) 0.0063秒 0.2771秒 19.7902秒 ---- ----
removeEl O(n) -- -- -- -- --
removeEls O(n) -- -- -- -- --
remove O(n) -- -- -- -- --
clear O(1) -- -- -- -- --
set O(1) -- -- -- -- --
get O(1) -- -- -- -- --
getIndex O(n) -- -- -- -- --

后记、

1.声明:

[1]本文由张风捷特烈原创,各图均由本人亲自所画,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力

2.连接传送门:

更多数据结构知识欢迎访问:图解数据结构
项目源码均在我的github/DS:欢迎star
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

3.联系我

QQ:1981462002
邮箱:[email protected]
微信:zdl1994328

4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
01--图解数据结构之数组实现容器
公众号.jpg

推荐阅读
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
author-avatar
raymondxiao518
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有