数据结构与算法对嵌入式来说能有(zhuan)用(qian)吗

这篇不是写技术细节的,而是在之前学过的排序算法以及部分其它的数据结构与算法之后,个人的一些感觉,主要包括两个方面:怎么去学习这些枯燥的东西?学习这个到底有没有用?

遥想当年,在我还年轻的时候,接触过一次数学建模比赛,那个时候是帮别个某人做的,我自己并没有报名参加,那个时候算是第一次比较细节的接触了算法的内容,我还很清楚的记得题目他们选的是:在一个给定的超大规模 DNA 序列里面查找给定任意长度的子 DNA 序列值。

当时并没有接触 AC 模式匹配等等高级点的算法,仅是用了通常都能够想到的 KMP 算法来去暴力匹配,根本没有建立索引的过程,最后只给他们拿了个省二,不过我觉得我尽力了。细节略去不讲,在实现这个查找代码的过程中我真切感受到了算法的魔力,彼时我的编程能力还不强,对于 KMP 算法里面的 next 数组的建立简直是一脸懵逼,看到代码一直都是 WTF,这也可以?所以,这怎么就能求出来 next 数组了呢?诸如此类。

我的专业是电子信息工程,平时接触更多的是信息论与编码、数字信号处理这一类的科目,属于比较靠近图像信号处理与传输这块,对于数据结构与算法其实并没有多少涉及,并且平时做的东西也涉及不到那些经典的计算机科目的数据结构与算法,所以也就是惊鸿一瞥罢了。

现在我的编程能力与儿时相比,有了长足的进步,然而我还是不知道那个 next 数组怎么编程实现的哈,下一个章节「查找」就可以再次接触到这个算法的细节以及编程实现了。数据结构与算法的学习我觉得前期就分为两个步骤:

  1. 理解算法的原理。
  2. 用代码去实现它。

就这么简单,再往后可能会涉及到你应该知道这些东西都用在什么地方,应该知道如何把算法集成在实际的软件开发项目当中去,知道如何在大规模的数据模型中去应用这些算法,知道如何取舍,那个阶段我现在没有条件去实践,现在也没有必要去做。

理解算法的原理算是比较抽象的一步了,很多算法都是很抽象的,需要从数学逻辑上出发,去论证、证明。对于算法的原理,一定要达到「理解」的程度,要做到没有任何盲点,而不是仅凭记忆来生硬复述一段算法的原理。重点是每一种算法背后的思想,基本上来讲,每种算法背后的思想都能够用一段非常简短的语言来描述,然后再是深入到算法思想背后的一些细节。

比如快速排序、归并排序,完全就可以用两个词来描述它们的基础思想「分治、递归」,最简单的冒泡排序、插入排序基本思想就是「比较、交换」,基于其改进的希尔排序、鸡尾酒排序、梳排序等都是一些附加的优化手段。理解了基本的思想,原理细节通过舔砖加瓦的形式就可以慢慢的完善,这个过程对于理解掌握是非常重要的,我们的大脑更习惯于寻根溯源、顺藤摸瓜嘛。

后面的查找、树、图等算法会变的越来越复杂,但是其背后的思想依然都是寥寥几个句子就可以描述的,区别在于原理性的描述、编码的实现细节复杂度有所不同。

代码的实现也是非常重要的一环,就拿快速排序来讲,之前我不看代码自己是没有办法去实现一个成型的快排代码的,甚至还要靠死记硬背,但是现在我不需要记忆代码,因为它的原理我很清楚,我把原理翻译成代码也没有困难。这取决于对编程语言的应用熟练度,做到从算法原理到代码的翻译需要大量代码编写经验的积累,熟知数组、链表、栈等等概念结构与其代码实现。

然而有些数据结构比如红黑树,靠自己的理解实现代码也不是说不行,就是你需要耗费极其多的精力与时间去完成,这种属于极难的原理到代码转换的例子了。对于这种来说,还是尽量多领会原理吧,自己从头推到尾再加上去实现一番感觉性价比不高。

另外,作为嵌入式的行业,学习这个到底有没有用呢?我个人经验是觉得有用的,而且我觉得这个取决于个人,对于有的人来讲是有用的,对有的人来讲是没用的。怎么区分呢,我觉得就是看个人的职业规划,有些公司也会要求比较强的数据结构与算法能力,有些岗位也会要求这个。

其实未来软件的发展趋势来讲,数据结构与算法会越来越普适,一方面是因为硬件的不断升级,使得很多嵌入式系统现在已经与桌面系统的区别越来越小,可以跑更多的软件平台,使得数据结构与算法可以有更宽阔的应用场景。另一方面,即使是嵌入式设备,其软件功能需求也在不断的升级,很多嵌入式平台应用了越来越多的视觉算法、数据库等等,有些需求的背后也是需要数据结构与算法做支撑的。

我个人从技术角度的理解是,未来的软件会更多的往数据结构与算法上面靠拢,这些东西会渗透到软件代码的方方面面。从另一个角度来讲,就算是最终还是没有原原本本的把整个算法应用到平时的开发过程当中去,学习这些东西的过程中也会给自己带来更多的思考、更开阔的思维,这点是我自己切身实践体验出来的。

所以,我觉得,对于想钻研技术、职业发展想往技术方向走的人来讲,数据结构与算法是绝对有用的东西,即使是对于嵌入式我也可以肯定。我个人的性格让我目前为止,职业规划一直朝着纯技术的方向在推进,我喜欢「思考、钻研、开发、解决」的那种感觉,我喜欢不断接触新技术,新知识,并应用于日常开发的那种感觉,也喜欢不断迎接挑战的那种压迫感和激动的感觉。

但是对于计算机类的特定算法,比如搜索类的、地图求最短、最优路径之类的,在嵌入式里面确实怎么都不太可能用得到,这些可以作为拓展思考用,但是图、红黑树、二叉树、字符匹配、查找、堆等等都是真真正正能够用得到的东西,需要慢慢渗透掌握。

该是时间开启查找这个新的篇目了。


想做的事情就去做吧
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值