数据结构
《数据结构》
================================================线性结构:
【线性结构】:线性表 堆栈 队列 串
线性表是一种最简单的线性结构,特点是可以在任意位置插入和删除一个数据元素。
线性表可以用顺序存储结构和链式存储结构存储。
用顺序存储结构实现的线性表称作顺序表,用链式存储结构实现的线性表称作链表。
链表又分为单链表,循环单链表,双向循环链表三种。
顺序表优点是算法简单,内存单元利用率高,能方便地随机存取表中任一结点;缺点是需预先确定元素个数。
链式存储能方便地进行插入删除操作,不需要预先确定元素个数;缺点是空间单元利用率不高,算法复杂。
操作集合:ListInitiate(), ListLength(), ListInsert(), ListDelete(), ListGet()。
堆栈是一种特殊的线性表,特点是只允许在固定的一端进行插入和删除数据元素操作。
堆栈是后进先出的。
堆栈中有栈顶,栈底,栈顶指示器,栈顶元素,入栈,出栈。
堆栈也有顺序存储结构和链式存储结构。
操作集合:StackInitiate(), StackNotEmpty(), StackPush(), StackPop(), StackTop()。
队列也是一种特殊的线性表,特点是只允许在其一端进行插入操作,在其另一端进行删除操作。
队列是先进先出的。
队列中有队尾,队头,队头队尾指示器,入队列,出队列,队尾元素,队头元素。
队列也有顺序存储结构和链式存储结构,顺序队列一般用顺序循环队列方法实现,可以防止假溢出问题。
操作集合:QueueInitiate(), QueueNotEmpty(), QueueAppend(), QueueDelete(), QueueGet()。
串是一种线性结构,与线性表不同的是其一次可操作若干个数据元素,数据元素只允许字符类型。
串中有串长,空串,空白串,子串,子串位置,字符位置,串的大小,串的比较,串与字符。
串也有顺序存储结构和链式存储结构,实际应用中基本采用动态数组存储结构。
串的模式匹配(查找操作)算法:Brute-Force算法和KMP算法。
操作集合:Initiate(), Assign(), Length(), Compare(), Insert(), Delete(), SubString(), Search(), Replace()。
数组是常用的一种数据结构。数组分为动态数组和静态数组。
静态数组在定义时就给出了数组个数同时分配内存空间,动态数组在程序运行中需要数组才想系统申请数组内存空间。
矩阵一般用二维数组存储,特殊矩阵和稀疏矩阵采用压缩存储。
操作集合:ArrayLength(), Storage(), Get()。
线性表的插入和删除操作不受限制;
堆栈只能在栈顶进行插入和删除;
队列只能在队尾插入,队头删除
各线性结构都能用顺序存储结构和链式存储结构存储。
数组是其他数据结构实现顺序存储结构的基础。
线性表包括:①顺序表SeqList,②单链表LinList,③单循环链表SCList,④双向循环链表;
堆栈包括:顺序堆栈SeqStack,链式堆栈LinList;
队列包括:顺序循环队列SeqCQueue,不带头结点的链式队列LQueue,优先级队列。
串包括:顺序存储(动态数组存储DString),链式存储,串的模式匹配(BF,KMP)。
==================================================递归算法
递归算法是指算法直接或间接调用了自身,指函数的再调用。
==================================================非线性结构:
广义表是n个数据元素组成的序列。其中每个数据元素或者是单个数据元素,或者仍然是一个广义表。
广义表汇总有原子,长度,原子元素个数,深度,表头,表尾。
广义表有链式存储结构GList(头链和尾链,原子和子表),顺序存储结构。
广义表操作的算法实现是递归。
树:
树型结构包括树和二叉树。
树也是递归定义的,树的算法中有很多递归算法。
树中包括结点,结点的度,叶结点,分支结点,孩子结点,双亲结点,兄弟结点,树的度,结点的层次,树的深度。
树的表示方法(3种),树的存储结构(4种)。
二叉树中有满二叉树,完全二叉树。
二叉树的遍历算法有:前序遍历DLR,中序遍历LDR,后序遍历LRD。
二叉树的性质(5条),二叉树的存储结构(3仲)
二叉树的操作实现BiTree;
线索二叉树;哈夫曼树;树与二叉树的转换。
【二叉树的层序遍历】
【通过数值建立二叉树; 通过层序遍历建立二叉树】
【先序,中序,后序遍历的非递归算法】
图:
图是另一种非线性结构,数据元素之间是多对多的。
图的存储结构,图的实现(邻接矩阵/邻接表)。
图的遍历(深度优先/广度优先)。
最小生成树(Prim算法/Kruskal算法)。
最短路径(Dijkastra算法)。
拓扑排序。
关键路径。
【访问操作 / 遍历操作】
=============================================排序查找:
【排序】
排序算法分析:时间复杂度,空间复杂度,稳定性。
排序方法包括:
1. 插入排序
直接插入排序:从头往后—一个接一个插入 [……]←
希尔排序:分组—排序,—不断运用希尔排序直至完成 — — — —
【让关键字值小的元素能很快往前移】
2. 选择排序
直接选择排序:选最小值元素—往前排—不断选择 [……]←——
堆排序:不断调整非叶子结点创建最大堆—堆顶和堆尾互换—再调整成堆—反复
【完全二叉树 / 堆排序对大文件效果才明显】
3. 交换排序
冒泡排序:选最大值元素—往后排—不断冒泡 ——→[……]
快速排序:利用标准元素—对比,排位—不断标准 —→[…]←—
【快速排序当数据文件完全无序时效果才明显】
4. 归并排序
二路归并—不断并入后排序
【归并排序占用内存空间较快速排序大】
5. 基数排序
个—十—百
【查找】
查找分为静态查找和动态查找。
静态查找的存储结构主要有三种:
顺序表,
有序顺序表(顺序查找,折半查找),
索引顺序表(分块查找)。
动态查找的存储结构主要有二叉树结构和树结构两种类型。
二叉树结构又有二叉排序树,平衡二叉树。
树结构有B_树,B+树。
哈希查找,适用于静态查找和动态查找,并且查找效率比较高。
哈希函数—哈希冲突解决—哈希表设计。