数据结构与算法这么难,为什么我们还要学习?

文章目录

  • 前言
  • 1. 数据结构与算法是什么?
  • 2. 为什么数据结构与算法很难?
  • 3. 如何系统学习数据结构与算法?
    • 🍑 复杂度
    • 🍑 线性表
    • 🍑 树形结构
    • 🍑 图
    • 🍑 排序
    • 🍑 字符串
    • 🍑 跳表与哈希表
    • 🍑 总结
  • 4. 学前勉言


前言

提到数据结构与算法,就一定会伴随着诸多所谓的坚持和抱怨。同时,还有两个词总是出现,一个是内功,是对知识的定位,一个是吃透,是对自己的期待。可是,我们是不是被这两个词束缚太久了,以至于出现了很多的问题:

  • 时间不多,数据结构与算法的知识体系庞大,总是学了后面忘了前面,很难坚持。
  • 刷了不少题,但面对面试官的提问和新的题目,我总是没有思路。
  • 代码细节总是写不对,环境、语言都可能成为我的 “绊脚石”。
  • 书上的东西看是看懂了,但到底要怎么实践?

在这里插入图片描述

我个人觉得,其实真正的原因是你没有找到好的学习方法,没有抓住学习的重点。实际上,数据结构和算法的东西并不多,常用的、基础的知识点更是屈指可数。只要掌握了正确的学习方法,学起来并没有看上去那么难,更不需要什么高智商、厚底子。

1. 数据结构与算法是什么?

从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。

图书馆储藏书籍你肯定见过吧?为了方便查找,图书管理员一般会将书籍分门别类进行 “存储”。按照一定规律编号,就是书籍这种 “数据” 的存储结构。
 
那我们如何来查找一本书呢?有很多种办法,你当然可以一本一本地找,也可以先根据书籍类别的编号,是人文,还是科学、计算机,来定位书架,然后再依次查找。笼统地说,这些查找方法都是算法。

从狭义上讲,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。这些都是前人智慧的结晶,我们可以直接拿来用。我们要讲的这些经典数据结构和算法,都是前人从很多实际操作场景中抽象出来的,经过非常多的求证和检验,可以高效地帮助我们解决很多实际的开发问题。

那数据结构和算法有什么关系呢?为什么大部分书都把这两个东西放到一块儿来讲呢?

这是因为,数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。 因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。

比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。

数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。

现在你对数据结构与算法是不是有了比较清晰的理解了呢?有了这些储备,下面我们来看看,数据结构与算法的难点在哪儿吧。

2. 为什么数据结构与算法很难?

第一个问题:都说这部分知识是内功,一定要不断修炼,保证吃透,可是何为内功?何为吃透?

有人把学习数据结构与算法比喻为练内功,但我不赞成这样的说法。程序员真正的内功其实是解决复杂问题的全局把控能力以及细节实现能力,这往往需要十数年甚至数十年的持续修炼才能体会得到。除非你将所有计算机基础知识都称为内功,否则这样的比喻并不恰当。

不可否认的是,数据结构和算法方面的知识是计算机的基础知识之一,但是,这不意味着你一定要给它贴上一个宏大的标签,甚至扛着极大的心理压力和包袱去学习。

数据结构和算法方面的知识博大精深,深入挖掘下去还会用到许多数学知识。因此,我们的首要目标不应该是吃透,而应该是尝一尝,把知识读薄,指向实践,够用即可。后续要在某个非常具体的数据结构或者算法领域取得一定成就,才会需要吃透其中的一些东西。

第二个问题:怎么分配系统学习和刷题的时间呢?

有一句话很重要,做选择之前要明白自己到底想要什么。

刷题,基本都是为了应付面试。如果非要说是为了锻炼解决问题的思维能力,以及快速用合适的数据结构去解决现实中的问题,这个作用当然也有,但却是次要的。对于软件工程师来讲,还有很多比数据结构更重要的知识需要去学会。

如果你确定要去某个大厂应聘某个算法岗,而该算法岗是需要你刷题的,那么你就在系统学习之后,在网上找找相关的试卷或者考题,有目的地到 LeetCode 上去刷。

