数据结构

《数据结构》

 

================================================线性结构:

【线性结构】:线性表 堆栈 队列 串

 

线性表是一种最简单的线性结构,特点是可以在任意位置插入和删除一个数据元素。

线性表可以用顺序存储结构和链式存储结构存储。

用顺序存储结构实现的线性表称作顺序表,用链式存储结构实现的线性表称作链表。

链表又分为单链表,循环单链表,双向循环链表三种。

顺序表优点是算法简单,内存单元利用率高,能方便地随机存取表中任一结点;缺点是需预先确定元素个数。

链式存储能方便地进行插入删除操作,不需要预先确定元素个数;缺点是空间单元利用率不高,算法复杂。

操作集合: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+树。

 

哈希查找,适用于静态查找和动态查找,并且查找效率比较高。

哈希函数—哈希冲突解决—哈希表设计。

 

posted @ 2012-07-05 20:41  汤姆是一只猫  阅读(364)  评论(0编辑  收藏  举报