前言
在之前学C++的时候,经常会听到要学习数据结构的建议,可能是基于C++的算法与数据结构实现的资源比较多吧,我曾经认识一位打信息学奥赛和ACM的同学也说要学算法与数据结构最好是用C++。
本着知其然还要知其所以然的原则,我想知道为什么要学习算法与数据结构,换句话说就是它有什么用。
数据结构与算法的应用
数据结构
- 数组(Array)
应用:查找、排序和统计数据。
例子:一个班级的学生名单,可以快速访问任何学生的信息。
- 链表(Linked List)
应用:动态内存管理,如内存分配器。
例子:音乐播放器中的播放列表,可以方便地添加或删除歌曲。
- 栈(Stack)
应用:后进先出(LIFO)的数据管理,如函数调用堆栈。
例子:浏览器的前进和后退功能,用户可以返回到之前访问的页面。
- 队列(Queue)
应用:先进先出(FIFO)的数据管理,如任务调度。
例子:打印任务队列,先到的打印任务先被打印。
- 哈希表(Hash Table)
应用:快速查找、插入和删除操作,如数据库索引。
例子:网站的URL到网页内容的快速映射。
- 树(Tree)
应用:层次化数据的表示,如文件系统。
例子:组织结构图,显示公司的层级关系。
- 二叉树(Binary Tree)
应用:快速搜索,如二叉搜索树。
例子:快速查找一个特定范围的数据。
- 堆(Heap)
应用:优先队列的实现,如任务调度。
例子:操作系统中的进程调度,优先级高的进程先执行。
- 图(Graph)
应用:表示复杂的网络结构,如社交网络或交通网络。
例子:地图应用中的路径查找,确定最短或最快的路线。
算法
大类
排序算法
搜索算法
- 图算法
应用:路径查找、网络流问题等。
例子:地图应用中的最短路径计算。
- 动态规划
应用:解决具有重叠子问题和最优子结构特性的问题。
例子:视频压缩算法,优化存储空间。
- 贪心算法
应用:在每一步选择中都采取在当前状态下最好或最优的选择。
例子:Huffman编码,用于数据压缩。
- 分治算法
应用:将复杂问题分解成若干个规模较小的相同问题。
例子:快速傅里叶变换(FFT),用于信号处理。
- 递归算法
应用:解决可以通过简单情况递推到复杂情况的问题。
例子:树结构的遍历,如文件系统的遍历。
- 深度优先搜索(DFS)
应用:遍历或搜索树或图。
例子:社交网络中的好友推荐系统。
- 广度优先搜索(BFS)
应用:层次遍历,如网页爬虫。
例子:社交网络中的“你可能认识的人”功能。
- 二分查找
应用:在有序数组中查找特定元素。
例子:在线音乐服务中搜索特定歌曲。
K-最近邻(KNN)
应用:分类和回归问题。
例子:推荐系统中的相似商品推荐。
- Dijkstra算法
应用:在加权图中找到单个源点到所有其他顶点的最短路径。
例子:导航系统中的路线规划。
- 贝尔曼-福特算法
应用:在图中找到从单个源点到所有其他顶点的最短路径,可以处理负权边。
例子:金融交易中的最短支付路径计算。
- 快速幂算法
应用:快速计算幂运算,常用于模线性方程求解。
例子:RSA加密算法中的模幂运算。
- 字符串匹配算法
应用:在文本中查找子串或模式。
例子:文本编辑器中的查找和替换功能。
相关的资源
以下介绍一下我在搜集资料过程中遇到的比较好的资源
- 嵌入式c语言
这个视频涉及了很多内容,如果坚持看完也挺花时间的,不过内容很详尽。
- 郝斌老师
郝斌老师数据结构
这个是比较纯粹的讲数据结构的内容,广受好评,我之前看到指针那里确实是比较理解的
- Hello算法
Hello算法
这个up主在b站上有号,而且除了一本书,github上面的资源也很多,还有一个网站,十分系统了,这里不是不介绍,而是介绍不下了,伟大,无需多言
- 左程云
人们都叫他左神,我目前还不了解,但是他b站关于数据结构和算法已经更了一百四十多集了,而且特别快
我是能够看出来他是真的想教会我们的
链接
可视化网站
还有一些可视化网站能够帮助我们比较直观地了解算法与数据结构的,出自CodeSheep的推荐
统一放链接在下面了
https://www.bigocheatsheet.com/
https://algorithm-visualizer.org/backtracking/hamiltonean-cycles
https://visualgo.net/en