拉勾网《32个Java面试必考点》学习笔记之六------数据结构与算法

本文为拉勾网《32个Java面试必考点》学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频《32个Java面试必考点》.若本文侵犯了相关所有者的权益,请联系:[email protected].将会删除相关内容

数据结构与算法

    • 知识点汇总
    • 知识点详解
      • 数据结构
          • 二叉搜索树
          • 平衡二叉树
          • 红黑树
          • B树
          • B+树
      • 算法
        • 字符串匹配问题
        • TopK问题
          • 找出N个数中最小的k个数(N非常大)
          • 从N有序队列中找到最小的K个值
        • 常用算法介绍
    • 面试考察点
    • 加分项
    • 真题汇总

知识点汇总

拉勾网《32个Java面试必考点》学习笔记之六------数据结构与算法_第1张图片
拉勾网《32个Java面试必考点》学习笔记之六------数据结构与算法_第2张图片

知识点详解


数据结构

二叉搜索树

拉勾网《32个Java面试必考点》学习笔记之六------数据结构与算法_第3张图片

每个节点都包含一个值,每个节点至多有两棵子树,左孩子小于自己,右孩子大于自己,时间复杂度是O(log(n)),随着不断插入节点,二叉树树高变大,当只有左(右)孩子时,时间复杂度变为O(n).

平衡二叉树

保证每个节点左右子树高度差绝对值不超过1.
比如,AVL树在插入和删除数据是经常需要旋转以保持平衡.适合插入删除少场景.

红黑树

拉勾网《32个Java面试必考点》学习笔记之六------数据结构与算法_第4张图片

非严格平衡二叉树,更关注局部平衡,而非总体平衡,没有一条路径比其他路径长出两倍,接近平衡,减少了许多不必要的旋转操作,更加实用.
特点:

  1. 每个节点不是红就是黑
  2. 根节点是黑色
  3. 每个叶子都是黑色空节点
  4. 红色节点的子节点都是黑的
  5. 任意节点到其叶节点的每条路径上存在的黑色节点数量相同.
B树

拉勾网《32个Java面试必考点》学习笔记之六------数据结构与算法_第5张图片

适用于文件索引,优先减少磁盘IO次数,最大子节点称为B树的阶
m阶b树特点:

  1. 非叶子节点最多有m棵子树
  2. 根节点最少有两棵子树
  3. 非根非叶节点最少有m/2棵子树
  4. 非子叶节点保存的关键字个数,为该节点子树个数减一
  5. 非叶子节点的关键字大小有序
  6. 关键字的左孩子都小于该关键字,右孩子都大于关键字
  7. 所有叶节点都在同一层
  8. 采用二分查找法
B+树

拉勾网《32个Java面试必考点》学习笔记之六------数据结构与算法_第6张图片

定义与b树基本相同,
区别:

  1. 节点有多少关键字,有多少子树
  2. 关键字对应子树的节点都大于等于关键字,子树中包括关键字自身
  3. 所有关键字都出现在叶节点中
  4. 所有叶节点都有指向下一个叶节点的指针
  5. 搜索时只会命中叶节点,叶子节点相当于数据存储层,保存关键字对应的数据,非叶节点只保存关键字与指向叶节点的指针

B+树比B树更适合做索引:

  1. 叶节点之间有指针相连,B+树跟适合范围检索
  2. 由于非叶节点只保留关键字和指针,B+树可以容纳更多的关键字,降低树高,磁盘IO代价更低
  3. B+树查询过程稳定,必须由根节点到叶节点,所有关键字查询路径相同,效率相当.Mysql数据可得索引就提供了B+树的实现

B*树
在B+树的非叶节点上增加了指向同一层下一个非叶节点的指针

算法

字符串匹配问题

先于面试官交流,询问是否有其他要求

Example:判断给定字符串中的符号是否匹配
解题思路:
1. 使用栈
2. 遇到左括号入栈
3. 与右括号出栈,判断出栈括号是否成对
private static fianl Map<Character,Character> brackets = new HashMap<>();
static{
    brackets.put(')','(');
    brackets.put(']','[');
    brackets.put('}','{');
}
public static boolean isMatch(String str){
    if(str==null){
        return false;
    }
    Stack<Character> stack = new stack<>();
    for(char ch : str.toCharArray()){
        if(barckets.containsValue(ch)){
            stack.put(che);
        } else if (brackets.contiansKey(ch)){
            if(stack.empty() || stack.pop() != bracjets.get(ch)){
                return false;
            }
        }
    }
    return stack.empty();
}

解题技巧
认真审题:

  1. 单模匹配还是多模匹配
  2. 时间复杂度空间复杂度是否有要求
  3. 明确期望的返回值,如,多匹配结果的处理

解题思路

  1. 单模匹配:BM,KMP算法
  2. 多模匹配:Tire树
  3. 前缀或后缀匹配
  4. 可以借助栈,树等数据结构

TopK问题

找出N个数中最小的k个数(N非常大)

解法:

  1. 用前K个数创建大小为K的大根堆
  2. 剩余的N-K个数与堆顶进行比较

时间复杂度:O(N*log(K))
优点:不用在内存中读入所有元素,适用于非常大的数据集

从N有序队列中找到最小的K个值

解法:

  1. 用N个队列的最小值组成大小为K的小根堆
  2. 取堆顶值
  3. 将堆顶值所在队列的下个值加入堆(与堆中最大值比较,若该值大于最大值则可停止循环)
  4. 重复步骤2,直到K次

时间复杂度:O((N+K-1)*log(K))

常用算法介绍

拉勾网《32个Java面试必考点》学习笔记之六------数据结构与算法_第7张图片

面试考察点

  • 了解基本数据结构及特点
    • 如,有哪些二叉树,各有什么特点
  • 表/栈/队列/数需要熟练掌握,深刻理解使用场景
    • 红黑树适合用搜索,B+数适合做索引
  • 了解常用的搜索/排序算法,以及复杂度和稳定性
    • 特别是快速排序和堆排序
  • 了解常用的字符串处理算法
    • 如,BM使用后缀匹配进行字符串匹配
  • 能够分析算法实现的复杂度
    • 特别是时间复杂度
  • 了解常用算法分类,解决问题的实录和解决哪类问题

加分项

  • 能够将数据结构与实际使用场景结合
    • 如,介绍红黑树时,结合TreeMap的实现,介绍B+数时,结合Mysql中的索引实现
  • 不同算法在业务场景中的应用
    • 如,TopK算法在热门排序中的应用
  • 面对模糊的题目能够后沟通确认条件和边界
  • 书写算法代码前,先讲一下解题思路
  • 能够发现解答的一些问题,给出改进思路

真题汇总

  • 各种排序算法的实现和复杂度,稳定性
  • 二叉树的前中后序遍历
  • 翻转句子中单词的顺序
  • 用栈模拟队列(或用队列模拟栈)
  • 对10亿个数进行排序,限制内存为1G
    • 采用分治的思路
  • 去掉(或找出)两个数组中重复的数
    • 排序和hash两种思路
  • 将一颗二叉树转换成其镜像
  • 确定一个字符串中的括号是否匹配
  • 给定一个开始词,一个结束词,一个字典,如何找到从开始词到结束词的最短单词接龙
    • 考虑使用深度优先算法
  • 如何查找两个二叉树的最近公共祖先
    • 递归与非递归皆可实现

你可能感兴趣的:(Java面试)