常见的数据结构与算法
最基本的数据结构和算法包括:
- 排序算法
- 递归
- 链表
- 数组
- 队列
- 栈
- 优先队列
- 哈希(散列)
- 二叉树,B树,B+树,红黑树
- bitmap
- 跳表
- 二分法
- 动态规划
- 贪心算法
- ……
工作无需数据结构与算法?
您是否知道您的所有SQL和Linux命令都是算法和数据结构?您可能没有意识到这一点,但这就是软件的工作方式。
数据结构和算法在实现软件和雇用过程中也起着重要作用。许多学生和专业人士都提出了这样一个问题:为什么这些公司的访谈只关注DSA,而不是针对语言/框架/工具的特定问题?
当您要求某人做出某项决定时,好的人会告诉您“我选择做X,因为在这些方面,它比A,B更好。我本可以选择C的,但是由于这个原因,我认为这是一个更好的选择。在我们的日常生活中,我们总是和那个可以在短时间内高效完成任务并使用更少资源的人一起工作。这些公司也发生同样的事情。这些公司面临的问题更加艰巨,解决这些公司的问题时,软件开发人员必须做出正确的决定。
对数据结构(例如哈希表,树,图表,图形和各种算法)的了解对于有效解决这些问题大有帮助,面试官对查看候选人如何使用这些工具解决问题的兴趣更大。就像汽车修理工需要正确的工具来修理汽车并使其正常运行一样,程序员也需要正确的工具(算法和数据结构)来使软件正确运行。因此,面试官想找到一个候选人,可以应用正确的工具来解决给定的问题。
在像Google,Microsoft,Facebook,Amazon这样的公司工作的工程师与其他公司不同,在这些公司中,编码只是实现,大约需要20-30%的时间分配给项目。大多数时间都在使用最佳算法来设计事物,以节省公司的资源(服务器,计算能力等)。这就是为什么这些公司中的采访集在算法上的主要原因,因为他们希望开箱即用的人设计可以为公司节省数千美元的算法。
示例:假设您在Facebook公司工作。您提出了时间复杂度为O(nLogn)而不是O(n ^ 2)的问题的最佳解决方案,并假定公司的问题的n实际为生活场景为1亿(考虑到在Facebook上注册的用户数超过10亿)。nLogn为8亿,而n ^ 2为10 ^ 70亿。在成本方面,您可以看到效率提高了10 ^ 7倍以上,这在服务器成本和时间方面可以节省很多。
从用人者角度
毋庸置疑,面试是用来筛选候选人的,在这个僧多粥少的时候,就需要提高筛选条件,例如最常见的学历,不是说学历一般的人不好,而是总体来说,学历好的人里面挑选到合适的概率比较大而已,这就是现实。而面试题中,算法相比于其他记忆型的题目,就能很好的体现一个人的逻辑和思路,因而也是一个很好的筛选条件。当然像操作系统,网络,Linux等都是很多公司喜欢考察的点。
所以为了面试还是需要准备学习算法的。
从个人角度
进去的第一家公司基本用不上什么算法(血的教训,在学校的时候一定要好好准备),甚至用不上网络编程,基本就是简单纯C开发,因为那些东西早就封装好了(由另外一个组负责开发维护),只需要调用即可。包括后来去面试,主要面试了两类公司,一类是传统通信技术类,一类是互联网公司,前者关注项目本身,以及基本的技术技能更多一些,而后者考察的方面通常比较多,包括操作系统,数据库,算法,网络等知识。
那么面完之后是不是真的就完全没用了呢?确实,大多数时候根本用不上。你写的可能多是业务代码,是业务流程的设计,代码实现可能只是很小的一环。而且现有算法实现一搜一大把,基本不太可能要你自己去实现什么快排,跳表,快排,红黑树之类的算法,但是学习算法有好处。
例如,你可能要根据你的业务排序需求来选择是用稳定排序还是非稳定排序;你可能会根据插入和删除数据的频率来选择使用array list还是link list;你可能为了处理top K问题采用堆相关算法;可能为了某种情况下的快速查找而使用哈希;你可能在设计你的业务数据结构时引用了基本数据结构的思想。
算法解决一些现实世界中的复杂问题
当您在混乱的房间里找不到书或衣服时,有没有被父母骂过?肯定有过吧,您的父母的建议是对的,以确保一切都在正确的位置,以便下次您可以轻松获得所需的东西。在这里,您需要以一种结构来安排和保留所有内容(数据),以便每当您需要搜索某些内容时,都可以轻松而迅速地获得它。这个例子清楚地表明,在现实生活中安排或构造数据有多么重要。
现在以图书馆为例。如果您需要从图书馆中找到一本关于集合论的书,那么您将首先进入数学部分,然后进入集合论部分。如果这些书不是以这种方式组织的,而是随机分配的,那么寻找特定的书将很令人沮丧。因此,数据结构是指我们在计算机上组织信息的方式。计算机科学家进行处理并寻找可以组织数据的最佳方式,因此可以根据所提供的输入更好地对其进行处理。
许多新手程序员都提出了这样一个问题:我们在日常生活中将数据结构和算法的所有内容都用在哪里,以及它在解决现实世界中的复杂问题上如何有用。我们需要提及的是,无论您是否有兴趣进入顶尖的科技巨头公司,DSA仍然对您的日常生活有很大帮助。
总结
通常我们不需要自己实现这些算法,不过我觉得从中了解以下几点非常重要
- 时间和空间复杂度的概念
- 各类数据结构或算法的效率
- 各类数据结构或算法的复杂度
- 各类数据结构或者算法的适用场景
- 常见的如vector,map,set等容器背后的数据结构是什么,它们的查找或者插入效率如何
- 从现有数据结构和算法中获得思路
- 根据现有问题选择合适的数据结构和算法
不像Java,C++,Python之流,C库中可能没有上面提到的数据结构或者算法的实现,因而C语言也是加深对它们理解的不二选择。
一切为了更好地解决实际问题。