1.数组

点击使用幕布网页版查看(含思维导图)

数组(Array)是一种线性表结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

  • 最大的特点:支持随机访问,根据下标随机访问的时间复杂度为O(1)

  • 寻址:a[i]_add = base_add + i * data_type_size

  • 数组的插入和删除比较低效

    • 插入:如果我们要将数据插入到数组的第K个位置,为了把第K个位置空出来,我们需要将第K~N这部分的数据全部往后挪一位,这个操作的时间复杂度是O(n)
    • 删除:如果要删除第K个位置的数据,为了内存的连续性,也要将第K~N位置的数据往前挪一位,时间复杂度也是O(n)

当然,我们可以进行优化,那就是删除数据时并不立即删除,而是记录下已删除的数据。等到数组没有更多空间了,再执行一次真正的删除操作,一次性清理掉所有已删除数据。

数组Java实现


public class myArray {
    private int data[];//数据
    private int size;//数组大小
    private int count;//数组当前大小

    /**
     *
     * @param size
     */
    public myArray(int size){
        this.data = new int[size];
        this.size = size;
        this.count = 0;
    }

    /**
     * 删除指定index位置值
     * @param index
     * @return
     */
    public boolean delet(int index){
        //index不合法
        if(index < 0 || index > count) {
            System.out.println("位置不合法!");
            return false;
        }

        //[index+1,count)往前移动一位
        for(int i = index +1 ; i < count; i++){
            data[i-1] = data[i];
        }
        count--;
        return true;
    }

    /**
     * 将值插入所给下标处
     * @param index
     * @param value
     * @return
     */
    public boolean insert(int index, int value){
        //index不合法
        if(index < 0 || index > count) {
            System.out.println("位置不合法!");
            return false;
        }

        //内存空间已满
        if(size == count) {
            System.out.println("内存空间已满!");
            return false;
        }

        //[index,count)后移一位
        for(int i = count; i > index; i--)
            data[i] = data[i-1];

        data[index] = value;
        count ++;

        return true;
    }

    /**
     * 将值插入数组最后面
     * @param value
     * @return
     */
    public boolean append(int value){
        //内存空间已满
        if(size == count) {
            System.out.println("内存空间已满!");
            return false;
        }

        data[count++] = value;

        return true;
    }

    /**
     * 返回数组字符串
     * @return
     */
    public String toString(){
        StringBuilder builder = new StringBuilder();
        for(int i = 0; i < count; i++)
            builder.append(data[i] + ",");
        return builder.toString();
    }

    public void arrTest(){
        myArray test = new myArray(10);
        test.append(1);
        System.out.println(test.toString());
        test.insert(1,4);
        System.out.println(test.toString());
        test.delet(0);
        System.out.println(test.toString());
    }
}
posted @   codespoon  阅读(93)  评论(0编辑  收藏  举报
编辑推荐:
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
阅读排行:
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 开发的设计和重构,为开发效率服务
点击右上角即可分享
微信分享提示