HaveFunWithEmbeddedSystem/Chapter4_数据结构、算法与设计模式/4.1_工具与思想.md

4.5 KiB
Raw Blame History

4.1 工具与思想

4.1.1 工具与思想

在之前的课程中,我们学习了计算机编程语言以及用于团队协作的软件。这些都是进行软件开发所必备的,或有助于进行软件开发的工具。有了工具,就可以制造不同的软件产品出来,就好比有了榔头、螺丝刀、加工车床等就可以制造汽车一样。

虽然工具是相同的,但是想法可以是不同的,因此可以设计和制造出不同的产品。同样的汽车生产线,可以生产出不同型号的汽车,这是因为设计图纸不同。在软件上,即便是需求相同,也仍然可以采用不同的思想去设计,最终体现在了软件设计方案上。软件的总体结构、各部分的实现算法、数据结构以及设计模式是软件思想的主要内容,也是软件设计方案的中的重要组成部分。

随着计算机和软件开发技术的发展,软件开发思想也在不断的演变,形成了一整套的设计模式、算法模式和分析模式。可以将其理解为软件开发的套路。更重要的是,这些方法,有助于分析和解决软件问题,优化计算机系统,提高代码质量和可靠性。

4.1.2 数据结构、算法与设计模式

计算机算法有很多内容,比如针对数据进行的排序、查找、添加、删除。当然,还可以有积分、微分、插值和拟合等算法。不同的算法有不同的应用领域,但通常,算法都与数据结构紧密结合。例如以数组为基础实现二分查找算法,但数组容量有限,如果需要动态增减数据内容并且达到类似二分查找的效果,则可以使用二叉树,而二叉树的索引和构造方式又与数组不同。

除了这些带有“计算”性质的算法和数据结构外,还有一些用于解决工程问题的设计模式。例如单件模式和工厂模式等,这些有迹可循的并且可以被应用于许多类似场合下的设计方案,被称作设计模式。由于这些方案已经比较成熟,并且充分的考虑了软件质量等其他问题,因此,在合适的场合下使用这些设计模式,可以有效的简化项目。

4.1.3 算法的好坏

我们评估一种算法的优劣,可以使用它的时间复杂度和空间复杂度来衡量。时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。如果不作特殊说明,我们一般讨论的是在最坏情况下,该算法的时间复杂度和空间复杂度。

在电影《模仿游戏》中,图灵机必须在极其有限的时间内破解德军使用的密码,否则德军就会更换新的密码,这体现了算法空间复杂度的重要性。由于很多情况下,关注算法的时间复杂度要大于算法的空间复杂度,因此本文只给出各算法的时间复杂度,空间复杂度留给个人学习。当然,这并不意味空间复杂度并不重要,相反,在很多重要场合,人们对算法的空间要求也是极为苛刻的。

可以使用 大O 表示法来度量算法的时间成本。例如从头到尾顺序访问一个数组中全部元素算法的时间复杂度是 O(N)。如果为了求解某问题A 算法的时间复杂度是 O(N),而 B 算法的时间复杂度是 O(N^2),则在求解该问题时,算法 A 要快过算法 B。

大O 表示法的好处是忽略了个体及环境的差异,并且以非常直观的方式展现了算法对时间的消耗。具体来讲,如果某个非常简单的算法 A在老式的 奔腾I 上运行需要一周,而另一个非常复杂的算法 B 在现在计算机集群系统上运行只需要半周,我们是否能说算法 B 快于算法 A我们来看看 大O 表示法是怎样做的,仍然以数组查找为例,在最坏的情况下,要查找长度为 N 的数组中的某个元素,我们需要遍历整个数组,因此需要 N 步来完成,这个算法的时间复杂度便是 O(N)。大O 表示法并没有要求这个算法运行在怎样的计算机环境下没有要求处理器的性能也忽略了每一步具体由多少个子方法、语句或指令构成更忽略了执行这一步骤所需的时间长度。大O 表示法摒除了那些与影响算法时间无关的参数,剩下的其实只是执行算法所需的步骤数,这便是描述算法时间成本的核心。

4.1.4 常用设计模式

练习

如果完成某算法需要 N 大步,完成每一大步需要 N 小步,那么这个算法的时间复杂度是多少?