从远古的汇编语言到现代编程语言,计算机编程已经变得更加强大、高效和先进。然而,计算机编程中的数据结构和算法的核心概念和使用并没有改变。从一开始,DSA
就一直是计算机编程的核心。
备注: 下文统一使用
DSA
表示数据结构和算法。
你可能听说过DSA主要在计算机科学领域使用。然而,DSA的使用并不限于计算机领域。我们可以发现DSA的概念在日常生活中也被使用。在本文,我们将讨论日常生活中使用的DSA常见场景。但在此之前,让我们先了解一下数据结构和算法的基本知识。
数据结构和算法是计算机科学的一个分支,涉及到机器的效率和优化计算机程序。术语数据结构指的是数据的存储和组织,而算法指的是解决问题的步骤。通过结合 "数据结构"和 “算法”,我们在软件工程中优化代码的占用空间及执行效率。
数据结构和算法(DSA)被应用于软件开发的所有学科。DSA是软件开发过程的组成部分。它并不局限于单一的编程语言。尽管编程语言随着时间的推移而发展或沉寂,但DSA被纳入所有这些语言中。
软件开发的效率取决于选择一个合适的数据结构和算法。
可能会有这样的情况,即为你提供了最有效的数据结构来与一个强大的算法合作。但是,如果两者不能相互兼容,代码就不会产生预期的结果。因此,为一个算法选择一个合适的数据结构是软件开发的一个重要部分。
软件开发中使用DSA的另一个关键方面是时间和空间限制。这些约束条件检查算法的时间和空间的可用性。一个优化的算法根据资源的可用性来解决这两个约束。如果内存对硬件来说不是一个问题,那么DSA更注重优化算法的运行时间。同样地,如果硬件有这两个约束,那么DSA必须解决这两个约束。你可以在渐近分析上了解更多关于这些复杂性的表述。
让我们深入了解一些使用DSA的例子。
一个栈是一个线性数据结构,"线性"意味着元素是一个接一个地放置。一个元素只有在访问了前面的元素之后才能被访问。
我们可以把栈想象成一堆放在彼此上面的盘子。在最上面的盘子下面的每个盘子都不能直接访问,直到上面的盘子被移除。盘子只能从顶部添加和移除。
每个盘子都是一个元素,堆在一起组成一个栈。在编程方面,盘子是一个变量,而栈是一个数据结构。
你可能会想,为什么一个程序员需要学习如何把盘子放在一个栈上,并把盘子从栈里拿出来。让我们来找出答案。假设你需要将一个字符串反转顺序,你会怎么做呢?
开始从字符串中选择一个字符,然后一个一个地复制到新的位置,过程如下:
现在,让我们把这些字符从顶部复制到原来的位置:
很好,我们已经成功地使用栈(新内存)的属性反转了一个字符串。插入和删除只允许从顶部开始。这就是栈在编程中的使用方法。
队列也是一种线性数据结构,其中的元素是根据先进先出(FIFO)规则来排列的。它就像站在队列中的乘客要登上一辆公共汽车。第一个进入队列的人就是第一个上车的人。新乘客可以从后面加入队列,而乘客则从前面上车。
你可能会问,计算机上的队列是在哪里使用的?假设你在办公室里,有一个由五台计算机组成的网络。你将所有这些计算机连接到一台打印机上。假设一个员工想打印他的文件,并通过他的电脑向打印机发送了一个命令。打印机收到命令并开始打印文件。同时,另一个员工也向打印机发送了命令。打印机将第二条命令放到队列中。第二条命令只有在第一条命令执行后才会被执行。这遵循了先进先出的规则。
图是一个由相互连接的顶点组成的网络。每个顶点被称为一个节点,它们之间的连接被称为边。
你可能使用社交媒体,如微博、朋友圈、快手等。社交媒体是使用图的一个很好的例子。社交媒体使用图来存储每个用户的信息。在这里,每个用户都是一个节点,就像在图中一样。而且,如果一个用户,我们叫他小王,与另一个用户小红成为朋友,那么小王和小红之间就存在一条边(连接)。同样,我们与人的联系越多,图的节点和边就会不断增加。
同样地,地图是另一个使用图数据结构的例子。在谷歌地图中,每个地点都被视为节点,而地点之间的道路被视为边。而且,当一个人要从一个地方移动到另一个地方时,谷歌地图使用各种基于图的算法来寻找最短路径。我们将在本文后面讨论这个问题。
简单地说,排序是一个系统地安排类似物品的过程。例如,假设你正在根据书的高度安排书架上的书。在这种情况下,我们可以把较高的书放在左边,然后是较矮的书,或者反过来也可以这样做。
这个概念也是在排序算法中实现的。在DSA中存在不同的排序算法。尽管每一种算法的目的都是一样的,但每一种算法都根据不同的标准以不同的方式工作。
在上面的例子中,如果我们想尽可能快地对书籍进行排序,那么有几点需要考虑。
算法的建立要考虑到所有这些限制,以产生一个最佳的解决方案。根据不同的排序特点,有以下常见的排序算法:
搜索,顾名思义,寻找一个项目。
假设你想在书架上搜索一本特定的书。自身的书没有以特定的方式排列。如果你需要在最短的时间内找到这本书,你会怎么做?DSA提供了这方面的解决方案。
你可能会想:“我将从头开始寻找这本书并将其定位”。在这种情况下,你将从书架的起点到终点逐一搜索书籍。这个概念在线性搜索中也有实现。
但是,如果这本书在书架的另一端呢?上述过程可能需要很长的时间,而且不会提供一个可行的解决方案。
现在,让我们尝试另一个程序。首先,按字母升序对书籍进行排序,然后搜索中间的书。我们正在搜索一本以J开头的书。
因为我们总是在看中间位置,所以A和Z之间的中间位置是M,而不是J。
现在,将J与M进行比较,我们知道J位于M之前。因此,我们开始在A和M的中间位置寻找J。
由于J位于G和M之间,让我们找到它们之间的中间元素。是的,我们已经找到了J,恭喜你!!!。.
而且,你刚刚实现了二分搜索。
你有没有想过,谷歌地图是如何向你展示通往目的地的最短路径的?像谷歌地图这样的应用程序能够通过一类被称为最短路径搜索算法来实现这一需求。
这些算法处理的是寻找图中的最短路径。就像上面在图数据结构中讨论的例子一样,我们可以用图算法来寻找地图上两个给定地点之间的最短路径。
为了说明这个问题,让我们在以下地图中找出A和F之间的最短距离。
这个问题的可能解决方案是什么?让我们来计算一下可能的路线以及它们的路径长度。
我们可以看到,最短的路径是路径3。但是,我们也浪费了计算其他路径的时间,我们不打算使用这些路径。为了在不浪费时间的情况下解决这个问题,我们可以从A开始,检查可能的最短邻接路径(AC和AB)。我们有AC作为最短路径。
现在我们在C处,再次选择其相邻路径CE和CD中最短的路径,即CD。
从D出发,我们有一条通往F的路径。从D出发,我们也可以去B,但是,B已经被访问过了,所以不考虑它。选择路径DF,我们就能到达目的地。
再一次恭喜你。你已经实现了Dijkstra的算法。这样一来,图就在我们的生活中找到了它的用途。
当我在本科的最后一年开始四处找工作时,所有公司的招聘都有一个共同点:喜欢用数据结构和算法问题来面试候选人编程能力。DSA在软件公司的招聘过程中也有很大的重要性。招聘人员使用DSA来测试程序员的能力,因为它显示了候选人的问题解决能力。
从上面的例子可以看出,我们能够将DSA与我们的日常生活联系起来,使它的学习更加有趣。对于那些非技术背景的人来说,他们也可以学习算法中的技术来解决他们的日常问题。
此外,人们不能忽视DSA在任何编程语言中的重要性。DSA从未灭绝,相反,它在不断发展,因为在21世纪,不断发展的计算机需要不断发展的算法来解决一个复杂的问题。
更不用说,一个程序员应该知道如何在正确的算法中使用适当的数据结构。有一句名言:
战士不应仅仅拥有武器,他必须知道何时以及如何使用!
希望本文对你有所启发,在数据结构与算法的路上越走越远!
从今天起,开始你的数据结构与算法之旅 !
pythontip 出品,Happy Coding!
公众号: 夸克编程