有序表treeMap的基本操作和原理,键值对根据key排序,时间复杂度o(log(n))

有序表treeMap的基本操作和原理,键值对根据key排序,时间复杂度o(log(n))

提示:有序表是经常用的好东西,以后在数据结构与算法的题目中,经常用的


有序表treeMap

和哈希表类似,treeMap它也是键值对,不过呢,它是存在树里面的键值对
而且,根据key自动排序了
后面我们会学,动用啥树来实现有序表,经常用SB树,红黑树,调表啥的来实现有序表
今天先学一下宏观系统的有序表的操作
(1)put(x)
(2)get(x)
(3)remove(x)
(4)判断x存在吗?containsKey(x),和哈希表一样
(5)firstKey()返回有序表中最小那个数,第一位那个,也是数的头结点那个
(6)lastKey()返回有序表中最大的那个数,最后一位,也是叶节点最大那个
(7)floorKey(k),返回<=k的,离k最近的那个k,有k就返回k,没有k就返回小于k的离k最近的,比如k-1,k-2等等
(8)ceilingKey(k), 返回>=k的,离k最近的那个k,有k就返回k,没有k就返回大于k的离k最近的,比如k+1,k+2等等
在这里插入图片描述

撸代码看看就知道:

public static void main(String[] args) {
        testTreeMap();
    }
    public static void testTreeMap(){
        TreeMap<Integer,String> treeMap = new TreeMap<>();
        treeMap.put(4,"a");
        treeMap.put(3,"c");
        treeMap.put(2,"b");
        treeMap.put(1,"d");
        System.out.println(treeMap.firstKey());//首尾都是自动排序好的
        System.out.println(treeMap.lastKey());

        System.out.println(treeMap.floorKey(6));//离6最近的小于等于6的数
        System.out.println(treeMap.ceilingKey(0));//离0最近的大于等于0的数
    }

结果:

1
4
4
1

如果查:
在这里插入图片描述
熟悉这俩操作,将来在调表中,有这些操作的。

有序表treeMap的底层怎么存储呢?

平衡搜索二叉树:【大概有个印象就行先】【后面我们会细细地讲什么事平衡搜索二叉树】
所谓平衡:就是x节点左右子树的高度差,不会大于1,比如下面,x=3,左树高2,右树高为2,俩差为0,平衡的
所谓搜索:就是任意以x为头结点的数,左树的最大值leftMax,和右树的最小值rightMin,
满足严格的有序的关系,即:leftMax < x < rightMin
下面的树种,1的右树2严格大,3的左树最大为2,但是严格小于3
5的左树严格小于5,3的右树最小值4也要严格大于3
反正满足搜索关系,严格有序的

比如有序表:放2,1,4,3,5
在这里插入图片描述
那么你现在搜索一个值,containsKey(5),只需要不断地2分下去,找到一条分支即可,最大时间复杂度o(log(N))
之前我们说过二分法时间复杂度就是o(log(N))
这当然比哈希表要慢,但是有序的,操作就蛮有意思了。


总结

提示:重要经验:

1)有序表的特点,利用哈希表的key来排序,存放在树中。
2)有序表的底层组织方式是平衡搜索二叉树,索引key的时间复杂度是o(log(N))。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值