「 数据结构与算法 」如何系统性的学习数据结构与算法

177 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情


更多、更体系化的内容请持续关注 《菜鸟程序员成长计划》之数据结构与算法 专栏,您的 关注、点赞、收藏 都将是小编持续创作的动力!

一. 确定学习目标

  • 知道有哪些常用的数据结构和算法
  • 能够写出高性能的底层轮子
  • 知道如何进行复杂度分析、性能分析
  • 通过不断训练,具备“算法思维”,提高分析和解决实际问题的能力
  • 能够自如地应付大厂面试

二. 制定学习路线

(1)入门

  • 知道数据结构和算法是什么
  • 复杂度分析和大 O 表示法
  • 稳定性

(2)基础

  • 结合具体的示例,学习各种常用的数据结构和算法
  • 知道各常用数据结构的优缺点
  • 知道分析各常用算法的复杂度

(3)进阶、高级

  • 不太常用的、比较高级的数据结构和算法,比如红黑树等

(4)实战

  • 研究各经典开源项目中数据结构和算法的使用

三. 明确学习要点

  • 不要死记硬背算法实现,你应该试着去理解不同的数据结构、算法的原理是什么,它们是怎么来的,是如何解决不同的问题的
  • 分析时间和空间复杂度,知道各个算法和数据结构的优点、缺点是什么,以及适用于解决什么问题,什么情况下更适合采用哪种算法和数据结构
  • 算法思想才是更重要的,比如:分而治之、动态规划、贪婪算法等,学习算法思想可以帮你更好地理解算法之间的快慢差异,并学会在算法对时间和空间的使用上做出平衡
  • 尝试把数据结构图形化,视觉化
  • 一定要自己动手实现一遍
  • 学到的知识需要时间慢慢消化、沉淀,不要试图一下子就全部掌握,学习本身就是反复迭代和不断思考的过程。如果学习过程中遇到挫败感,想想“书读百遍其义自见”这句话,可以先跳过这部分理解不了的,后面回过头再学习

学习重点(学什么)

想要学习数据结构与算法,最重要的概念是---复杂度分析,必须熟练拿下,否则数据结构与算法等于没学; 我们在学习数据结构的时候都有哪些内容:

链表

  • 链表
  • 双向链表

哈希表/散列表 (Hash Table)

  • 散列函数
  • 碰撞解决

字符串算法

  • 排序

  • 查找

    • BF算法
    • KMP算法
    • BM算法
  • 正则表达式

  • 数据压缩

  • 二叉树
  • 二叉查找树
  • 伸展树(splay tree 分裂树)
  • 平衡二叉树AVL
  • 红黑树
  • B树,B+,B*
  • R树
  • Trie树(前缀树)
  • 后缀树
  • 最优二叉树(赫夫曼树)
  • 二叉堆 (大根堆,小根堆)
  • 二项树
  • 二项堆
  • 斐波那契堆(Fibonacci Heap)

图的算法

  • 图的存储结构和基本操作(建立,遍历,删除节点,添加节点)
  • 最小生成树
  • 拓扑排序
  • 关键路径
  • 最短路径: Floyd,Dijkstra,bellman-ford,spfa

排序算法

交换排序算法

  • 冒泡排序
  • 插入排序
  • 选择排序
  • 希尔排序
  • 快排
  • 归并排序
  • 堆排序

线性排序算法

  • 桶排序

查找算法

  • 顺序表查找:顺序查找
  • 有序表查找:二分查找
  • 分块查找: 块内无序,块之间有序;可以先二分查找定位到块,然后再到中顺序查找
  • 动态查找: 二叉排序树,AVL树,B- ,B+ (这里之所以叫 动态查找表,是因为表结构是查找的过程中动态生成的)
  • 哈希表: O(1)

15个经典基础算法

  • Hash
  • 快速排序
  • 快递选择SELECT
  • BFS/DFS (广度/深度优先遍历)
  • 红黑树 (一种自平衡的二叉查找树
  • KMP 字符串匹配算法
  • DP (动态规划 dynamic programming)
  • A*寻路算法: 求解最短路径
  • Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的)
  • 遗传算法
  • 启发式搜索
  • 图像特征提取之SIFT算法
  • 傅立叶变换
  • SPFA(shortest path faster algorithm) 单元最短路径算法

海量数据处理

  • Hash映射/分而治之
  • Bitmap
  • Bloom filter(布隆过滤器)
  • Trie树
  • 数据库索引
  • 倒排索引(Inverted Index)
  • 双层桶划分
  • 外排序
  • simhash算法
  • 分布处理之Mapreduce

算法设计思想

  • 迭代法
  • 穷举搜索法
  • 递推法
  • 动态规划
  • 贪心算法
  • 回溯
  • 分治算法

常见算法问题分类

  • 字符串
  • 堆和栈
  • 链表
  • 数值问题
  • 数组和数列问题
  • 矩阵问题
  • 二叉树
  • 海量数据处理
  • 智力思维训练
  • 系统设计

致谢

莫笑少年江湖梦,谁不少年梦江湖.

本篇内容参考自互联网及开源社区,感谢前人的经验、分享和付出,让我们可以有机会站在巨人的肩膀上眺望星辰大海!


开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情