数据结构
数据结构是指所有数据元素以及数据元素之间的关系,可以看作是相互之间存在某种特定关系的数据元素的集合。
数据结构包括以下几个方面
(1)数据的逻辑结构:由数据元素之间的逻辑关系构成
(2)数据的存储结构:数据元素及其关系在计算机存储器中的存储表示,也称为数据的物理结构
(3)数据的运算:施加在该数据上的操作
数据
数据是描述客观事物的数和字符的集合。
数据项
数据项是具有独立含义的数据最小单位,也称字段或域
数据元素
数据元素是数据的基本单位
数据对象
是指性质相同的数据元素的的集合,是数据的一个子集
数据类型
数据类型是一组性质相同的值的集合和定义在此集合上的一组操作的总称,是某种程序设计语言中已实现的数据结构。
抽象数据类型
抽象数据类型指的是用户进行软件系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不用考虑计算机的具体存储结构和运算的具体实现算法。
算法
算法是对特定问题求解步骤的描述,是指令的有限序列。其中每一条指令表示计算机的一个或多个操作。
算法的特性
(1)有穷性:算法必须总是在执行有限步后结束,并且每一步都能在有限时间内执行完成。
(2)确定性:算法的每一个输入对应相同的输出,不能有二义性。
(3)可行性:算法中的所有操作必须足够基本,都可以通过有限次基本操作来完成其功能。
(4)有输入:一个算法有零个或多个输入。
(5)有输出:一个算法有一个或多个输出。
算法设计的目标(衡量算法好坏的五大标准)
(1)正确性:要求算法能正确的执行预先规定的功能和性能要求,这是最基本也是最重要的一点。
(2)健壮性:要求算法具有很好的容错性,即提供异常处理。
(3)可使用性:要求算法能够很方便的使用。
(4)可读性:算法应该使人易于理解,也就是可读性好。
(5)高效率与低储存量需求。
队列
队列简称队,是一种操作受限的线性表,其限制仅允许在一端进行插入操作,在另一端进行删除操作。进行插入操作的一端称为队尾,插入新元素的操作称为入队或进队,新元素入队后便成为新的队尾元素。进行删除操作的一端称为队首或队头,队中删除元素的操作称为出队或离队,一个元素出队后其直接后继元素便成为新的队首元素。
队列的特点是“先进先出”,即先进队的先出队,因此也被称为先进先出表。
广义表的特性
(1)广义表中的数据元素是具有相对次序的
(2)广义表的长度定义为最外层包含的元素个数
(3)广义表的深度定义为所含括弧的重数
(4)广义表可以共享,一个广义表可以被其他广义表共享,这种共享的广义表称为再入表
(5)广义表可以是一个递归表,一个广义表可以是自己的子表,这种广义表称为递归表。递归表的深度是无穷的,而长度是有限值。
线性结构的概念
线性结构表示该结构中数据元素之间具有一对一的关系,其特点是开始元素与终端元素是唯一的,除了开始元素与终端元素以外,其余每个元素有且仅有一个前驱元素,有且仅有一个后继元素。线性表便是典型的线性结构。
树形结构的概念
树形结构表示该结构中数据元素之间具有一对多的关系,其特点是除了开始元素以外其余每个元素有且仅有一个前驱元素,除了终端元素以外其余元素有一个或多个后继元素。二叉树便是典型的树形结构。
图形结构的概念
图形结构指的是该结构中的数据元素之间存在多对多的关系。其特点是每个元素的前驱元素和后继元素的个数可以是任意的,因此图形结构可能没有开始元素和终端元素,也可能有多个开始元素和多个终端元素。
串的定义
串是由零个或多个字符组成的有限序列。含零个字符的串称为空串,用∅表示。串中所含字符的个数称为串的长度(或串长)。通常将一个串表示为“a1,a2,…,an”的形式,其中最外边的双引号(或单引号)不是串的内容,它们是串的标志用以将串与标识符(如变量名)区分开来。
两个串当它们的长度相同且各个对应位置上的字符也相同时,这两个串相等。
一个串中任意个连续字符组成的序列称为该串的子串。
空串是不包含任何字符的串,其长度为0,空串是任何串的子串。
简述顺序表和链表储存方式的特点
顺序表的特点是可以随机存取元素,存储密度高;缺点是不便于插入和删除元素(需要移动大量元素)。链表的优点是便于节点的插入和删除(只需要修改指针域无需移动结点);缺点是不能进行随机访问,只能顺序访问,此外,每个结点增加指针域,导致存储密度较低。
在单链表中增加头结点的优点
(1)单链表中首节点的插入与删除操作与其他结点一致,无需进行特殊处理。
(2)无论单链表是否为空,都有一个头结点,统一了空表与非空表的处理过程。
二叉树的定义
二叉树是一个有限的结点集合,这个集合或者为空,或者由一个根结点和两棵互不相交的称为左子树和右子树的二叉树构成。
二叉树与度为2的树的差别
度为2的树至少有一个度为2的结点,而二叉树则没有这个要求。
度为2的树不区分左右子树,而二叉树严格区分左、右子树。
哈夫曼树的定义
在n个带权叶子结点所构成的所有二叉树中,带权路径长度WPL最小的二叉树称为哈夫曼树或最优二叉树。
顺序查找基本思路
从表的一端开始顺序扫描线性表,依次将扫描到的关键字与给定值k相比较,若相等则查找成功,给出该元素在查找表中的位置。若整张表扫描结束仍未找到关键字与给定值k相等的元素则查找失败。
二叉排序树查找
若二叉排序树不为空,将给定关键字值与根节点值相比较若相等则查找成功。若不相等,则当给定关键字值小于根节点时到根节点左子树中去查找,当给定关键字值大于根节点值时到根节点右子树中去查找。重复上述过程直至查找成功。
折半查找的基本思路
快速排序的步骤
在待排的n个元素中任取一个元素(一般取第一个元素)将其放在最终位置后,整个数据区间被该元素分割成两个子区间。所有关键字比该元素小的放置在前子区间中,比该关键字大的放置在后子区间中。然后将该元素放置在两个子区间中间位置,这个过程称为一趟快速排序。然后对所有的两个子区间分别重复上述操作,直至每个子区间中只有一个元素为止。
冒泡排序
对于长度为n的记录,从头到尾依次比较相邻的两个元素,若为反序则将其交换。照此从头到尾处理一遍称为一趟冒泡排序,这样就可以将关键字值最大的元素交换至最后的位置上(假设按关键字升序排列)。接着在剩下的n-1个元素中进行相同操作,则关键字次大的元素将被交换至第n-1个位置上,依次类推,直至所有元素有序。
直接插入排序
假设元素存放在R[0…n-1]之中,R[0…i-1]为已经排好序的子表(简称有序区,初始时有序区只有一个元素R[0])。R[i…n-1]为未排好序的子表(简称无序区),插入排序过程中将R[i]插入到R[0…i-1]之中使得R[0…i]有序,插入R[i]的过程就是完成排序中的一趟,经过n-1趟排序后使得R[0…n-1]全部有序。如何将R[i]插入到R[0…i-1]之中呢?通常先将R[i]存放到临时变量temp中,从j=i-1开始向前找第一个小于或等于temp.key的位置j(每个大于temp.key的元素后移一个位置),再将temp放在R[j+1]中。
简单选择排序
假设元素存放在R[0…n-1]之中,R[0…i-1]为当前有序区(初始时有序区为空),R[i…n-1]为当前无序区。每趟排序从当前无序区R[i…n-1]中选出关键字最小的元素R[k],将其与无序区中第一个元素R[i]交换。使得R[0…i]与R[i+1…n-1]成为新的有序区和无序区,经过n-1趟排序后R[0…n-1]递增有序。
堆的定义
堆是一棵顺序存储的完全二叉树,其中每个结点关键字都不小于其孩子结点的关键字,这样的堆称为大根堆。若每个结点关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。
堆排序
二路归并排序