数据结构与算法笔记

1 数据结构

  • 列表,基本数据结构,顺序存储结构,可以通过索引快速查找元素,删除和增加元素比较麻烦,特别是增加元素可能要开辟新的存储空间。
  • 链表,基本数据结构,链式存储结构,通过node.next访问下一个元素,只能从根节点开始查找元素,元素删除和插入比较简单,不用使用连续的存储空间。
  • 队列,一种只允许先进先出的存储结构,支持(enqueue、dequeue功能)
  • 栈,一种只允许后进先出的存储结构,支持pop、push,查看head值的功能
  • 堆(最大堆/最小堆),一种特殊的完全二叉树,堆顶式是最大值或者最小值,堆可以完全通过一个列表存储,满足:node.parent = i/2, node.left=2i, node.right=2i+1。堆支持插入(直接在堆的最后一个位置插入一个元素,然后维护堆的性质)和删除操作(堆顶和队尾元素交换,然后维护堆的性质)。堆可以用于堆排序、优先级队列(支持最大值有限弹出)中。
  • 二叉树,node.value,node.left, node.right。
    • 搜索二叉树,指根节点一定比左树的所有节点大,一定比右子树的所有节点值小
    • 完全二叉树,树的深度为h,h-1层必须是满的,h层优先填满左边叶节点,可以用数组存储,可以分解为完全二叉树和满二叉树
  • 单调栈,保证堆顶式最大的,解决Next greater Number问题
  • 单调队列,队列首是最大的

2 算法

  • 动态规划:一般用于求解最值,当问题的解可以通过子问题的解来得到时使用,通常子问题存在重叠,通过存储中间结果来减少重复计算。
    • 状态定义,确定状态是什么,动态表存储什么
    • 转移函数,确定选择并泽优
    • 明确边界/badcase,递归时是终止条件;使用dp-table时是初始值的选取
  • 二分查找:一个问题一分为二,
  • 双指针:通过两个指针优雅地解决问题,在链表的相关问题中常用
  • BFS(广度优先):
  • DFS(深度优先):
  • 滑动窗口:

你可能感兴趣的:(数据结构与算法笔记)