什么是数据结构(Data Structure)
是相互之间存在一种或多种特定关系的数据元素的集合。是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间关系等相关问题的学科。
在计算机中,数据元素并不是孤立,杂乱无章的,而是具有内在联系的数据集合。数据之间的一种或多种特定的关系就是数据的组织形式。
为了编好一个程序,必须分析待处理对象的特性和各处理对象之间存在的关系。这也是研究数据结构的意义所在。
什么是算法(Algorithm)
算法是解决特定问题求解步骤的描述,跟采用的编程语言无关。在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。一旦某个算法确定,那么重要的一步就是确定该算法将需要多少时间或空间等资源量的问题。
数据结构和算法的关系
程序设计 = 数据结构 + 算法
算法需要适当的组织数据,组织数据就产生了数据结构,数据结构是算法的副产品或结果。简单的算法也会产生复杂的数据结构。而复杂的算法可能只需要简单的算法。
数据结构是为算法服务,算法要作用在特定的数据结构之上。 数据结构是静态的,它只是组织数据的一种方式,如果不在它的基础执行操作,构建算法,孤立存在的数据结构是没用的。
为什么需要学习数据结构和算法
基础知识就像是一座大楼的地基,它决定了我们的技术高度。 而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。而数据结构和算法就是软件开发行业最重要的地基。
大厂都看中候选人的算法能力,因为相比你的短期能力,他们更看重你的长期潜力。
当用计算机解决问题时,通常会存在多种解决方案,对于小型问题,只要管用就行。对于大型问题,或面对大量的小型问题时,我们就需要设计能够有效利用时间和空间的比较有优势的算法了。
能节约资源,甚至能完成本不能完成的任务。
在某些大型应用(处理上百万的对象),设计优良的算法甚至可以将程序运行速度提高数百万倍。而购置更强硬件的方式仅能提高十或百倍。
业务开发中用到很多的中间件,框架和底层系统,如Spring, RPC框架,MQ,Redis等。这些基础组件中都糅合了很多基础数据结构和算法的思想。理解并学会这些底层原理,有助于你更好的使用它们,出现问题也更容易定位。
想当基础研发工程师,写出达到开源水平的框架才是自己的目标
避免被行业淘汰。 为什么程序员35岁后容易被淘汰?因为很多人仅仅完成业务代码,不考虑非功能需求,也没有长远规划,这样虽然工作了很多年,十年的积累和一年的积累没太大区别,项目没有难度递进,也就没有能力提升。
学习的目的是为了建立时间复杂度,空间复杂度意识,写出高质量的代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,实现自我价值。
如何学好数据结构和算法
如何精通一个领域?
-
Chunk it up(切碎知识点)
大的知识体系,分为小块 -
Deliberate practicing(刻意练习)
注重脉络联系,刻意练习;
练习缺陷,弱点的地方;
会有枯燥,不舒服的感觉; -
feed back(反馈)
主动反馈:做leetcode练习,参与github项目,教别人
被动反馈:如参与代码审查,被动学习知识,看视频
切题四件套
面对算法题,做好以下切题四件套
-
Clarification
明确题目的含义,彻底理解题目的意图 -
Possible solutions
找出所有可能的解法,选取最优解 -
Coding
编码 -
Test cases
通过测试用例进行检查
优秀资料
-
《数据结构与算法分析Java语言描述》- 入门
-
《算法》- 进阶
-
《算法导论》- 进阶
数据结构包含哪些知识点
数据结构的分类
逻辑结构:指数据对象中数据元素之间的相互关系。分为以下四种:
-
集合结构
集合结构中的数据元素除了同属于一个集合外,它们之间没有其他的关系。它们之间是平等的。集合结构类似于数学中的集合。 -
线性结构
线性结构中的数据元素之间是一对一的关系
如:数组,链表(单向,双向),队列(双端,循环,优先级,阻塞),栈 -
树形结构
树形结构中的数据元素之间存在一对多的关系
如:二叉树(二叉搜索树,平衡二叉树,2-3-4树, 红黑树),B树,B+树,跳表 -
图形结构
图形结构中的元素是多对多的关系
物理结构:指数据的逻辑结构在计算机中的存储形式
-
顺序存储结构
数据元素存储在连续的存储单元中,数据间的逻辑关系跟物理结构一致 -
链式存储结构
数据存储在任意的存储单元里,这组存储单元可以连续,也可以不连续。 数据元素中使用指针找到相关联元素的位置
逻辑结构面向问题,而物理结构是面向计算机的,其基本的目标就是将数据及逻辑关系存储到计算机的内存中。
算法包括哪些知识点
算法的特点
- 输入输出
具有0个或多个输入,1个或多个输出 - 有穷性
算法在执行有限的步骤后,自动结束而不会出现无限循环。 并且每个步骤在一个可接受的时间内完成。 - 确定性
每一步都有确定的含义,不会出现二义性。相同的输入只能有唯一的输出结果。每一步被精确定义而无歧义 - 可行性
- 算法的每一步都必须是可行的,也就是说每一步都能通过执行有限次数完成。
算法的设计要求
- 正确性
输入输出,加工处理无歧义,能正确反映问题的需求,能得到问题的正确答案。
算法的正确有4个层次:
1. 算法程序无语法错误
2. 算法对于合法的输入能产生满足要求的输出
3. 算法对于非法的输入能产生满足规格说明的结果
4. 算法对于精心选择的,甚至刁难的的测试数据能够得出满足规格说明的结果
-
可读性
便于阅读,理解和交流 -
健壮性
当输入不合法时,算法能做出相关处理,而不是产生异常或莫名其妙的结果 -
时间效率高和存储量低
算法的执行效率高,执行时间短。 存储量低指算法执行过程中占用的内存和磁盘空间低。花最少的时间和空间办最大的事
算法效率的度量方法
-
事后统计
通过测试数据对比不同的算法程序执行效率,从而确定算法效率的高低
缺陷:
必须要依据算法编写好程序,如果最后不符合是极大的浪费
时间的比较依赖于环境,可能会造成误差
测试数据设计困难,运行时间与数据规模有很大关系 -
事前分析估算
依据统计方法对算法进行估算
算法的执行时间主要依据算法的设计优劣和数据规模
测量运行时间最有效的方法是计算对运行时间有消耗的基本操作的执行次数。运行时间与这个计数成正比。
数据结构和算法大纲
数据结构:
线性表:
数组
链表:单链表,双向链表,循环链表,双向循环链表
栈:顺序栈,链式栈
队列: 普通队列,双端队列,阻塞队列,优先级队列哈希表:
哈希函数
冲突解决:链表法,开放寻址法,其他
动态扩容
位图
树:
二叉树: 平衡二叉树;二叉搜索树;平衡二叉搜索树:AVL树,红黑树;完全二叉树;满二叉树
多路搜索树:B树;B+树;2-3树;2-3-4树
堆:小顶堆;大顶堆;优先级队列;斐波那契堆;二项堆
跳表
其他:树状数组,线段树
图:
图的存储:邻接矩阵;邻接表
拓扑排序
最短路径
关键路径
最小生成树
二分图
最大流
算法
复杂度分析
空间复杂度
时间复杂度: 最好;最坏;平均;均摊
基本算法思想:哈希算法;贪心算法;分治算法;动态规划;回溯算法;枚举算法
递归
排序:
O(N * N): 冒泡排序;插入排序;选择排序;希尔排序
O(N * logN): 归并排序;快速排序; 堆排序
O(N): 计数排序;基数排序;桶排序
搜索:
深度优先算法
广度优先算法
A*启发式搜素算法
查找算法:
线性表查找,二分查找
树结构查找
哈希表查找
字符串匹配算法:
朴素
KMP
Trie
其他:
概率分析
数论
拓扑网络
章节介绍
入门
学习时间/空间复杂度,最好,最坏,平均,均摊复杂度
基础
学习最常用的数据结构和算法
进阶
学习不常用的数据结构和算法,能开拓视野,强化训练算法思维和逻辑思维
实践
分析开源项目背后的数据结构和算法