说明:
(1)本篇博客的目的就是:解决【学算法和数据结构,到底有没有用】这一疑问;
目录
一:计算机世界中,很多东西底层都蕴含着很多数据结构和算法的东西;
三:为什么有些公司(尤其是大厂)面试时,会面算法和数据结构?
零:算法和数据结构引文;
(1)比如,遇到一个问题:首先要考虑数据应该怎样存储,这就是数据结构要解决的问题;当我们决定了数据结构之后,后续怎么样操作,采用什么步骤去解决问题,这就是算法要解决的问题。
(2)但,很多时候数据结构和算法是不分家的:当我们在具体设计一个数据结构的时候,数据结构内部的执行逻辑本身就可以看成是一个算法;同时,很多算法本身也要依托于某个具体的数据结构来实现;
一:计算机世界中,很多东西底层都蕴含着很多数据结构和算法的东西;
案例1:数据库;
说明:
(1)我们在学习数据库的时候,花费了大量精力是学习SQL语言;比如通过简单的【select语句】就能查询得到结果;
(2)在这个过程中,我们似乎不用关心数据库底层是如何存储数据的;数据库作为一个工具,已经把这些功能封装好了,我们拿来用就行了;
(3)但是,如果我们去研究数据库内部逻辑是怎样的,就会发现,其中包含了大量的算法和数据结构;
(4)在很旧之前,数据库还不是一个标准化产品时,开发者要想完成一个较大规模的程序时,都需要自己开发一个类似于数据库的数据管理工具;即在当时,开发者必须要掌握算法和数据结构,这样才能自己开发数据存储工具;
那么为什么通过【select * FROM ……】这一个语句,就能实现查找功能嘞?这个语句,本质上就是一个字符串啊。这个字符串作为一个指令发送给计算机的数据库工具后,数据库内部到底做了什么,把这个字符串解析成了一步一步的逻辑,进而从数据库中查找到相应内容嘞? 这就涉及到了【字符串算法】。在计算机中,类似的情况还有很多,比如案例2。
案例2:网页源代码的解析;
说明:
(1)浏览器解析【网页源代码】,经过渲染后得到【一个精美的网页】;
(2)【网页源代码】本质是一个大大的字符串,浏览器会解析这个字符串;其实我们平常【编写的程序】也是一个大大的字符串,IntelliJ IDEA会解析这个字符串;
(3)在这背后,算法和数据结构起到了重要作用;解析字符串中,会涉及大量的字符串算法;
案例3:操作系统;
说明:
(1)操作系统底层包含着大量的算法和数据结构;
(2)比如:操作系统中的【任务切换】,就涉及到了数据结构中的【优先队列】;操作系统的【内存管理】,涉及到了数据结构的【内存堆、栈】;
……………………………………………………
(3)所以,一般需要学习了【算法和数据结构】后,才能去学习【操作系统】;
(4)计算机的其他内容如【编译原理】、【图形学】、【图像学】等,在学习之前,最好有算法和数据结构的基础;
案例4:文件压缩;
说明:
(1)文件压缩本身就是一个算法;
(2)文件压缩不仅仅是我们熟知的rar压缩包;我们在网络上看到的任何文件(图像、音频、视频、文档),这些文件内部都大量的使用了压缩算法;正是有这些压缩算法,我们才能对这些文件进行压缩,进而方便我们在互联网上传输;(几乎我们打开任意一种类型的文件,都有一个文件压缩和解压的过程,只是我们作为用户感受不到而已)
案例5:游戏;
说明:
(1)游戏中,很多常见的操作,背后都是一个算法;
(2)比如,游戏中从A点走到B点,就涉及到了寻路算法;人机局中,就涉及到了智能领域了(而在智能领域中,算法和数据结构应用的更多);
案例6:图形学;
说明:
(1)在游戏的场景渲染,电影中特效等中,需要使用到图形学;
(2)图形学主要就是用来解决渲染问题(如何在计算机二位屏幕中,表示各种效果,比如三维效果);
(3)比如,图形学中的场景管理:二维空间使用四叉树,三维空间中使用八叉树;
案例7:图像学;
说明:
(1)比如人脸识别、表情识别、图像识别、自动驾驶,背后都使用了图像学;
(2)图像学中,也应用了大量的算法和数据结构;
可以这样说,我们通过计算机做的几乎所有事情,背后都大量应用了算法和数据结构。
二:为什么在实际工作中,感觉用不到算法和数据机构?
原因:
(1)计算机科学已经发展到了一定的程度,很多常用的工具已经被很好的封装了;我们不需要亲自去实现和设计,我们直接使用现成的工具就行了。
(2)算法和数据结构在业务层面应用的不多,而自己的工作大部分也都是在业务层面的,所以在实际工作中感受不到算法和数据结构;
但是,当脱离业务层面,接触基础层面的内容(比如,改进操作系统的某个模块,编写一个语言编译器,自己实现一个数据库,改善和编写压缩算法,图形渲染,图像识别)时,就会立刻感受到算法和数据结构的重要性。
三:为什么有些公司(尤其是大厂)面试时,会面算法和数据结构?
说明:
(1)很多大厂的产品就是【基础服务产品】;因此,大厂希望职员拥有算法和数据结构的能力;
(2)即使,大厂的某些部门不会从事底层的开发,而是从事应用层的开发;但,由于大厂的用户群十分庞大,一个应用层服务的数据规模也是很大的,很可能现有的解决方案无法解决需求,为此也会涉及到底层内容(比如:开发自己的框架,优化数据库,改编现有编程语言,创建一个编程语言等),而这些底层内容都需要算法和数据结构的支撑;
算法和数据结构决定了技术的上限;
计算机中,算法和数据结构很重要。但除此之外,操作系统,网络基础,编译原理,组成原理等也是十分重要的。而,算法和数据结构是其他内容的前提和基础。