美文网首页@IT·互联网
重新认识数据结构(一)- 从数据结构与算法的关系谈起

重新认识数据结构(一)- 从数据结构与算法的关系谈起

作者: Chanze | 来源:发表于2020-07-14 17:58 被阅读0次

    前言

    在本科学习有关数据结构时,对数据结构的认识总是浮于表面,没有仔细探究也不曾做过相关知识的整理。随着开发经验和学习的不断深入,越发觉得数据结构基础知识的重要性,所以特开这一专栏,争取每周更新一篇文章,对数据结构及算法的相关知识整理和复习。

    数据结构的定义

    首先贴上一段百度百科对数据结构的定义:

    数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构存储结构
    数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构
    数据结构的研究内容是构造复杂软件系统的基础,它的核心技术是分解与抽象。通过分解可以划分出数据的3个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构。类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义。上述两个方面的结合可以将问题变换为数据结构。这是一个从具体(即具体问题)到抽象(即数据结构)的过程。然后,通过增加对实现细节的考虑进一步得到存储结构和实现运算,从而完成设计任务。这是一个从抽象(即数据结构)到具体(即具体实现)的过程。

    简单来讲,数据结构就是在计算机领域中,用来存储和组织数据的一种结构。我们可以在这个结构上制定一些规则(也可以说是存储在这个结构上的数据之间的关系),比如我们可以规定栈这一种数据结构的添加和删除规则为“先进后出”,只能从栈顶添加和删除数据,但其实在很多实现上,我们完全可以在其他地方进行添加和删除,只是我们自己在这个定义(或者说编写这一数据结构代码)的时候,规定了对它进行操作的规则(一系列操作的方法),于是我们就可以实现栈这种先进后出的数据结构,来适用我们具体的业务需求。

    算法的定义

    百度百科对算法的定义:

    算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

    简而言之,算法是解决问题的一种策略方法。同时算法需要具备以下特性:
    1. 有零个或多个输入,至少有一个输出。
    2. 有穷性。即算法需要在有限个步骤内完成计算,而不能无限循环。
    3. 确定性。算法的每一个步骤都有确定的含义,不会出现二义性。
    4. 可行性。算法的每一个步骤必须可行,即都能通过有限的步数完成。

    思考:到目前为止,我们已经简单了解了什么是数据结构、什么是算法,那么两者之间到底有什么关系呢?为什么很多文献资料和教材经常把两者合并起来描述呢?

    数据结构与算法之间的关系

    如果之前有相关学习经历的同学应该有这样的经历,在学习算法或者数据结构的时候经常会涉及到另一方面的知识,那么两者到底是什么关系呢?下面我们就细细道来。
    首先我们先从一个比较抽象的层面来描述两者的关系:简单来说,数据结构算法操作的对象,算法则是数据结构具体的操作。两者既可以是两个独立的知识点,但在运用上和学习上,两者的关系却紧密联系在一起。

    前面我们学到,算法是解决问题的一种方法策略。但是我们知道算法是有优劣之分的,同时你很难说某一种算法就是绝对的好算法,某一种算法就是绝对的差算法。每种算法都有它适合的场景和不适合的场景,需要我们根据具体业务需求来制定合适的算法。(不然我们直接学习那种最好的算法就好了)。那么在制定合适的算法的时候,经常就需要综合考虑到相关的数据结构的问题。比如你接到一个需求,是要在一个有序的序列中查找某个值。这个时候可能你会很自然地想到用二分查找,因为二分查找是一种查找效率很高的算法,算法的时间复杂度是logN。那么它并不适合所有场景,比如如果原始数据无序,那么就不能使用二分查找。

    OK现在的业务场景非常适合选用二分查找算法来达到业务需求,那么这个时候就要选择合适的数据结构来做我们操作的对象了,通过需求我们知道只需要我们进行查找,而不需要进行添加删除等操作,根据这样的特性,我们选择最合适的数组这一数据结构来做操作对象即可。

    那我们现在把需求变更一下,需要在一个有序的序列中查找某个值,并在这个值的前面添加一个值。现在这个需求已经变成了查找+添加,不再是简单的查找。还是照着我们之前的流程,首先由于原始数据依然是一个有序的序列,那么我们依然可以采用二分的思想,但是二分查找是在顺序表上进行操作,我们知道顺序表比较适合查找但不适合添加和删除,因为需要频繁移动数据,添加时间复杂度为O(N),所以需要在选择的数据结构上做一定的改变,在这里我们可以选择二叉搜索树来作为我们要操作的数据结构,应用到这一场景中。

    从上面的分析过程我们应该能够了解到选择合适的数据结构是可以为算法的具体应用场景做适配的。

    总结:简而言之,算法是思想,一种思考的方向。而数据结构是具体的存储媒介。在我们日常开发中,是运用我们的算法思想,来操纵合适的数据结构。两者配合来让我们的程序跑起来。选用合适的算法和合适的数据结构可以有效地提高我们程序的性能。

    好啦,关于数据结构与算法的关系,我们就先简单了解到这里,随着后面的学习,我们也会慢慢更加深入体会到两者之间关系。

    本人是一名正在努力成长的程序员,写的文章可能会存在一些自己理解的误差或不够透彻的地方,欢迎大家的指正。同时希望大家带着批判的观点来观看,希望与朋友们一同学习与成长。谢谢!

    相关文章

      网友评论

        本文标题:重新认识数据结构(一)- 从数据结构与算法的关系谈起

        本文链接:https://www.haomeiwen.com/subject/melacktx.html