数据结构和算法(一)

一、数据结构内容介绍

1.1.数据结构和算法的重要性

算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算

1.2.数据结构和算法的关系
1)数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构可以编写出更加漂亮,更加有效率的代码。
2)要学习好数据结构就要多多考虑如何将生活中遇到的问题,用程序去实现解决.
3)程序 = 数据结构 + 算法
4)数据结构是算法的基础. 换言之,想要学好算法,需要把数据结构学到位。

二、基本概念和术语

1、数据(data)—所有能输入到计算机中去的描述客观事物的符号,分为:

数值型数据
      非数值型数据(多媒体信息处理)

2、数据元素(data element)— 数据的基本单位,也称结点(node)或记录(record)
3、数据项(data item)— 有独立含义的数据最小单位,也称域(field)

三者之间的关系:数据 > 数据元素 > 数据项

4、数据对象(Data Object):相同特性数据元素的集合,是数据的一个子集

整数数据对象    N = { 0, ±1, ±2, … }
学生数据对象   学生记录的集合
例:学生表 >  个人记录 >  学号、姓名……
data(数据) > data element(数据元素) > data item(数据项)

5、数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合
数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

三、数据逻辑结构和存储结构

一张图概括

java数据结构中的算法 java数据结构与算法_java数据结构中的算法

四、常见的数据结构

4.1. 栈
1)栈的英文为(stack)
2)栈是一个 先入后出 的有序列表。
3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。
4)允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
5)根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
4.2. 队列

队列是一种 先进先出 的线性表. 在表一端插入,在另一端删除。

1. 定义
      只能在表的一端(队尾)进行插入,在另一端(队头)进行删除运算的线性表
2. 逻辑结构
      与线性表相同,仍为一对一关系
3. 存储结构
      用顺序队列或链队存储均可
4.运算规则
      先进先出(FIFO)
5.实现方式
      关键是编写入队和出队函数,具体实现根据顺序队或链队的不同而不同

线性表有顺序存储链式存储,队列是一种特殊的线性表,同样也存在这两种存储方式。

1、顺序队列的“假溢出”:

java数据结构中的算法 java数据结构与算法_java数据结构中的算法_02


上图中,front指针指向队头元素,rear指针指向队尾元素的下一个位置。图(d)中b、c、d出队后,front指针指向元素e,rear指针在数组外面。假设这个队列的总个数不超过5个,但目前如果接着入队的话,因数组末尾元素已经被占用,再向后加就会产生数组越界的错误,可实际上队列在下标为0、1、2、3的地方还是空闲的,我们把这种现象叫做 “假溢出”

2、循环顺序队列:
所以解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环。我们把队列的这种逻辑上首尾相连的顺序存储结构称为 循环队列

现在问题又来了,我们之前说,空队列时,front指针等于rear指针,那么现在循环队列满的时候,也是front等于rear,那么如何判断循环队列究竟是空的还是满的?有如下办法:

办法1:设置一个标志位flag。初始时置flag=0;每当入队列操作成功就置flag=1;每当出队列操作成功就置flag=0。
      则队列空的判断条件为:rear == front && flag==0;队列满的判断条件为:rear == front && flag==1。

办法2:保留一个元素的存储空间。此时,队列满时的判断条件为  (rear + 1) % maxSize == front;
      队列空的判断条件还是front == rear。

办法3:设计一个计数器count,统计队列中的元素个数。此时,队列满的判断条件为:count > 0 && rear == front ;  
       队列空的判断条件为count == 0。  入队:rear = (rear+ 1) % maxSize;   出队: front = (front + 1) % maxSize;
4.3. 链表

链表通常由一连串节点组成,每个节点包含任意的实例数据(data)和一或两个用来指向上一个/或下一个节点的位置的链接(“links”)

链表(Linked)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
  
单向链表(Single-Linked)

单向链表是链表中结构最简单的。一个单链表的 节点(Node) 分为两个部分,第一个部分(data)保存或者显示关于节点的信息,另一个部分存储下一个节点的地址。最后一个节点存储地址的部分指向空值。

单向链表只可向一个方向遍历,一般查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。而插入一个节点,对于单向链表,我们只提供在链表头插入,只需要将当前插入的节点设置为头节点,next指向原头节点即可。删除一个节点,我们将该节点的上一个节点的next指向该节点的下一个节点。

java数据结构中的算法 java数据结构与算法_java数据结构中的算法_03