1.  啥是数据结构


    数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关,明确几个概念。

    数据:对客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。

上面场景中的注册信息,就是数据。数据库中存储的用户记录,那也是数据没跑了。

     数据项:数据项是数据的不可分割的最小单位。

     数据对象:性质相同的数据元素的集合,是数据的一个子集。



2.   数据结构有哪些



【编程扫盲--数据结构】_java

数组(Array)

    数组是最简单、也是使用最广泛的数据结构。栈、队列等其他数据结构均由数组演变而来。下图是一个包含元素(1,2,3和4)的简单数组,数组长度为4。

    每个数据元素都关联一个正数值,我们称之为索引,它表明数组中每个元素所在的位置。大部分语言将初始索引定义为零。

【编程扫盲--数据结构】_java_02

栈( Stack)

    著名的撤销操作几乎遍布任意一个应用。但你有没有思考过它是如何工作的呢?这个问题的解决思路是按照将最后的状态排列在先的顺序,在内存中存储历史工作状态(当然,它会受限于一定的数量)。这没办法用数组实现。但有了栈,这就变得非常方便了。可以把栈想象成一列垂直堆放的书。为了拿到中间的书,你需要移除放置在这上面的所有书。这就是LIFO(后进先出)的工作原理。

 

【编程扫盲--数据结构】_java_03

队列(Queue)

    队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO(后进先出),而队列是FIFO,即先进先出。一个完美的队列现实例子:售票亭排队队伍。如果有新人加入,他需要到队尾去排队,而非队首——排在前面的人会先拿到票,然后离开队伍。

【编程扫盲--数据结构】_java_04

链表( Linked List)

    链表是另一个重要的线性数据结构,乍一看可能有点像数组,但在内存分配、内部结构以及数据插入和删除的基本操作方面均有所不同。链表就像一个节点链,其中每个节点包含着数据和指向后续节点的指针。 链表还包含一个头指针,它指向链表的第一个元素,但当列表为空时,它指向null或无具体内容。链表一般用于实现文件系统、哈希表和邻接表。


【编程扫盲--数据结构】_java_05

树( Tree)

    树形结构是一种层级式的数据结构,由顶点(节点)和连接它们的边组成。 树类似于图,但区分树和图的重要特征是树中不存在环路。树形结构被广泛应用于人工智能和复杂算法,它可以提供解决问题的有效存储机制。


【编程扫盲--数据结构】_java_06

图(Graph)

    图是一组以网络形式相互连接的节点。节点也称为顶点。 一对节点(x,y)称为边(edge),表示顶点x连接到顶点y。边可以包含权重/成本,显示从顶点x到y所需的成本。

【编程扫盲--数据结构】_java_07

堆(Heap)

    堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。堆的特点是根结点的值是所有结点中最小的或者最大的,并且根结点的两个子树也是一个堆结构。

【编程扫盲--数据结构】_java_08

散列表(Hash)

    散列表(也叫哈希表)是一种查找算法,与链表、树等算法不同的是,散列表算法在查找时不需要进行一系列和关键字(关键字是数据元素中某个数据项的值,用以标识一个数据元素)的比较操作。

【编程扫盲--数据结构】_java_09


3.   数据结构常用算法


    数据结构研究的内容:就是如何按一定的逻辑结构,把数据组织起来,并选择适当的存储表示方法把逻辑结构组织好的数据存储到计算机的存储器里。研究的目的是为了更有效的处理数据,提高数据运算效率。数据的运算是定义在数据的逻辑结构上,但运算的具体实现要在存储结构上进行。一般有以下几种常用运算:

    (1)检索。检索就是在数据结构里查找满足一定条件的节点。一般是给定一个某字段的值,找具有该字段值的节点。

    (2)插入。往数据结构晕增加新的节点。

    (3)删除。把指定的结点从数据结构中去掉。

    (4)更新。改变指定节点的一个或多个字段的值。

    (5)排序。把节点按某种指定的顺序重新排列。例如递增或递减。