认识数据结构

    作为程序开发人员,数据结构是不可或缺的要熟悉的知识,下面简单总结一下数据结构的资料和自己的理解,希望可以对大家有所帮助。

前言

    数据结构是计算机存储和组织数据的方式,它可以看成一个数据元素的集合,并且其中数据元素之间存在一种或多种特定的关系,通常情况下精心选择的数据结构可以带来更高效的运行或者存储效率,并且往往伴随的是高效的检索算法和索引技术。

定义

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

研究结构

数据的逻辑结构

    反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的关系,而与他们在计算机中的存储位置无关。逻辑结构包括:
    1.集合:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
    2.线性结构:数据结构中的元素存在一对一的相互关系;
    3.树形结构:数据结构中的元素存在一对多的相互关系;
    4.图形结构:数据结构中的元素存在多对多的相互关系。

数据的物理结构

    数据的物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构
    数据元素的机内表示(映像方法): 用二进制位(bit)的位串表示数据元素。通常称这种位串为节点(node)。当数据元素有若干个数据项组成时,位串中与个数据项对应的子位串称为数据域(data field)。因此,节点是数据元素的机内表示(或机内映像)
    关系的机内表示(映像方法):数据元素之间的关系的机内表示可以分为顺序映像和非顺序映像,顺序映像借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系(例如一排座位要对号入座,每个座位都有自己的位置信息,座位之间有一种顺序关系)。非顺序映像借助指示元素存储位置的指针(pointer)来表示数据元素之间的逻辑关系。

数据的储存结构

    数据的逻辑结构在计算机存储空间中的存放形式。一般来说,一种数据结构的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序存储、链式存储、索引存储和哈希存储等。

结构分类

    数据结构有很多种,一般来说,按照数据的逻辑结构对其进行简单的分类,包括线性结构和非线性结构两类。

线性结构

    简单地说,线性结构就是表中各个结点具有线性关系。如果从数据结构的语言来描述,线性结构应该包括如下几点:
    1、线性结构是非空集。
    2、线性结构有且仅有一个开始结点和一个终端结点。
    3、线性结构所有结点都最多只有一个直接前趋结点和一个直接后继结点。
    线性表就是典型的线性结构,还有栈、队列和串等都属于线性结构。
    举个例子:贪吃蛇,本身为几个集合,身体每一节视为一个元素,本身至少有一节也就是不能为空集,仅有一个头部和尾部也就是一个开始结点和终端结点,每一节身子最多只有一个前趋结点和一个后继结点,本身不能闭环,闭环即失败也就是错误。

非线性结构

    简单地说,非线性结构就是表中各个结点之间具有多个对应关系。如果从数据结构的语言来描述,非线性结构应该包括如下几点:
    1、非线性结构是非空集。
    2、非线性结构的一个结点可能有多个直接前趋结点和多个直接后继结点。
    3、在实际应用中,数组、广义表、树结构和图结构等数据结构都属于非线性结构。
    举个例子:地理位置划分,中国有几十个省,每个省有几十个城市,每个城市分几个区,每个区里几个乡镇,每个乡镇几个村。

常用的数据结构

    在计算机科学的发展过程中,数据结构也随之发展。程序设计中常用的数据结构包括如下几个,如下图:
数据结构图

数组(Array)

    数组是一种聚合数据类型,它是将具有相同类型的若干元素有序地组织在一起的集合。数组可以说是最基本的数据结构,在各种编程语言中都有对应。一个数组可以分解为多个数组元素,按照数据元素的类型,数组可以分为整型数组、字符型数组、浮点型数组、指针数组和结构数组等。数组还可以有一维、二维以及多维等表现形式(即数组中每一个元素也是一个数组)。
    例如:体育比赛分男女项目,男人放一组,女人放一组,男人和女人分别形成一个数组。
数组

栈( Stack)

    栈是一种特殊的线性结构,它只能在一个固定端进行数据结点的插入和删除操作,这一端被称为栈顶,相对的另外一端被称为栈底。向一个栈插入新元素被称为入栈、进栈或者压栈,从栈中删除元素称为出栈或者退栈。栈按照后进先出的原则来存储数据,也就是说,先插入的数据将被压入栈底,最后插入的数据在栈顶,读出数据时,从栈顶开始逐个读出。栈中没有数据时,称为空栈。
    例如:往羽毛球筒里装羽毛球,只能从一个入口装,先装的滑到最底部,后装的在上面,每次取羽毛球总是后装进来的先被取出。当所有的羽毛球都取出来,即为空筒(空栈)。
栈

队列(Queue)

    队列和栈类似。和栈不同的是,队列只允许在一端进行插入操作,而在另一端进行删除操作。即先进先出原则。一般来说,进行插入操作的一端称为队尾,进行删除操作的一端称为队头。队列中没有元素时,称为空队列。如下图所示:初始为空队列,ABC以此进队,出队的时候A先出,BC随后出队,全部出队后又恢复为空队列。
    例如:游乐场项目排队的时候,先排队的先进场,后排队的后进场,在整个队伍中先加入排队的先出来,即先进先出。
队列

链表( Linked List)

    链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。链表由一系列数据结点构成,每个数据结点包括数据域和指针域两部分。其中,指针域保存了数据结构中下一个元素存放的地址。链表结构中数据元素的逻辑顺序是通过链表中的指针链接次序来实现的。如下图所示每一个数据结点的指针域指向下一个数据结点,直至无结点可指向。插入元素p1的时候,直接把p3的指针域指向p1,把p1的指针域指向p2,完成插入操作
链表

树( Tree)

    树是典型的非线性结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。没有元素称为空树。它具有以下的特点:
    每个节点有零个或多个子节点;
    没有父节点的节点称为根节点;
    每一个非根节点有且只有一个父节点;
    除了根节点外,每个子节点可以视为多个不相交的子树;

    按照分类划分为种类,以下几种最为常见:
    无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;
    有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;
    二叉树:每个节点最多含有两个子节点的树称为二叉树;
    完全二叉树:若设二叉树的深度为h(层次),除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
    满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。国外定义:如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。
完全二叉树

图(Graph)

    图是另一种非线性数据结构。实际生活中有很多例子,比如交通运输网,地铁网络。顶点和边构成图结构,每一个顶点就是一个元素,所有的顶点构成一个顶点集合,所有的边构成边的集合,一个完整的图结构就是由顶点集合和边集合组成。图结构在数学上记为以下形式:
    G=(V,E) 或者 G=(V(G),E(G))
    如下图所示分为有向图和无向图。
    无向图:顶点之间的边没有指向的图。
    无向完全图:在一个无向图中任何两个顶点之间都有连线
    有向图:图的顶点之间指明的方向关系。
    有向完全图:在一个有向图中任何两个顶点之间都存在方向相反的两条边。
    有向无环图:在一个有向图中,从任意一个顶点沿着边的方向出发,都不能回到出发点的图。
无向图有向图无向完全图有向完全图有向无环图

堆(Heap)

    堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。堆的特点是根结点的值是所有结点中最小的或者最大的,并且根结点的两个子树也是一个堆结构。如下图(黑色数字为序号,红色数字为元素的值):
在这里插入图片描述

散列表(Hash)

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
    例如:电视剧中的杀手组织,每个新进的队员都有自己的代号,组织中几乎不会出现相同的代号,招人办事的时候以代号接收任务。

结尾

    目前就整理到这里了,感谢观看到此处的老铁。

发布了6 篇原创文章 · 获赞 6 · 访问量 662

猜你喜欢

转载自blog.csdn.net/huangggf/article/details/103655512