自已实现一个动态数组
前言:
最近开始学习数据结构,刚学到数组,写下此篇博客记录下学习内容。如文中有不对的地方还请大佬指出。
正文:
1.数组(Array):数组是一种线性表数据结构,它是一组连续的空间和相同的数据类型组成。
2.数据的时间复杂度分析:
1)插入:最好的情况为O(1),最坏的情况为O(n),均摊为O(n)。
2) 删除:最好的情况为O(1),最坏的情况为O(n),均摊为O(n)。
3)查询:最好的情况为O(1),最坏的情况为O(n),均摊为O(n)。
原因:
插入:如果在索引3处插入一个新的值20,因为数组是一组连续的空间,为了保持数据的连续性,数据将会进行数据搬移动作,将索引3及后面的值向后移动,造成大量的时间消耗。最好的情况就是在数组的最后一个位置进行插入操作,这样就避免了大量的数据搬移。如果不需要数据的连续性,可以考虑将3处的值移动到数组末尾处,然后在将值插入到3处,这样就避免的数据的搬移。
删除:跟插入相似,不过是将数据往前搬移。可以考虑将要删除的值做个标记,等数组内存不够用时统一做删除操作。
图片是用excel制作的,有点丑。
查询:数组查询需要遍历,遍历需要O(n)的时间。当需要查询某个值时如果这个值刚好在下标0处那么时间复杂度就为O(1),这种情况一般很少见。如果是排好序的数组通过二分法查找时间复杂度就是O(logn)。
3.数组的优缺点
缺点:因为数据是一组连续的空间,所以当没有连续的空间时,就没有足够的内存分配。例:当我们需要创建一个100M的数组时,此时虚拟机内存刚好只剩100M,但不是连续的,就会造成内存不够分配。
优点:数组支持随机访问(也就是直接通过下标访问),时间复杂度为O(1)。
4.数组的寻址公式:array[i]_address = first_address + i * data_type_size; first_address是数组第一个元素所在的内存地址,i是下标,data_type_size是数据类型大小。
例:比如说我们要找到下标3的内存地址,第一个元素的内存地址是1024,数据类型是int类型,int类型占4个字节。那么array[3]_address = 1024 + 3 * 4;就是下标3的内存地址了。
5.下面开始用代码实现一个自已的数组,我使用的是Java语言编写的。



浙公网安备 33010602011771号