努力是为了不平庸~
提到算法,有的觉得很难学,一个原因是算法本身就存在一定的复杂性,另外一个原因就是在学习的过程,大部分直接得到结果,然后是基于围绕结果,进行的推理证明,因此在学习算法的时候,经常觉得一切都顺利成章,很容易感到自洽,但在实际解决问题的过程中,没有明确的结果和方法做前提指引,大部分情况下,会觉得无从下手。因此,在学习算法的时候,应该基于现有问题,正向推理,基于已有的算法知识,得到自己的解题思路,然后再与最优算法做对比,分析自己的解题思路和发力方向是否与其一致,见贤思齐,弄清楚算法的来龙去脉,不断总结自己的不足。
算法作为一门学问,其中最主要的两个学习路线就是数据结构和算法策略。
1. 数据结构
数据结构是一种计算机科学技术领域广泛使用的的专业术语,我们可以简单的把它理解为数据和结构。其中数据是描述客观事物的符号,为程序操控,存储的计算机上,结构主要是用来描述数据的逻辑结构和存储结构。
1.1 数据的逻辑结构
逻辑结构主要有四种基本类型:集合结构、线性结构、树形结构和图形结构。
- 集合结构:由若干个元素组成的集合体相互堆积起来的一种结构类型,其最大的特点是,数据元素之间无其他的关系,仅仅是属于一个集合而已。
- 线性结构:数据元素直接存在一定的对应关系,其开始节点和终端节点具有唯一性,除这两个点外,其他元素之间都有唯一的前端节点和后继节点,行程一个完整的线性结构。
- 树形结构: 数据与元素之间存在着一一对应的关系,每个元素都有且只有一个前端节点,有若干个后端节点。
- 图形结构: 数据元素之间存在较多的对应关系,每个节点都有若干个前端节点和后继节点。
1.2数据的存储结构
存储结构描述可数据在计算机内部的存储安排。主要有顺序存储结构、链式存储结构、索引存储结构和哈希存储结构。
- 顺序存储结构:利用物理存储单元之间的连续性,将数据也按照逻辑顺序将其存入具有相同顺序的物理存储单元,节省存储空间,实现对数据的随机存取,每个节点拥有对应的序号,通过序号可以直接计算出对应数据的存储位置。但其明显的缺点就是,对数据的插入和删除不够友好,插入或删除一个元素可能需要移动多个无关元素的位置,降低插入和删除的效率。
- 链式存储结构:逻辑上两个相邻的两个元素在物理空间上不一定相邻,数据之间的相邻都是增加前端节点和后继节点的指针来完成相邻数据元素的访问和修改,这样做的好处就是,插入和删除元素效率很高,但是缺点就是存储空间效率太低,不利于数据的随机存取。
- 索引存储结构:该存储方式最大的特点就是增加了一个附加的索引表,索引表记录每个元素的唯一索引标识和对应元素的地址,当对数据进行插入和删除时,只需要对索引表操作即可,不需要去移动修改真实的数据,大大提高数据元素的查找能力,其缺点就是引入了索引表,增大了数据的存储空间。
- 哈希存储结构:通过哈希函数计算出每个元素关键字唯一对应的数值用作数据元素的存储地址的映射,通过该映射快速获得对应元素的地址。其最大的好处是,能够根据元素关键字立刻计算出该元素的存储位置,但其只能用于数据元素间不存在数据的逻辑关系,适合数据的快速查找和插入场景。
2. 算法策略
算法策略主要有贪心策略、分置策略、动态规划策略和线性策略等。
3. 写在做后
在实际的算法学习过程中,我们需要根据实际问题分析,设计合适的算法策略,然后基于已有的算法知识,选择合适的数据逻辑结构和数据存储结构,将结构和算法策略拧成一条线,得到问题的最优解决和实现方案,体会学习和解决问题的乐趣和节奏感,提高自己的算法实践能力。