如果你不去大厂或者并不去应聘一些专门的算法岗职位,那么直接去系统学习一门课就好。把时间节省出来好好学些更重要的知识吧。切记,时间对于软件开发工程师非常非常珍贵,甚至是你最珍贵的资源、最宝贵的财富。千万不要大手大脚的占用大量时间去学习太多没必要的知识。

一言以蔽之,也就是没有孰重孰轻,但 系统的学习是刷题的基础。想象一下,你会在不认识汉字的情况下去读小说吗?

越是大而全,越要删繁就简卸下了包袱,明确了目标,接下来的问题就是怎么学习了。

很多同学感觉到自己的时间有限,数据结构和算法知识体系太过庞大,学了后面忘了前面,很难坚持学完。造成这种情况的原因很多,比如有些资料把简单问题复杂化了,有些资料则非常晦涩,数学知识过多,学术性过强,甚至是表达不清,很难让人有舒适的学习体验。

不论你是否已经具备了一定的基础,接下来,就让我们放平心态,先来梳理下在每个模块的学习目标到底是什么。

3. 如何系统学习数据结构与算法?

为了让大家对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。

在这里插入图片描述

🍑 复杂度

数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。

所以,如果你只掌握了数据结构和算法的特点、用法,但是没有学会复杂度分析,那就相当于只知道操作口诀,而没掌握心法。只有把心法了然于胸,才能做到无招胜有招!

因此,复杂度分析这个内容,一定要花大力气来啃,必须要拿下,并且要搞得非常熟练。否则,后面的数据结构和算法也很难学好。

🍑 线性表

学习任何知识都要由浅入深,由易到难。线性表会是本专栏讲解的第一个数据结构,和其它结构相比,它更为简单直接,也最好理解,从代码实现上也最容易,是学习其他更复杂数据结构的基础。同样,也一定能让你对之后的学习更有信心。

🍑 树形结构

不过,在一些复杂的领域中,线性表这种简单的数据结构还不足以表达问题,这个时候,树形结构就出现了。

它是算法面试中最常出现的数据结构,也是在实际开发中我们经常会有意无意用到的数据结构,想要写出正确且更高效的程序代码,这部分的内容还是要打好基础的。

🍑 图

图是比树形结构更复杂的数据结构。如果说树形结构的应用往往体现在程序编写中,那么对图的应用往往更接地气,更体现在实际生活中。

比如可以通过图来解决找出两个城市之间如何行走距离最短、最节省时间、花费的金钱最少问题等等,还可以用图来估算一个工程能否按顺序进行以及估算该工程需要的最短时间。

🍑 排序

我们知道,数据结构是为算法服务的。所以在讲解完线性表、树形结构、图这三种数据结构后,我们正式进入到算法知识的讲解中。

在各种算法知识中,尤其以排序算法最经典,实用且在面试中最常出现。排序算法有十数种,每种排序算法的适用场合、时间以及空间复杂度、稳定性等各不相同,搞定了这部分的内容,也就可以应付面试了。

🍑 字符串

这种数据结构非常常见,同时也有着广泛的应用,比如在搜索引擎中搜索的关键词、在文章中需要过滤的敏感词等等,都属于字符串。

其中,最需要解决的问题是子串在整个字符串中的查找问题。主要介绍两种查找子串的算法实现方式。第一种实现方式称为朴素模式匹配算法,容易理解但执行效率相对较低;第二种是 KMP 模式匹配算法,这种算法执行效率很高,但理解起来却颇有难度。

尤其值得注意的是,有些面试官非常喜欢考 KMP 模式匹配算法实现的子串查找,这里的重要程度也就不言而喻了。

🍑 跳表与哈希表

跳表与哈希表这两种数据结构都非常实用且有趣味性,可以理解成是属于更高级的数据结构范畴。不过放心,虽然高级,但代码实现上却没有那么复杂。

你可以把跳表看作强化版的线性表,可以极大提升元素查询速度。而哈希表是对数组的扩展,对于查找操作同样有非常良好的性能表现。引入这两个话题,一是为了丰富你的眼界和开发思路,以备在日后的开发中随时采用,二来也是避免不了的老调重弹 —— 为了应付面试的需要。

