树表示数组,Map与双重for对照。

文章讨论了如何利用有序数组构建平衡树以优化查找操作,指出中间元素作为根节点能保持左右平衡,降低时间复杂度至log2(N)。同时对比了List和Map在查找上的时间复杂度,Map通过哈希函数实现O(1)查找,但存在碰撞问题可能导致退化为链表。文章还提到了HashMap使用红黑树来解决链表过长和容量扩大的问题,以维持性能。
摘要由CSDN通过智能技术生成

已知一个按照升序排列的有序数组:arr={3,5,7,10,11,12,18}

可以用“树”来表示。 

注意:每棵树只有一个根节点,根节点下可以有任意的子节点,子节点又可以有任意个子节点,当子节点下无子节点,该子节点被称为叶,每个节点只有一个父节点。

思路:

1:为了保持左右平衡,有序数组中间的数就是树的根节点。

2:height≈log2(N)=二分查找的时间复杂度,树的高度越低,时间复杂度会越好。

                         10

         5                             12

3              7              11             18

arr={10,11,22,13,4,5,16,17,48,69} 

list查找方式的时间复杂度为:

list.get(0)==17?-->list.get(1)==17?...即为O(N)。

Map查找的时间复杂度为:

17%10=7-->arr[7],即为O(1)。

碰撞:如果通过计算后的两个或多个key的hash得到的index相同,则被称为碰撞,在这个位置会储存多个键值对,它们通过next属性链接在一起,但数组中存储的是最后插入的元素。

如果碰撞发生太多,map的size会越来越大,退化成链表。

map和双重for的性能对比:

举例代码:

双重for循环:

 map实现:

 map实现:

 测试结果:

 双重for循环,遍历list1中每个数据与list2对比,时间复杂度是O(2),将其中一个list转化为map之后,成为了并列for循环,遍历list后通过list.get(i)的key直接查询对应的value此时的时间复杂度为O(1)。这里要注意数据小的使用list,数据大的使用Map提高性能。

 map的缺陷:

HashMap底层是通过数组和链表的数据结构实现的,如果每次计算的hash值是同一个,会造成链表长度过长,如果每次计算的hash值都不一样,会导致HashMap的容量不断扩大,为了解决这些问题,使用红黑树维持树的平衡。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值