• 数据机构与算法学习(三)- 数组


    数组的概念

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

    根据定义里边的关键词详解数组定义。

    第一是线性表。 线性表就是数据拍成像一条线一样的结构。每个线性表上的而数据最多只有前和后两个方向。第二个是连续的内存控件和相同类型的数据

    因为有这两个特点,才有了一个堪称“杀手锏”的特性:“随机访问”。也导致了低效插入和删除操作。

    数组支持随机访问,根据下标随机访问的时间复杂度为O(1)。

    插入操作

    假设数组的长度是n,现在,如果我们需要将一个数据插入到数组中的第K个位置。为了把第K个位置腾出来,给新来的数据,我们需要将第K~N这部分的元素都顺序地往后挪一位。最好是在末尾插入O(1),坏在开头插入O(n),平均时间复杂度为O(n).

    优化方法,假设数组中存储的数据没有规律只是一个存储集合。那么可以将K位置的数移动到数组的最后,将新数据插入K的位置,这样的话,插入为O(1).

    删除操作

    和插入类似需要搬移数据,最好是在末尾删除O(1),坏在开头删除O(n),平均时间复杂度为O(n).

    优化方法,再删除数据后不进行真正的删除,只是标记数据,到数组空间不够用时,在执行一次删除操作。

    警惕数组越界

    在C语言中,只要不是访问受限的内存,所有的内存控件都是可以自由访问的。越界后会被执行到一块未定义的空间去执行操作,导致程序异常。

    容器能否完全代替数组

    对于业务开发,直接使用容器就足够了,省时省力。如果是做一些非常底层的开发,比如开发网络框架,性能要求做极致,这个时候数组就会优于容器。

  • 相关阅读:
    Java实现 LeetCode 56 合并区间
    JQuery实现对html结点的操作(创建,添加,删除)
    JQuery实现对html结点的操作(创建,添加,删除)
    JQuery实现对html结点的操作(创建,添加,删除)
    Java实现 LeetCode 55 跳跃游戏
    Java实现 LeetCode 55 跳跃游戏
    Java实现 LeetCode 55 跳跃游戏
    Java实现 LeetCode 54 螺旋矩阵
    Java实现 LeetCode 54 螺旋矩阵
    Java实现 LeetCode 54 螺旋矩阵
  • 原文地址:https://www.cnblogs.com/OneSky-Mi/p/14388179.html
Copyright © 2020-2023  润新知