数组链表存储结构

本文主要说一下数组、链表、二叉树、HashMap存储结构,及其优缺点。

数组和链表

1、数组是将元素在内存中连续存放。
   链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。
2、数组必须事先定义固定的长度,不能适应数据动态的增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;
   链表动态地进行存储分配,可以适应数据动态地增减的情况。
3、(静态)数组从栈中分配空间,对于程序员方便快速,但是自由度小;
    链表从堆中分配空间,自由度大但是申请管理比较麻烦。

黄色数组,蓝色链表结构

链表:单链表、双向链表、循环链表

由其存储结构可以看出:数组在查询效率比较高直接通过索引就查询,插入和删除效率低,因为要移动后面所有元素。链表在查询效率上低,但是插入删除效率高

二叉树

几种特殊的二叉树:满二叉树、完全二叉树、平衡二叉树

满二叉树:全是满的

完全二叉树:如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。

平衡二叉树:

二叉树可以采用顺序存储结构和链式存储结构。对于完全二叉树和满二叉树采用顺序存储结构比较适合

1)一个完全二叉树如下:

2)但是对于一般的二叉树如下,是不是很浪费空间。

再看极限的,abcd4个元素需要15个长度的数组来存,实在是太浪费了。

3)在2)中我们呢看到这种不适合用数组。

我们用二叉链表

为了方便访问某结点的双亲,还可以给链表结点增加一个双亲字段parent,用来指向其双亲结点。这种叫三叉链表

HashMap

数组+链表+红黑树。

传入的数组长度必须是2的指数次幂。如果传入13,在put会转成大于13最接近2的指数次幂的值,那就是16了。

为什么必须是2的指数次幂?

先留着

hash冲突?

不同的entry通过哈希函数等计算出来下标一样,就叫hash冲突

解决hash冲突?

一种是开放寻址法,另一种是链表法,好像好有其他方法。

开放寻址法:

比如计算出Entry6的下标是2,但是2下标已经有值了,就往后找,3也被占了,4没有则放入4.

链表法:

链表法也正是被应用在了HashMap中,HashMap中数组的每一个元素不仅是一个Entry对象,还是一个链表的头节点。每一个Entry对象通过next指针指向它的下一个Entry节点。当新来的Entry映射到与之冲突的数组位置时,只需要插入到对应的链表中即可

Java 1.8以后是数组+单链表+红黑树(链表>8时转成红黑树)

链表缺点就是查询效率低,如果链表太长,那么效率也低,红黑树是接近于平衡的二叉树,远远高于链表的查询效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值