一、数组
- 在内存中,数组是一块连续的区域。
- 数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间。
- 插入数据和删除数据效率低。除了在尾部的插入删除。插入数据时,这个位置后面的数据在内存中都要向后移。删除数据时,这个数据后面的数据都要往前移动。
- 随机读取效率很高。直接根据下标获取元素值。
- 不利于扩展,数组定义的空间不够时要重新定义数组。
适用场景:
- 数据量小
- 数据规模已知
- 对数据存取和修改操作较多,而插入和删除数据较少的情况。
二、链表
- 在内存中可以存在任何地方,不要求连续,通过指针来建立元素间的关联。
- 不指定大小,只需在用时申请空间就可以。根据需要来动态申请或者删除内存空间。
- 增加数据和删除数据很容易,不需要遍历整个链表。
- 不支持随机访问。
- 扩展方便。
适用场景:
- 不需要预先知道数据规模
- 适用于插入删除操作较多,而存取操作较少的情况。
三、哈希
将关键字作为哈希函数f(key)的参数,获取一个地址,使得关键字在表中都有一个确定的位置
(1)hash冲突:key通过哈希函数f(key)得到一个地址,但是却发现该地址已存有其它元素,这就是所谓的hash冲突啦。
(2)解决hash冲突
- 开放地址法:对当前求得的地址再添加增量计算。增量di有三种取法:1.线性探测再散列 2. 平方探测再散列 3.随机探测再散列;
- 链地址法:将所有哈希地址相同的记录都链接在同一链表中;
- 再哈希法:同时构造多个不同的哈希函数;