数据结构与算法学习(第四天)

B树

在这里插入图片描述

m阶B树的性质

在这里插入图片描述
在这里插入图片描述

搜索

在这里插入图片描述

添加

在这里插入图片描述

在这里插入图片描述

删除

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

B的上溢和下溢的解决方法是必须要学会的

四阶B树

在这里插入图片描述

上述练习可以很好地帮你巩固B树的知识,为红黑树的学习打下基础。

红黑树

红黑树的五条性质是非常重要的

在这里插入图片描述

红黑树与四阶B树的等价变换

在这里插入图片描述

几个重要概念

在这里插入图片描述

添加

在这里插入图片描述

添加的12种情况

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

此处grand向上合并看作向上层加新节点,需要重新判断属于12种添加中的哪种类型,重新进行修复

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

删除

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

删除BLACK叶子节点

1、想象B树的下溢处理,第一种情况是兄弟节点为黑色,且有红色子节点

在这里插入图片描述

2、第二种情况是兄弟节点为黑色,且没有红色子节点

在这里插入图片描述

3、第三种情况是兄弟节点为红色,且没有红色子节点

在这里插入图片描述

红黑树的平衡

在这里插入图片描述

平均时间复杂度

在这里插入图片描述

AVL树与红黑树的对比

在这里插入图片描述

集合

在这里插入图片描述

刷道leetcode

在这里插入图片描述

提交的答案

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<Integer>();
        Set<Integer> set2 = new HashSet<Integer>();
        
        for(int num: nums1)
            set1.add(num);
        for(int num: nums2)
            set2.add(num);
        
        return getIntersection(set1,set2);
    }

    public int[] getIntersection(Set<Integer> set1, Set<Integer> set2){
        Set<Integer> intersection = new HashSet<Integer>();
        if(set1.size() > set2.size()){
            for(int num: set2){
                if(set1.contains(num))
                    intersection.add(num);
            }
        }
        else{
            for(int num: set1){
                if(set2.contains(num))
                    intersection.add(num);
            }
        }

        int[] intersectionlist = new int[intersection.size()];
        int index = 0;
        for(int num: intersection){
            intersectionlist[index++] = num;
        }

        return intersectionlist;
    }
}

由于HashSet查找的时间复杂度为O(1),所以该解法的时间复杂度仅为O(两个数组长度之和)。

映射

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

使用AVL树、红黑树来实现Map,则为TreeMap

在这里插入图片描述

哈希表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

装填因子

在这里插入图片描述

TreeMap和HashMap对比

在这里插入图片描述

二叉堆

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
以下以大顶堆为例,讲解添加、删除、建堆

添加

下图中的80为添加的节点

在这里插入图片描述

在这里插入图片描述

删除

在这里插入图片描述

在这里插入图片描述

批量建堆

方法1:
在这里插入图片描述

方法2:

在这里插入图片描述

效率对比

显然自下而上的下滤更加优秀,因为它是最少的节点在做最长长度的过滤
在这里插入图片描述

在这里插入图片描述

TopK问题

在这里插入图片描述

在这里插入图片描述

因为建的堆大小保持为k,每个数跟堆顶比较,并按情况进行更换,同时下滤,时间复杂度为O(logk)。总的时间复杂度为O(nlogk)。

堆排序比一般的排序算法要优秀,O(nlogk)< O(nlogn)。

优先级队列

在这里插入图片描述

在这里插入图片描述

优先级队列的底层实现可以用二叉堆

哈夫曼树

哈夫曼编码

在这里插入图片描述

哈夫曼树

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Trie

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

幸数得五

谢谢您的打赏勒

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

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

打赏作者

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

抵扣说明:

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

余额充值