您的位置:首页 > 理论基础 > 数据结构算法

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

2019-03-05 12:58 579 查看

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

数据结构与算法

  • 算法
  • 常用算法介绍
  • 面试考察点
  • 加分项
  • 真题汇总
  • 知识点汇总


    知识点详解

    数据结构

    二叉搜索树

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

    平衡二叉树

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

    红黑树

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

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

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

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

    定义与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))

    常用算法介绍

    面试考察点

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

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

    • 各种排序算法的实现和复杂度,稳定性
    • 二叉树的前中后序遍历
    • 翻转句子中单词的顺序
    • 用栈模拟队列(或用队列模拟栈)
    • 对10亿个数进行排序,限制内存为1G 采用分治的思路
  • 去掉(或找出)两个数组中重复的数
      排序和hash两种思路
  • 将一颗二叉树转换成其镜像
  • 确定一个字符串中的括号是否匹配
  • 给定一个开始词,一个结束词,一个字典,如何找到从开始词到结束词的最短单词接龙
      考虑使用深度优先算法
  • 如何查找两个二叉树的最近公共祖先
      递归与非递归皆可实现
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: