数据结构和算法:数组(一)

1、 你知道为什么数组下标是从0开始,而不是从1开始的吗?
之前也尝试着写了数据结构的笔记总结,但是总是不得要领。
也看过多次数据结构等书籍,过不久就忘的差不多了。
所以,这次我重新开始,记牢每种数据结构,和对应基本常用的算法和leetcode对应的题目刷几道。
这次的目标就是一直坚持下去,刷leetcode+做笔记+总结。

我做的笔记以及一些基础的经典面试算法题会记录到github。
https://github.com/amo1996/algorithm/tree/master/complexly/src/com/lz

数组: 平均情况时间复杂度为O(n)
其实,数组的基本概念没什么可总结的,一种特别基础,使用的特别多的数据结构。
1 无序数组可以提供快速的插入,但是查找和删除都较慢。
2 有序数组可以使用二分查找
3 二分查找需要的时间与数组中数据项的个数的对数成正比
数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。
1):线性表:就是数据排成像一条线的结构,每个线性表上的数据最多只有前和后两个方向。链表、栈、队列都是线性表结构。
2):连续的内存空间和相同类型的数据:正是因为这两个条件,所以数组可以随机访问,但是也由于这两个限制让数组的一些操作(删除、插入)变的低效。为了保证连续的内存空间,删除和插入数据就得移动大量数据。
3):根据下标进行随机访问:因为内存是连续的,数组中每个元素所占的内存大小区间是固定的,可以根据寻址公式:a[i]_address=base_address+i*data_type_size 就是首地址加上多少个元素大小。
排序后的数组,通过二分法查找元素,时间复杂度是O(logn). 只有根据下标随机访问的时间复杂度是O(1)
ArrayList最大的优势就是将数组操作的细节封装了起来,而且提供了不少基于数组的方法。
**ArrayList 底层是由数组构成的。**ArrayList扩容的核心方法就是调用Arrays.copyOf()方法,创建一个当前容量1.5倍的数组,然后将原数组元素拷贝过去。
什么时候使用数组还是使用ArrayList:

1): ArrayList无法存储基本类型,比如int long 需要封装,而装箱拆箱有一定的性能消耗,如果特别关注性能,就可以选用数组。
2): 如果数据大小事先已知,并且操作非常简单,也可以直接使用数组
3): 当需要表示多维数组时,用数组往往更加直观。Object[][] array 如果用ArrayList的话 ArrayList array

总结:
0、 为什么数组下标是从0开始,而不是更符合人类习惯从1开始呢?
下标为0开始:
a[i]_address=base_address+i*type_size
下标为1开始:
a[i]_address=base_address+(i-1)*type_size
对比可以发现:从1开始的话,多了一次减法运算,对于CPU来说,就是多了一次减法指令。
还有个原因:C语言设计者用0开始计数数组下标,之后的高级语言都效仿了C语言。

你可能感兴趣的:(数据结构)