数据结构与算法分析
房东的小黑
爱吉他的程序员
展开
-
王道——数据结构 第一章 思维拓展
求解斐波那契数列的两种算法,分析其时间复杂度。递归算法:#include <stdio.h>long f1( int n );int main ( void ){ int n; scanf( "%d", &n ); long f = f1( n ); printf( "f(%d) = %ld", n, f ); return 0;} long f1(...原创 2019-03-09 09:52:15 · 5439 阅读 · 2 评论 -
数据结构 第四章 树——线索二叉树(C语言)
二叉树的线索化:如果当前结点没有左孩子,则让它的Left指针指向它的前驱结点,如果没有右孩子,则让它的Right指针指向它的后继结点,然后增设两个标志域来判断当前的指针域指向的是孩子结点还是前驱后继结点。指向前驱结点或后继结点的指针叫做线索。通过中序遍历线索化二叉树:在这里插入代码片...原创 2019-04-08 17:00:28 · 195 阅读 · 0 评论 -
数据结构 第四章 树——树、森林、并查集(C语言)
树的存储结构:(1)双亲表示法:#define Maxsize 100typedef struct Node{ //树结点定义 ElementType data; //数据 int parent; //双亲位置标记 }TreeNode;struct Tree{ TreeNode nodes[ Ma...原创 2019-04-11 20:49:51 · 316 阅读 · 0 评论 -
数据结构 第四章 树——哈弗曼树(C语言)
带权路径长度(WPL):从树根到任意结点的路径长度与该结点权值的乘积。树的带权路径长度:树中所有叶子结点的带权路径长度之和。哈夫曼树(最优二叉树):WPL最小的二叉树。//哈夫曼树#include <stdio.h>typedef struct TreeNode{ int weight; struct TreeNode *Left, *Right;}TNode; ...原创 2019-04-12 11:30:15 · 318 阅读 · 0 评论 -
数据结构 第五章 图——最小生成树,Prim算法,Kruskal算法
生成树:生成树是一个图的极小连通分量:(1)包含图中所有顶点;(2)只含最少的边,如果增加一条边则会构成回路,减少一条边则会不连通(因为树是一种特殊的图,树一定是连通的,而且树中不会有回路)。最小生成树(Minimum Spanning Tree, MST):(1)带权连通无向图;(2)图的所有生成树中各边权值之和最小的一颗生成树。特点:(1)一个图得最小生成树是不唯一的,但最小生...原创 2019-04-27 08:59:27 · 396 阅读 · 0 评论 -
数据结构 第五章 图——拓扑排序与关键路径
有向无环图(Directed Acyclic Graph, DAG):有向图中不存在环。拓扑排序:AOV网(Activity On Vertex Net):用DAG图表示一个工程,顶点表示活动,弧表示活动之间的优先制约关系(即活动的先后执行顺序)。拓扑序列:如果图中从顶点v到顶点w之间有一条有向路径,则v一定排在w之前。拓扑排序(DAG图中)每个顶点出现且只出现一次。算法步骤:(1)从...原创 2019-04-27 10:16:35 · 430 阅读 · 0 评论 -
数据结构 第五章 图——图的遍历
图的遍历:(1)广度优先搜索(BFS, Breadth-First-Search);(2)深度优先搜索(DFS, Depth-First-Search)。广度优先搜索:类似于二叉树的层序遍历,优先考虑最早被发现的顶点。void BFSTraverse( G ptrg ){ int i; for( i = 0; i < ptrg -> vernum; i++ ) vi...原创 2019-04-26 14:10:00 · 215 阅读 · 0 评论 -
数据结构 第五章 图——最短路径问题
最短路径问题的抽象:在网络中,求两个不同顶点之间的所有路径中边的权值之和最小的一条路径:(1)这条路径就是这两个顶点间的最短路径(Shortest Path);(2)第一个顶点为源点(Source);(3)最后一个顶点为终点(Destination)。(4)不考虑负值圈(negative-cost-cycle)情况。问题分类:(1)单源最短路径问题:从固定源点出发,求其到其它所有顶点...原创 2019-04-26 14:45:01 · 952 阅读 · 0 评论 -
数据结构 第五章 图——基本概念,两种存储方式
图(Graph)的定义:图G由一组顶点(顶点集)V(vertex)和一组边(边集)E(Edge)组成,记做G( V, E ),边是顶点对( v, w )∈ E,用|V|表示顶点的个数,|E|表示边的个数。无向边:( v, w )用圆括号,表示顶点v和顶点w之间的边没有方向;有向边:< v, w > 用尖括号,表示从顶点v指向顶点w的边(单行线)。类型名称:图.数据对象集:G(...原创 2019-04-26 14:04:46 · 433 阅读 · 0 评论 -
数据结构 第七章 排序——冒泡排序,快速排序
冒泡排序:void Bubble_Sort( ElementType a[], int n ){ int i, k; for( k = n - 1; k > 0; k-- ){ //外部循环,每一次冒泡结束后最后一个位置的元素总是有序的,所以在下一次排序时就不需要比较它 int flag = 0; //标记设为0 f...原创 2019-05-13 20:48:57 · 752 阅读 · 0 评论 -
数据结构 第七章 排序——归并排序,基数排序
归并排序:核心:有序子列的合并。(1)将两个有序子列(存放在同一顺序表中的相邻位置)归并成一个有序数列的算法:void Merge( ElementType a[], ElementType TmpA[], int L, int R, int RightEnd ){ int LeftEnd = R - 1; int tmp = ...原创 2019-05-13 21:06:24 · 384 阅读 · 0 评论 -
数据结构 第七章 排序——直接插入排序,折半插入排序,希尔排序
直接插入排序:void Insert_Sort_Direct( ElementType a[], int n ){ int i, j; for( i = 1; i < n; i++ ){ //外部循环,此时假定a[0]是已经排好序的,所以把下标从1到n-1的数据依次插入序列中 int tmp = a[i]; //暂时存储要插入的元素 for( j = i; j...原创 2019-05-09 20:28:36 · 308 阅读 · 0 评论 -
数据结构 第七章 排序——选择排序, 堆, 堆排序
选择排序:void Selection_Sort( ElementType a[], int n ){ int i, j; for( i = 0; i < n - 1; i++ ){ //n个元素共进行n-1趟选择排序 int min = i; //假设当前元素是未排序序列中最小的元素 for( j = i + 1; ...原创 2019-05-11 19:36:34 · 227 阅读 · 0 评论 -
数据结构 第六章 查找——散列表,散列查找
已知的几种查找方法:(1)顺序查找:O(n);(2)二分查找(静态查找):O(logn);(3)二叉搜索树:O(h)(h为二叉查找树高度);(4)平衡二叉树:O(logn)。查找的本质:已知对象找位置:(1)通过有序的安排对象:全序(顺序),半序(查找树,左子树小于根结点,右子树大于根结点);(2)直接算出对象位置:散列表。散列查找的两项基本工作:(1)计算位置:构造散列函数确定...原创 2019-05-16 13:47:01 · 3049 阅读 · 0 评论 -
数据结构 第四章 树——二叉搜索树(C语言)
二叉搜索树(二叉排序树或二叉查找树)(BST,Binary Search Tree):或者是一颗空树,若不为空,则:(1)非空左子树的所有键值小于根结点的键值;(2)非空右子树的所有键值大于根结点的键值;(3)左右子树分别也是二叉搜索树。结构定义与操作集://二叉排序树#include <stdio.h>#include <stdlib.h>#defin...原创 2019-04-10 20:14:58 · 213 阅读 · 0 评论 -
记2020王道——《数据结构》第四章中一道存在问题的题目
P123 第4题:设n,m为一颗二叉树上的两个结点,在后序遍历时,n在m前的条件是()A.n在m右方 B.n是m祖先 C.n在m左方 D.n是m子孙这道题答案选择D,但后序遍历是左右中,所以n在m前面的话有三种情况:n左m右,n左m中,n右m中,这三种情况后两种都对应着n是m子孙,但第一种情况n左m右的时候如果n,m是一个结点的左右孩子,此时在后序遍历时n在m前面,但n不是m的子孙...原创 2019-04-10 18:53:28 · 3918 阅读 · 15 评论 -
PAT 数据结构 练习02 Maximum Subsequence Sum(25分)
//Maximum Subsequence Sum#include <stdio.h>int main ( void ){ int k; scanf( "%d", &k ); int a[k], i, j; for( i = 0; i < k; i++ ) scanf( "%d", &a[i] ); int maxsum = 0, this...原创 2019-03-07 21:17:19 · 98 阅读 · 0 评论 -
《数据结构与算法分析——C语言描述》第三章 栈的基本概念和栈的顺序存储实现(C语言)
堆栈的抽象数据类型描述:堆栈(Stack):具有一定操作约束的线性表,即只允许在一端(栈顶)进行插入和删除的线性表。类型名称:堆栈(Stack)。数据对象集:一个有0个或多个数据元素的有穷线性表。数据操作集:void make_empty( S ptrs ); //初始化栈 int IsEmpty( S ptrs ); //判断栈...原创 2019-03-19 19:43:32 · 297 阅读 · 0 评论 -
《数据结构与算法分析——C语言描述》第三章 链栈实现(C语言)
链栈:采用链式存储的栈。特点是入栈出栈操作均在链表表头进行。优点是不存在栈满上溢的情况,便于多个栈共享存储空间和提高其效率。(后半句没怎么理解)实现如下(带头结点)://栈的链式存储——链栈 #include <stdio.h>#include <stdlib.h>#define ElementType int#define N 10typedef st...原创 2019-03-19 20:05:12 · 311 阅读 · 0 评论 -
《数据结构与算法分析——C语言描述》第三章 线性表链式表示基本概念和单链表实现(C语言)
链表在存储线性表时,不要求逻辑上相连的数据元素在物理位置上也相邻,所以在插入和删除操作的时候,不需要移动元素,只需要修改指针即可。具体实现如下://线性表实现——链表(设置头结点)#include <stdio.h>#include <stdlib.h> #define ElementType int/* 1 2 3 4 5 6 -1 程序测试数据 ...原创 2019-03-15 20:41:19 · 233 阅读 · 0 评论 -
《数据结构与算法分析——C语言描述》第三章 双向链表实现(C语言)
在单链表的实现上做一些修改就得到双向链表的实现:具体实现如下://双链表实现 #include &lt;stdio.h&gt;#include &lt;stdlib.h&gt; #define ElementType int/* 1 2 3 4 5 6 -1 程序测试数据 */ typedef struct node{ ElementType data; struc...原创 2019-03-16 09:39:17 · 263 阅读 · 0 评论 -
《数据结构与算法分析——C语言描述》第三章 队列基本概念及循环队列实现(C语言)
类型名称:队列(Queue)数据对象集:一个有0个或多个元素的有穷线性表操作集:void make_empty( Q ptrq ); //初始化栈 int IsEmpty( Q ptrq ); //判断队列是否为空,若为空,返回1,否则返回0 void EnQueue ( ElementType x, Q ptrq );...原创 2019-03-20 19:20:31 · 303 阅读 · 0 评论 -
《数据结构与算法分析——C语言描述》第三章 线性表基本概念学习总结和顺序表实现(C语言)
线性表的抽象数据类型描述:类型名称:线性表数据对象集:线性表是具有相同数据类型的n(n &amp;amp;gt;= 0)个数据元素的有限序列。操作集:(其中整数i表示位置,ElementType表示数据元素的类型,ptrl表示指向线性表的指针)List Make_Empty( ); //创建空表 int find( ElementType x, List ptr...原创 2019-03-13 11:15:11 · 425 阅读 · 0 评论 -
《数据结构与算法分析——C语言描述》第三章 链队列实现(C/C++语言)
链队列实现如下://队列实现——链队列#include <stdio.h>#include <stdlib.h>#define ElementType inttypedef struct queue{ ElementType data; struct queue* next;}Queue;typedef struct LinkQ{ Queue *r...原创 2019-03-21 20:20:42 · 299 阅读 · 0 评论 -
《数据结构与算法分析——C语言描述》第三章 循环链表和静态链表
这里暂时只总结一些关键的点,至于实现,等以后来补。循环链表:(1)循环单链表:循环链表一般不设头节点而设尾节点,因为有时对链表常做的操作是在表头和表尾进行的,如果设置头结点的话,在表头处做插入删除操作时间复杂度为O(1),但在表尾做插入删除操作的话时间复杂度为O(n),因为链表是单链表,所以要找到表尾的前一个结点只能从头遍历链表。循环单链表的尾指针指向表头,所有尾指针的next指针域不为空...原创 2019-03-18 19:54:04 · 275 阅读 · 0 评论 -
数据结构 第四章 树——树的基本概念和基本术语以及二叉树的基本概念
数据结构的三个典型操作:(1)插入;(2)删除;(3)查找。数据结构的基本操作之一:查找:(1)静态查找:集合中记录是固定的,没有插入和删除等操作,只有查找操作;(2)动态查找:集合中记录是动态的,有插入、删除和查找等操作。静态有序查找可以使用二分查找算法(C语言实现如下):int binary_search( ElementType a[], ElementType x, int...原创 2019-04-04 20:56:23 · 526 阅读 · 1 评论 -
数据结构 第四章 树——二叉树的存储结构与遍历(C语言)
二叉树的遍历,即按某条线路访问树中的结点,每个节点被访问一次,且只访问一次,常见的遍历算法分为先序(NLR)、中序(LNR)、后序(LRN)和层次遍历。先序遍历:void PreOrder( BiTree T ) //先序遍历 { if( T ){ visit( T ); PreOrder( T -> Left ); PreOrder( T -> Ri...原创 2019-04-05 20:35:34 · 350 阅读 · 0 评论 -
数据结构 第四章 树——平衡二叉树(C语言)
平衡二叉树(Balanced Binary Tree)(AVL树):或者是一颗空树,非空时则具有:(1)左子树与右子树也是平衡二叉树;(2)左子树和右子树的高度差的绝对值不超过1(平衡因子(Balance Factor)(BF = HL - HR)),即平衡因子的绝对值不超过1。平衡二叉树的调整:每次在二叉排序树中插入一个结点时,首先检查其插入路径上的结点是否因为此次操作而导致了不平衡(...原创 2019-04-10 20:31:55 · 348 阅读 · 0 评论 -
数据结构 第六章 查找——串的存储结构与基本操作
串的存储结构:(1)定长顺序存储表示:#define MaxSize 255typedef struct{ char ch[MaxSize]; //给每个串变量分配一个定长数组 int length; //串的实际长度 }SString;超过预定义长度的串值会被舍去,称为截断。(2)堆分配存储表示://堆分配存储表示typedef struct{ ch...原创 2019-05-16 21:19:59 · 420 阅读 · 0 评论