🍑 总结

作为初学者,或者一个非算法工程师来说,你并不需要掌握上图里面的所有知识点。很多高级的数据结构与算法,比如二分图、最大流等,这些在我们平常的开发中很少会用到。所以,你暂时可以不用看。咱们学习要学会找重点。如果不分重点地学习,眉毛胡子一把抓,学起来肯定会比较吃力。

所以,只要集中精力逐一攻克这下面知识点就足够了。

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。

学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。你的编程内功就真正得到了修炼。

4. 学前勉言

前面划了学习的重点,也讲了学习这门课需要具备的基础。现在我就给你分享一下,本专栏 「数据结构」 学习的一些技巧。掌握了这些技巧,可以让你化被动为主动,学起来更加轻松,更加有动力!

  • 边学边练,适度刷题
  • 多问、多思考、多互动
  • 打怪升级学习法
  • 知识需要沉淀,不要想试图一下子掌握所有

在学习的过程中,一定会碰到 拦路虎。如果哪个知识点没有怎么学懂,不要着急,这是正常的。因为,想听一遍、看一遍就把所有知识掌握,这肯定是不可能的。学习知识的过程是反复迭代、不断沉淀的过程。

因此,我特别希望这个专栏 「数据结构」 不仅能帮你抛下身上对于数据结构与算法的沉重包袱,更能潜移默化地为你打开思维,建立数据结构与算法的敏感度,为之后的每一次实战打下坚实的基础。

要记住,数据结构与算法,本来就是一件小事。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【c++】:模拟实现STL模板中的string

文章目录 前言一.string的模拟实现总结前言 上一篇文章我们详细介绍了STL中的string的一些常用的接口,这一篇文章我们将从底层实现string类,当然我们只是实现一些重要的,经常使用的接口,并且不是完全按照STL中的string去走的。 一…

对于从事芯片行业的人来说,有哪些知识是需要储备的?

近两年芯片行业大火,不少同学想要转行,却不知道该如何下手,需要学习哪些基础知识,下面就来看看资深工程师怎么说? 随着工艺的发展,芯片肯定是尺寸越来越小,至于小到什么样的程度是极限&#xf…

【小破站下载工具】Python tkinter 实现网站下载工具,所有数据一键获取

目录前言开发环境本次项目案例步骤先展示下完成品的效果界面导入模块先创建个窗口功能按键主要功能代码编写功能一功能二功能三前言 最近很多同学想问我,怎么把几个代码的功能集合到一起? 很简单,写一个界面就行了,想要哪个代码…

CSS的三大特性

🌟所属专栏:前端只因变凤凰之路🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该系列将持续更新前端的相关学习笔记,欢迎和我一样的小白订阅,一起学习共同进步~👉文章简…

用ChatGPT生成Excel公式,太方便了

ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来,这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」。一经发布,不少网友更是痴迷到通宵熬夜和它对话聊天,就为了探究 ChatGPT 的应用天花板在哪里,经过试探不少人发现&#xff0c…

vue3+vite项目移动端适配:postcss-pxtorem和amfe-flexible

一,定义 postcss-pxtorem PostCSS 的一个插件,可以从像素单位生成 rem 单位。 amfe-flexible amfe-flexible是配置可伸缩布局方案,主要是将1rem设为viewWidth/10。 二,使用 1. 设置 viewport 在 index.html 中: &l…

学生信息表

