企业网站排名优化价格,阿里巴巴国际站官网,集团公司管理系统,中小企业网站建设需要注意什么每一种编程语言中#xff0c;基本都会有数组这种数据类型。不过#xff0c;它不仅仅是一种编程语言中的数据类型#xff0c;还是一种最基础的数据结构。
1-数组的概念和特性 数组#xff08;Array#xff09;是一种线性表数据结构。它用一组连续的内存空间#xff0c;来… 每一种编程语言中基本都会有数组这种数据类型。不过它不仅仅是一种编程语言中的数据类型还是一种最基础的数据结构。
1-数组的概念和特性 数组Array是一种线性表数据结构。它用一组连续的内存空间来存储一组具有相同类型的数据。
线性表Linear List就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组链表、队列、栈等也是线性表结构。
连续的内存空间和相同类型的数据。正是因为这两个限制它才有了一个堪称杀手锏的特性随机访问。a[0]就是偏移为0的位置也就是首地址a[k]就表示偏移k个type_size的位置所以计算a[k]的内存地址只需要用这个公式a[k]_address base_address k * type_size
查询数组支持随机访问根据下标随机访问的时间复杂度为O(1)。查找的时间复杂度并不为O(1)。即便是排好序的数组你用二分查找时间复杂度也是O(logn)。
插入假设数组的长度为n现在如果我们需要将一个数据插入到数组中的第k个位置。为了把第k个位置腾出来给新来的数据我们需要将第kn这部分的元素都顺序地往后挪一位。如果在数组的末尾插入元素那就不需要移动数据了这时的时间复杂度为O(1)。但如果在数组的开头插入元素那所有的数据都需要依次往后移动一位所以最坏时间复杂度是O(n)。 因为我们在每个位置插入元素的概率是一样的所以平均情况时间复杂度为(12…n)/nO(n)。
删除如果我们要删除第k个位置的数据为了内存的连续性也需要搬移数据不然中间就会出现空洞内存就不连续了。如果删除数组末尾的数据则最好情况时间复杂度为O(1)如果删除开头的数据则最坏情况时间复杂度为O(n)平均情况时间复杂度也为O(n)。
思想在某些特殊场景下我们并不一定非得追求数组中数据的连续性。如果我们将多次删除操作集中在一起执行删除的效率会高很多比如JVM标记清除垃圾回收算法的核心思想 就是标记一下然后一起删除。
2-高级语言的封装 针对数组类型很多语言都提供了容器类比如Java中的ArrayListArrayList最大的优势就是可以将很多数组操作的细节封装起来和支持动态扩容。
对比容器和数组优缺点
1Java ArrayList无法存储基本类型比如int、long需要封装为Integer、Long类而Autoboxing、Unboxing则有一定的性能消耗所以如果特别关注性能或者希望使用基本类型就可以选用数组。
2如果数据大小事先已知并且对数据的操作非常简单用不到ArrayList提供的大部分方法也可以直接使用数组。
3当要表示多维数组时用数组往往会更加直观。比如Object[][] array而用容器的话则需要这样定义ArrayListArrayList array。 对于业务开发直接使用容器就足够了省时省力。毕竟损耗一丢丢性能完全不会影响到系统整体的性能。但如果你是做一些非常底层的开发比如开发网络框架性能的优化需要做到极致这个时候数组就会优于容器成为首选。