zoukankan      html  css  js  c++  java
  • 数据结构

    数据结构 - > 数组篇

    一)、数组的特点

    特点:是一种线性表结构,具有连续的存储空间,存储相同的数据类型数据。

    特点剖析:

    线性表:数据之间具有前后顺序关系。

    例如:1).数组、链表、队列、栈数据之间都具有前后关系。

    ​ 2).非线性表,数据之间没有前后关系,例如: 树、图

    连续的存储空间:数组具有连续的存储空间,根据寻址公式,实现数组元素的随机

    ​ 访问。

    存储相同的数据类型:声明一个数据时需要声明存储的数据类型,这样才能根据寻

    ​ 址公式,实现数组的随机访问。

    二)、数组的随机访问公式

    a[i]_address = base_address + i * data_type_size;

    1).base_address: 数组的首地址a[0];

    2).data_type_size:数据类型的大小, 例:int类型,4个字节,data_type_size = 4.

    3). i:数组的下标。

    三)、为什么数组的下标是从0开始访问?

    由数组的寻址公式 a[i]_address = base_address + i * data_type_size可知 i 代表偏移量,a[0]代表偏移量为0的位置,即首地址位置,当数组的下标是从1开始访问呢,则寻址公式就为 a[i]_address = base_address + (i -1) * data_type_size,此时计算机就要多做一次减法运算,为了优化计算效率,对数组从0开始编号。

    四)、数组和链表的区别

    1).链表适用于删除和插入,时间复杂度为O(1).

    2).数组适用于随机访问,时间复杂度为O(1).

    注: 数组适用用查找,时间复杂度为O(1)的说法是错的,数组进行查找的时间复杂度为O(n), 有顺序的二分查找,时间复杂度为O(logn).

    五)、对数组的操作

    1)、数组的插入

    1.1).插入一个元素,数组的相对位置保持不变超,时间复杂度O(n)。

    public T[] insertElement(T[] arr, int index, T e){
            int size = arr.length;
            //数组元素后移
            for(int i = size - 1; i >= index; i--){
                //数组后移
                arr[i+1] = arr[i];
            }
            arr[index] = e;
            //返回插入的值
            return arr;
        }
    

    1.2).不需要保持数组元素的相对位置,时间复杂度O(1)。

    /**
         * @Author chenxuebing
         * @Description 插入元素时如果不考虑元素的有序性,假如要在第K个元素进行插入,直接将第k个元素移到末尾,在第k个位置插入元素
         *              针对引用型数据类型
         * @Date 2019/12/25 14:18
         * @Param [arr, index]
         * @return
         **/
        public T[] insertElementUnOrder(T[] arr, int index, T e){
            //直接在数组的末尾插入元素,时间复杂度O(1)
            int flag = 0;
            for(int i = 0; i < arr.length; i++){
                flag++;
                if(arr[i] == null){
                    break;
                }
            }
            arr[flag] = arr[index];
            arr[index] = e;
            return arr;
        }
    

    2、数组的删除操作

    2.1).删除指定位置的元素,保持元素的相对位置,时间复杂度O(n)

     /**
         * @Author chenxuebing
         * @Description 删除指定位置的元素
         * @Date 2019/12/25 11:39
         * @Param [arr, Index]
         * @return
         **/
        public T deleteElement(T[] arr, int index){
            //数组元素前移
            int size = arr.length;
            for(int i = index; i < size-1; i++){
                arr[i] = arr[i+1];
            }
            return arr[index];
        }
    

    2.2). 删除指定位置的元素,不需要保持元素的相对位置,时间复杂度O(1)

    技术要点:使用标记删除的做法,对要删除的元素不做删除操作,只进行标记,当数组的元素满的时候再进行操作,减少了数据的多次移动的操作。

    /**
         * @Author chenxuebing
         * @Description 使用标记的方法删除数组的元素,即对指定位置的元素做标记删除操作,待数组的元素满了之后再进行删除操作
         *              这样做的好处:对多次删除元素的移动缩减为一次移动
         * @Date 2019/12/25 15:07
         * @Param [arr, index]
         * @return
         **/
        public T[] deleteElementFlag(T[] arr, int index){
            return null;
        }
    
    金麟岂能忍一世平凡 飞上了青天 天下还依然
  • 相关阅读:
    解决VMwave下卡死的办法
    深度探索C++对象模型第四章:函数语义学
    cc
    tbb库的使用
    10内核同步方法
    哈希
    django 和restful framework 初始配置轻松搞定
    linux有趣动画--代码雨
    linux有趣开机图标--佛祖保佑
    Socket是什么,通俗易懂点说
  • 原文地址:https://www.cnblogs.com/Auge/p/12105653.html
Copyright © 2011-2022 走看看