目录 一、功能说明 二、核心思想 三、所用知识回顾 四、基本框架 五、js功能实现部分 一、功能说明 (1)输入对应的信息,点击录入可以为下面的表格添加一条记录,注意当所填信息不完整时不允许进行提交。 (2&…

UE实现建筑生长(材质遮罩方式)效果

文章目录 1.实现目标2.实现过程2.1 遮罩2.2 生长动画3.参考资料1.实现目标 在UE中实现建筑的生成动画效果,GIF动图如下: 2.实现过程 通过动态设置材质遮罩OpacityMask的参数,即通过材质方式来实现建筑生长效果 2.1 遮罩 现有的教程中大多通过BoxMask-3D材质节点实现,但是…

扫地机器人(蓝桥杯C/C++)

题目描述 小明公司的办公区有一条长长的走廊,由 NN 个方格区域组成,如下图所示。 走廊内部署了 KK 台扫地机器人,其中第 ii 台在第 A_iAi​ 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中,并将该区域清扫干净。…

Linux信号

目录 信号入门 1. 生活角度的信号 2. 技术应用角度的信号 3. 注意 4. 信号概念 5. 用kill -l命令可以察看系统定义的信号列表 6. 信号处理常见方式概览 产生信号 1. 通过终端按键产生信号 2. 调用系统函数向进程发信号 3. 由软件条件产生信号 4. 硬件异常产生信号 核…

DHCP原理简析及交互实践

环境: os:centos7 dnsmasq:version 2.76 一. dhcp工作原理 首先补充几个dhcp相关的基本概念: 1、动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于集中对用…

程序员必会技能—— 使用日志

目录 1、为什么要使用日志 2、自定义日志打印 2.1、在程序中得到日志对象 2.2、使用日志对象打印日志 2.3、日志格式 3、日志的级别 3.1、日志级别的分类 3.2、日志级别的设置 4、持久化日志 5、更简单的日志输出——lombok 5.1、如何在已经创建好的SpringBoot项目中添加…

Python+ChatGPT实战之进行游戏运营数据分析

文章目录一、数据二、目标三、解决方案1. DAU2. 用户等级分布3. 付费率4. 收入情况5. 付费用户的ARPU最近ChatGPT蛮火的,今天试着让ta写了一篇数据分析实战案例,大家来评价一下!一、数据 您的团队已经为您提供了一些游戏数据,包括…

MySQL数据库的基础语法总结(1)

MySql一.数据库,数据表的基本操作1.数据库的基本操作2. 数据表的基本操作2.1 数据库的数据类型2.1.1 整数类型2.1.2 浮点数类型和定点数类型2.1.3 字符串类型2.1.4 日期与时间类型2.2 数据表的基本操作2.2.1 创建一个数据表2.2.2 查看数据表2.2.3 查看表的基本信息的MySQL指令2…

【拳打蓝桥杯】最基础的数组你真的掌握了吗?

文章目录一:数组理论基础二:数组这种数据结构的优点和缺点是什么?三:数组是如何实现随机访问的呢?四:低效的“插入”和“删除”原因在哪里?五:实战解题1. 移除元素暴力解法双指针法2…

前端开发神器VS Code安装教程

✅作者简介:CSDN一位小博主,正在学习前端 📃个人主页:白月光777的CSDN博客 💬个人格言:但行好事,莫问前程 安装VS CodeVS Code简介VS Code安装VS Code汉化结束语💡💡&…

嵌入式学习笔记——STM32的USART收发字符串及串口中断

USART收发字符串及串口中断前言字符串的收发发送一个字符串接收字符串需求利用串口实现printf中断中断是什么前言 上一篇中,介绍了串口收发相关的寄存器,通过代码实现了一个字节的收发,本文接着上面的内容,通过功能函数实现字符串…

Elasticsearch:集群管理

在今天的文章中,我们应该学习如何管理我们的集群。 备份和分片分配是我们应该能够执行的基本任务。 分片分配过滤 Elasticsearch 将索引配到一个或多个分片中,我们可以将这些分片保存在特定的集群节点中。 例如,假设你有多个数据集群节点&am…

项目实战-瑞吉外卖day02(B站)持续更新

瑞吉外卖-Day02课程内容完善登录功能新增员工员工信息分页查询启用/禁用员工账号编辑员工信息分析前端页面效果是如何实现的为什么点击左边 右边会根着变化首先 我们先来看一下菜单是如何展示出来的 在来看一下 为啥点击菜单时 右边会跟着变第一 :菜单是如何展示出来…

【剑指offer-C++】JZ32:从上往下打印二叉树

题目描述 描述:不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数…