ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DSA_03:数组

2020-03-28 13:59:32  阅读:236  来源: 互联网

标签:03 线性表 寻址 内存 数组 address base DSA


数组,相信大家再熟悉不过。

 

这里还是对其进行简单总结,最重要的是,给出一维数组多维数组内存模型寻址公式,这是很多新手甚至有一定基础的同学任然搞不懂的地方。

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

  2. 线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。

  3. 非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系

  4. 连续的内存空间相同类型的数据:正是因为这两个限制,数组才有了一个堪称“杀手锏”的特性:随机访问

  5. 说:数组适合查找,查找时间复杂度为O(1),这句话准确吗?

    答:有序数组用二分法查找复杂度是 O(logn),因此自然这句话并不准确。应该说:数组支持随机访问,根据下标随机访问的时间复杂度为O(1)

 

一维数组内存模型和寻址公式:

  有一个 int arr[7] 的数组,其内存模型如图:

      

  a[n] 寻址公式:a[i]_address = base_address + i * data_type_size,其中 base_address 是数组第一个元素所在地址。

 

二维数组内存模型和寻址公式:

  这对于很多人来说,是一直没弄懂的,相信看完该图能够让你足够清晰。

  int arr[3][3] 的内存模型为:

      

  OK,有了内存模型,不妨自己推导一下二维数组的寻址公式再继续往下看。

  a[m][n] 寻址公式:a[i][j]_address = base_address + (i * n + j) * data_type_size,其中 base_address 是数组第一个元素所在地址。

  data_type_size 代表数据类型所占字节

 

需要注意,数组的查找和删除,为了保证数据的连续性,需要将后面的元素整体搬移。

数组 插入、删除、查找 的性能就不再啰嗦了,与链表的性能对比,应用场合等也不再过多说明。

 

最后,容器能否完全替代数组?

如 java 中的 ArrayList,C++ 中的 vector 等,能否完全代替数组呢?

  前者:最大的优势就是可以将很多数组操作的细节封装起来,支持动态扩容。

  后者:数组本身在定义的时候需要预先指定大小,因为需要分配连续的内存空间。

  对于业务开发,直接使用容器就足够了,省时省力。毕竟损耗一丢丢性能,完全不会影响到系统整体的性能。但如果你是做一些非常底层的开发, 比如开发网络框架,性能的优化需要做到极致,这个时候数组就会优于容器,成为首选。

 

标签:03,线性表,寻址,内存,数组,address,base,DSA
来源: https://www.cnblogs.com/teternity/p/DSA_03.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有