算法笔记

常用数据结构

  • 数组与字符串
    • 构建简单,o1时间根据下标查询某个元素
    • 缺点,构建时必须分配连续空间,查询是否存在需要on,删除和插入元素,需要on
  • 链表
    • 每个元素是单独的对象,所有的对象通过引用字段链接在一起
    • 优点:灵活分配内存空间, 能在o1时间内删除、添加元素
    • 缺点:查询需要on时间
    • 解题技巧
      • 利用快慢指针(有时要用到三个)
      • 构建虚假链表头
      • 在纸上画出节点之间相互关系,画出修改的方法
    • 先进后出 FILO
    • 可以用单链表实现
    • DFS
  • 队列
    • 先进先出 FIFO
    • 可以用双链表实现
    • BFS
  • 双端队列
    • 队列的头尾两端都能以o1的时间进行数据查看、添加和删除
    • 可以用双链表实现
    • 常用场景:实现一个长度动态变化的窗口或者连续区间
    • 结构只管
    • 递归算法
    • 常考察
      • 普通二叉树
      • 平衡二叉树
      • 完全二叉树
      • 二叉搜索树
      • 四叉树
      • 多叉树
    • 遍历
      • 前序
      • 中序
      • 后序

高级数据结构

  • 优先队列
    • 保证每次取出的元素是队列中优先级最高的
    • 本质是二叉堆结构,利用数组结构实现完全二叉树
    • 数组第一个元素a[0]拥有最高优先级
    • 给定一个下标i,其父节点为(i-1)/2,左孩子是
    • 2i+1,右孩子是2i+2
    • 数组中每个元素的优先级都必须高于子节点
    • 操作
      • 向上筛选:插入时放到最后,向上升(olgn)
      • 向下筛选:弹出堆顶时把最后一个放到堆顶,向下降(olgn)
      • 初始化堆 on
    • 树、森林、环
    • 有向图、无向图
    • 连通图、连通分量
    • 邻接矩阵、邻接链表
    • DFS、BFS
    • 二部图检测
    • 树的检测
    • 环的检测(有向图、无向图)
    • 拓扑排序
    • 并查集
    • 最短路径
  • 前缀树 Trie
    • 也称字典树
    • 每个节点必须包含children、isEnd两个属性
  • 线段树
    • 一种按照二叉树存储数据的结构,每个节点保存的都是数组里某一段的总和
    • 更新 olgn
    • 求和 olgn
  • 树状数组
    • 利用数组标识多叉树结构,和优先队列类似

排序

  • 基本排序算法(快速写出没有bug的代码)
    • 冒泡:把最大的数冒泡到后端
    • 插排:把最小的值插入到合适的位置
  • 常考的排序算法(解决绝大部分排序问题的关键)
    • 归并:分治思想
    • 快排
    • 拓扑排序
  • 其他(开拓解题思路)
    • 堆排序
    • 桶排序

递归与回溯

  • 递归:函数调用本身,把大规模问题不断变小
    • 简洁、易于理解
    • 思路
      • 将一个问题规模变小
      • 利用小规模问题的结果,结合当前情况,得出下一步结果
      • 把需要实现的递归函数看成已经实现好的,直接进行利用
      • 需要考虑退出递归的情况
      • 是自顶向下的,反之,动态规划是自底向上的,是对递归的一种优化
    • 模板
      • 判断是否非法,完整性检查
      • 判断递归是否应该结束(初始情况)
      • 缩小问题规模,递归调用
      • 整合子问题结果
    • 时间复杂度分析
      • 迭代法(初始值开始,使用归纳法)
      • 公式法
        • T(n) = a * T(n / b) + f(n)
        • O(n^logba)
  • 回溯:从起始点触发,不断尝试,有时需要返回再做选择,直到抵达终点
    • 试探算法,对每一步探测的情况评估,决定是否继续,可以避免走弯路
    • 当出现非法情况是,可以退到之前的情景,再去尝试其他的路
    • 保证多种尝试可能
    • 思路
      • 判断是否非法,如果非法立即返回
      • 判断是否满足条件,如果是,保存结果并返回
      • 在当前情况下,遍历所有可能出现的情况,并进行递归
      • 递归完毕后,立即回溯,回溯的方法是取消前一步的改动(栈)
    • 时间复杂度分析与递归一致

如何应对算法面试

  • 遇到新问题不要慌张,先想出最直观的解法
  • 直观解法多数情况不是最优的,可以帮忙打开思路
  • 理清解决问题的各个步骤之后,根据问题核心来优化某些关键性步骤

转载于:https://www.cnblogs.com/friedRib/p/11366925.html

你可能感兴趣的:(算法笔记)