打牢算法基础,从动手出发!

  • 2019 年 11 月 15 日
  • 筆記

0.导语

大家好,我是光城。算法在计算机领域的重要性,就不用我多说了,每个人都想要学算法,打牢算法基础,可是不知道如何做,今天我来推荐一波学习思路。

最近我也在打牢算法,于是买了波波老师的慕课网课程《玩转儿数据结构》,由于官方为JAVA版本,但是本人用的C++,因此我将本课程的算法用C++实现了一遍,里面采用了操作符重载,接口使用,继承,组合等面向对象的思想,把我这个仓库学完,C++基础部分也就会了。

笔记仓库地址:

https://github.com/Light-City/algPratice

后面将更新波波老师的其他课程学习笔记。欢迎大家star与fork!

当前仓库共有2万多行代码,59个文件,全部自己写的代码,学习算法没有途径,只待你动手实践!

1.玩转数据结构 从入门到进阶C++版

  • 动态数组 学习要点:动态数组的增删改查、时间复杂度、防止复杂度震荡策略。
    • 动态数组实现
    • 动态数组测试
  • 栈和队列
    • 队列的公共接口
    • 基于底层为动态数组的队列实现
    • 基于底层为动态数组的循环队实现
    • 基于底层为链表的队列实现
    • 队列的测试
    • 栈的公共接口
    • 基于底层为动态数组的栈实现
    • 基于底层为链表的栈实现
    • 栈的测试
    • LeetCode20题
    • 栈 学习要点:使用组合方案来完成栈的底层数据结构为数组,定义栈的入栈与出队策略。
    • 队列 学习要点:多种底层实现的效率对比,接口的定义,定义队列的入队与出队策略。
  • 链表 学习要点:链表内部节点结构定义、dummyHead使用、时间复杂度分析、链表栈与链表队列实现。z掌握递归的宏观与微观、如何对递归进行测试。
    • 链表的实现
    • 链表栈实现
    • 链表队列实现
    • 链表、链表栈、链表队列实现
    • LeetCode203题不带与带dummyHead两种实现
    • LeetCode203题递归实现
    • 求和递归实现
  • 二分搜索树 学习要点:掌握二分搜索树的结构、四种遍历方式的递归与非递归,bst树中最大与最小节点,删除节点原则,拓展二分查找法与基于floo、ceil的实现,当bst树退化为链表的时候对应的顺序查找表实现,顺序查找表与二分搜索树的效率对比。
    • 补充
    • 顺序查找表实现
    • 二分查找法实现
    • 基于floor与ceil的二分查找法实现
    • 二分搜索树实现
    • 二分搜索树测试
  • 集合与映射
    • 映射接口
    • 基于底层为二分搜索树的映射
    • 基于底层为链表的映射
    • LeetCode804问题
    • 拓展
    • 基于底层为顺序查找表的映射
    • 集合接口
    • 基于底层为二分搜索树的集合
    • 基于底层为链表的集合
    • LeetCode804问题
    • 拓展
    • 基于底层为顺序查找表的集合
    • 集合 学习要点:集合接口定义、二分搜索树与链表集合的效率对比。
    • 映射 学习要点:映射接口定义、二分搜索树与链表映射的效率对比。学会什么时候用映射,什么时候用集合。
  • 优先队列和堆 学习要点:堆的sift up与sift down、heapify、堆与优先队列的关系、如何使用STL的大顶堆与小顶堆、如何使用自己的优先队列解题。
    • 基于动态数组的大顶堆实现
    • 基于底层为大顶堆的优先队列实现
    • 大顶堆与优先队列测试
    • 使用C++ STL的优先队列解LeetCode347题
    • 使用我们自己的优先队列解LeetCode347题
  • 线段树 学习要点:掌握线段树的概念与应用,经典应用区间更新查询等,学会使用动态数组作为线段树的底层数据结构,掌握开辟多大空间存储。掌握其不是完全二叉树也不是满二叉树,但是平衡二叉树,依然可以用数组表示,看做满二叉树,后面不存在的节点在数组中用空来表示即可。
    • 基于动态数组的线段树实现
    • 线段树测试
    • LeetCode303题
    • LeetCode307题
  • 字典树 学习要点:掌握字典树节点定义,学会使用自己的字典树解题。
    • 字典树的实现
    • LeetCode211题
    • LeetCode677题
  • 并查集 学习要点:quickfind、基于树高度优化的并查集、基于树的大小(只是当前父亲节点+孩子节点总数)优化、基于rank(树的深度)的优化、路径压缩1、路径压缩2。
    • 基于动态数组的并查集六种实现
    • 并查集测试
  • 平衡树AVL 学习要点:左旋转、右旋转、平衡因子维护等。
    • AVL实现
    • AVL测试
  • 红黑树 学习要点:红黑树节点颜色标记、左旋转、右旋转、颜色翻转、插入节点颜色调整。
    • 红黑树实现
    • 红黑树测试
  • 哈希表 学习要点:哈希表动态扩容、哈希函数定义等。
    • 简单的哈希表
    • 简单的哈希表测试
    • 素数哈希函数的哈希表
    • 素数哈希函数的哈希表测试