相信想进一线大厂的程序员是非常多的,也是程序员一直以来的梦,不仅仅是因为薪资比较高,更多的是因为大厂比较锻炼人,将来的发展空间也是非常大的!
近年来,在面试大厂中,算法的比重是越来越高了,像BATJ TMDPS,尤其是字节,数据结构与算法极其重要。
今天就给大家分享国内算法第一人10年经验总结的数据结构与算法详解文档,希望大家能够喜欢!
首先,大龄大家看一下目录
其次,来看主要内容
本文旨在讲解数据结构和算法的核心知识。本文主要内容包括线性表、栈、队列、串、数组、广义表、树、图、查找算法、排序算法、递推算法、递归算法、枚举算法、贪心算法、回溯算法、数值算法和实用算法等。适合计算机专业的学生、软件开发专业人员等阅读。
全文总共分为数据结构与算法两大部分,总共有18个章节。
第一部分 数据结构
数据结构主要研究数据的逻辑结构和存储结构,以及对数据的各种操作,是深入学习算法设计与分析、操作系统、编译原理、软件工程等的重要基础。随着计算机应用领域的不断扩展,非数值计算问题已成为计算机应用领域处理的主要问题之一,简单的数据结构已经不能满足需要,无论是系统软件设计还是应用软件设计,均涉及复杂的数据结构处理。好的算法是建立在解决实际问题过程中对数据结构的描述上的。因此,掌握扎实的数据结构的基本知识和技能对于今后的专业学习和软件开发是十分必要的。该部分主要介绍线性表、栈、队列、串、数组、广义表、树和图等方面的知识和应用。
第1章 线性表,线性表是一种最基本、最常用的数据结构,表中的元素呈线性关系。线性表、栈、队列和串都属于线性结构,线性结构的特点是:除了第一个元素没有直接前驱元素,最后一个元素没有直接后继元素外,其他元素有唯一的前驱元素和唯一的后继元素。
第二部分 算法
算法(algorithm)是特定问题求解步骤的描述,在计算机中表现为有限的操作序列。数据结构与算法的区别在于数据结构关注的是数据的逻辑结构、存储结构以及基本操作,而算法研究适合计算机实现的求解问题的方法,更多地关注如何在数据结构的基础上解决实际问题。该部分主要介绍一些常用的算法和技术,包括查找算法、排序算法、递推算法、递归算法、枚举算法、贪心算法、回溯算法、数值算法、实用算法、程序调试技术等内容。
第9章 查找算法,查找也称检索,是指从一批记录中找到指定记录的过程。查找算法是程序设计过程中处理非数值问题常用的操作之一。例如,从英汉词典中查找某个单词的含义,从联系人中查找朋友的联系方式等。常用的查找算法包括基于线性表的查找、基于树的查找、哈希表的查找。
第10章 排序算法,排序算法是程序设计中最常用的算法之一。排序(sorting)是程序设计中的一种重要技术,它将由若干数据元素(或记录)组成的无序序列重新排列成一个按关键字排列的有序序列。一般来说,排序算法按照排序策略可分为插入排序、交换排序、选择排序、归并排序和基数排序。
第12章 递归算法,递归就是自己调用自己,它是设计和描述算法的一种有力的工具,常常用来解决比较复杂的问题。递归是一种分而治之、将复杂问题转换为简单问题的求解方法。一般情况下,能采用递归描述的算法通常有以下特征:为求解规模为N的问题,设法将它分解成规模较小的问题,从小问题的解更容易构造出大问题的解,并且这些规模较小的问题也能采用同样的分解方法,分解成规模更小的问题,并能从这些更小问题的解构造出规模较大问题的解。一般情况下,规模N=1时,问题的解是已知的。
以上求解过程也利用了分治算法的思想。分治算法将一个大规模问题分解为若干子问题,子问题相互独立,然后将子问题的解合并就可得到原问题的解。分治算法具体可以使用递归实现。递归算法具有以下优缺点。
优点:使用递归编写的程序简洁、结构清晰,程序的正确性很容易证明,不需要了解递归调用的具体细节。
缺点:递归函数在调用过程中,每一层调用都需要保存临时变量、返回地址、传递参数,因此递归函数的执行效率低。
第13章 枚举算法,枚举算法,也称穷举算法,它是编程中常用的一种算法。在解决某些问题时,可能无法按照一定规律从众多的候选解中找出正确的解。此时,可以从众多的候选解中逐一取出候选解,并验证候选解是否为正确的解。我们将这种方法称为枚举算法。
枚举算法的缺点是运算量比较大,解题效率不高。如果枚举范围太大,那么就会耗费过多。枚举算法的优点是思路简单,程序编写和调试方便。因此,如果问题的规模不是很大,且要求在规定的时间和空间下能够求出解,那么我们最好采用枚举算法,而不需要太在意是否还有更快的算法。
第14章 贪心算法,贪心算法(greedy algorithm)是一种不追求最优解,只希望找到较满意解的算法。贪心算法省去了为找最优解要穷尽所有可能而必须耗费的大量时间,因此它一般可以快速得到比较满意的解。贪心算法常以当前情况为基础做最优选择,而不考虑各种可能的整体情况,所以贪心算法不需要回溯。
贪心算法的典型应用包括找零钱问题、最优装载问题、哈夫曼编码加油站问题、背包问题等。例如,平时购物找零钱时,为使找回的零钱的硬币数最少,不要求穷举出找零钱的所有方案,而是从最大面值的币种开始,按递减的顺序考虑各面额。先尽量用大面值的面额,当不足大面值时才去考虑下一个较小面值,这就是应用了贪心算法的思想。