1.2-编程基础之数据结构
fei20121106
这个作者很懒,什么都没留下…
展开
-
(1.2.5.10)30张图带你彻底理解红黑树
编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!原文:RecyclerView: Grid with headerGridView和ListView有许多的相似之处,不过也有一个显著的不同:没有header和footer。现在它们两者都可以转载 2020-05-24 01:24:06 · 738 阅读 · 0 评论 -
(1.2.6.2)最小生成树--Prim算法:O(n2) 适合稠密图
最小生成树 给定一无向带权图,顶点数是n,要使图连通只需n-1条边,若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost spanning tree)。Prim算法 Prim算法是解决最小生成树的常用算法。它采取贪心策略,从指定的顶点开始寻找最小权值的邻接点。图G=,初始时S={V0},把与V0相邻接,且边的权值转载 2015-03-14 17:29:39 · 2542 阅读 · 0 评论 -
(1.2.6.4)有向图的拓扑排序和验环
(1)入度为0的点入栈(2)销毁节点,和与给节点相连的边(3)重复上过程,直到没有元素。 若栈为空时,节点没有完全取出,则证明图中有环对上图进行拓扑排序的结果:2->8->0->3->7->1->5->6->9->4->11->10->12//拓扑排序 void Graph::topologicalSort() {转载 2015-03-14 18:18:35 · 1037 阅读 · 0 评论 -
(1.2.6.7)点对之间最短距离--Floyd算法
Floyd算法 Dijkstra算法是用于解决单源最短路径问题的,Floyd算法则是解决点对之间最短路径问题的。Floyd算法的设计策略是动态规划,而Dijkstra采取的是贪心策略。当然,贪心算法就是动态规划的特例。算法思想 点对之间的最短路径只会有两种情况:两点之间有边相连,weight(Vi,Vj)即是最小的。通过另一点:中介点,两点相连,转载 2015-03-14 18:37:51 · 1061 阅读 · 0 评论 -
(1.2.5.8)B-树和B+树
B-树 是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2.根结点的儿子数为[2, M]; 3.除根结点以外的非叶子结点的儿子数为[M/2, M]; 4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字) 5.非叶转载 2015-03-17 21:25:33 · 588 阅读 · 0 评论 -
(1.2.1.1)单链表的逆转倒置、验环、倒数第M个节点和相交
(7)反向逆置//逆置单向链表 //通过三个指针遍历 O(n)LNode *ListInverse(LNode *L) { if(L==NULL) return NULL; if(L->Next==NULL) return L; LNode *pre=L->Next; LNode原创 2015-03-13 10:09:05 · 769 阅读 · 0 评论 -
(1.2.4.1)数组的相关算法
1-递归实现数组求和2-一个变量二维数组3-递归判断数组递增4-排序数组中查找指定元素重复出现次数5-无序数组的交集6-有序数组的交集7-重复次数最多的元素8-On时间复杂度中寻找数组中出现一半以上的数9-求解存放连续数的数组的唯一重复元素时间复杂度On10-出现奇数次的元素11-数组中符合条件的数组对个数12-数组验证有无重复元素13-使得数组左边全为奇数右边为偶数14-原创 2015-05-06 14:54:04 · 814 阅读 · 0 评论 -
(1.2.5.9)B树、B-树、B+树、B*树
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关转载 2015-08-11 14:17:13 · 532 阅读 · 0 评论 -
(1.2.2.1)栈和队列的应用:数制转换、括号匹配、后缀表达式求解,中缀表达式求解、双栈实现队列,min函数栈
(1)数制转换void conversion(int a,int b) // 实现进制转换{ int stack[maxsize]; int top=-1; while(a) { stack[++top]=a%b; a=a/b; } while(top!=-1) {原创 2015-03-13 13:37:58 · 1523 阅读 · 0 评论 -
(1.2.1.2)单链表:有序链表合并、交集、差集
Node *Merge(Node *head1,Node *head2){ Node *p1 = NULL; Node *p2 = NULL; Node *head = NULL; //找出两个链表中第一个结点较小的结点,head记录较小结点的头结点 if(head1->next->data head2->next->data) {转载 2015-03-13 10:14:25 · 1199 阅读 · 0 评论 -
(1.2.4.2)寻找两个有序数组中的第K个数或者中位数
假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序合并后的第K个数。解法一:使用两个指针指向A和B的开头,很容易在O(M+N)的时间内完成,此算法略过。解法二:使用二分的方法。算法思想在代码注释中#include #include #include u转载 2015-09-01 18:54:45 · 751 阅读 · 0 评论 -
(1.2.3.1)字符串常见算法
已知strcpy函数的原型是:char *strcpy(char *dst, const char *src);实现strcpy函数解释为什么要返回char *假如考虑dst和src内存重叠的情况,strcpy该怎么实现 1.strcpy的实现代码char * strcpy(char *dst,const char *src) //[1]{ ass转载 2015-04-26 16:34:59 · 811 阅读 · 0 评论 -
(1.2.5.2)二叉树遍历算法的应用
中心:利用递归思想,分为左右子树分别计算(1)二叉树的创建先序创建int create(btree $bt){scanf(&ch);if(ch=='') T=Null;else{ if(!T=(BTNode *)malloc(sizeof(BTNode))) exit; T->data=ch; Create(T->L原创 2015-03-13 19:03:19 · 1505 阅读 · 0 评论 -
(1.2.1.3)单循环链表和约瑟夫问题
(1)循环链表中最后一个节点指向头结点(2)约瑟夫问题首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。1)单向链表的解法思路:根据人数确定需要新建的链表节点个数,并初始化数据域为1,2,3,4……构建一节点指针使其指向原创 2015-03-13 10:18:54 · 737 阅读 · 0 评论 -
(1.2.6)图的结构与定义
图概述图(Graph)是一种比线性结构和树形结构都要复杂的数据结构。简单讲,图是由表示数据元素的的集合V和表示数据之间关系的集合E组成。其中,数据元素常称作顶点(vertex),数据之间的关系常称作边(edge)。故图可记为G=,其中V是顶点的有穷非空集合,E是边的集合。在图中顶点的前驱和后继是不设限制的,因此图描述的是一种网状关系。无向图若边是无序的或者说是无向的,则称此转载 2015-03-14 16:22:18 · 1217 阅读 · 0 评论 -
(1.2.5.5)树 森林和二叉树的转换
一、树转换为二叉树 树中每个结点最多只有一个最左边的孩子(长子)和一个右邻的兄弟。按照这种关系很自然地就能将树转换成相应的二叉树: ①左孩子仍为左孩子; ②右兄弟成为右孩子 下面(a)图所示的树可转换为(c)图所示的二叉树。 注意:由于树根没有兄弟,故树转化为二叉树后,二叉树的根结点的右子树必为空。二、森林转换为二叉树 具体方法是:原创 2015-03-14 14:42:50 · 1103 阅读 · 0 评论 -
(1.2.6.5)单源最短路径--Dijkstra算法
Dijkstra算法单源最短路径 给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离。指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题。Dijkstra算法 求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法。该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点。转载 2015-03-14 18:30:19 · 784 阅读 · 0 评论 -
(1.2.2)栈、队列的的结构定义和基本操作
一、栈:限定仅在表尾进行插入或删除操作的线性表(1)结构定义 1.1)顺序栈的结构图定义 typedef struct{int data[maxsize];int top;}sqtack; 1.2)顺序栈的基本操作:先存取,后移动指针int stack[maxsize]; int top=-1;//初始化声明,注意,该方法会导致top指针原创 2015-03-13 12:55:05 · 747 阅读 · 0 评论 -
(1.2.5.6)堆
ss转载 2015-03-14 15:14:56 · 583 阅读 · 0 评论 -
(1.2.1)链表的基本结构和常用操作
一、数据结构(1) 顺序存储结构 int a[10](2)链式存储结构typedef struct node { elemType element; Node *next;}Node; 二、链表的常见操作(1)插入(2)删除(3)查找(4)创建原创 2015-03-12 16:34:17 · 697 阅读 · 0 评论 -
(1.2.1.4)双向循环链表
尾插法:在P节点后加入S节点原则:先出后进出线: S->Next =p->Next; S->prior = p; 进线: P->Next = S; s->next->prior = S;原创 2015-03-13 10:30:33 · 776 阅读 · 0 评论 -
(1.2.1.5)链表的应用:单元多项式的加法、减法、乘法
Am(x)=A0+A1x1+A2x2+A3x3+… +Amxm Bn(x)=B0+B1x1+B2x2+B3x3+… +Bnxn请实现求M(x)= Am(x)+Bn(x)、M(x)= Am(x)-Bn(x)和M(x)= Am(x)×Bn(x)。使用链表来实现单元多项式的加法、减法、乘法。一个单元多项式的节点结构无非是这样的:系数域、指数域、链域。如下图:转载 2015-03-13 10:49:22 · 1072 阅读 · 0 评论 -
(1.2.3)串的结构定义和模式匹配
(1)顺序串的结构定义typedef struct{char ch[maxsize];int length;}seqstring;(2) 零个字符的串为空串;一到多个空格组成的串为空格串。 s='a1a2a3a4a5a6a7a8a9' s为 a1 a2 a3 a4 a5 a6 a7 a8 a9 \0 占据1位 但是s的长度为9(3)动原创 2015-03-13 14:21:31 · 1219 阅读 · 0 评论 -
(1.2.4)数组和广义表
(1)数组表示行优先、列优先(2)对称压缩矩阵(3)稀疏矩阵c=t/(m*n)(4)广义表表头为第一个原子,表尾为剩余组成的子表()和(())不同,前者为空表,后者为有一个空元素的表C=(c,(d,e,f))长度为2,表头为c,表尾为((d,e,f));C=(d,e,f)长度为1,表头为(d,e,f),表尾为()GetTail获取的是原创 2015-03-13 16:10:08 · 853 阅读 · 0 评论 -
(1.2.5.1)二叉树的遍历算法
(1)“先、中、后”遍历算法的统一递归写法void pre(BtNode * p){//先序:根左右 if(p!=NULL){visit(p);pre(P->Lchild);pre(P->Rchild);}}注意:结合中先、中后、中层均可确定二叉树的结构(2)“先、中、后”遍历算法的非递归写法中序遍历非递归实现[cpp]view plai原创 2015-03-13 16:57:31 · 709 阅读 · 0 评论 -
(1.2.5)树和二叉树的结构定义
(1)顺序存储char btree[maxsize]按照满二叉树编号(2)链式存储typedef struct BTNode{char data;BTNode * leftchild;BTNode *Rightchild;}(3)树和二叉树的主要区别树中节点的最大度数没有限制,而二叉树节点的度不超过2。树中节点的孩子节点,无左右之分,而二叉树中是原创 2015-03-13 16:14:42 · 868 阅读 · 0 评论 -
(1.2.5.3)线索二叉树
1.定义 n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。 这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。 注意:转载 2015-03-14 13:58:37 · 1014 阅读 · 0 评论 -
(1.2.6.1)图的遍历--深度优先、广度优先
遍历 图的遍历是指从图中的某一顶点出发,按照一定的策略访问图中的每一个顶点。当然,每个顶点有且只能被访问一次。 在图的遍历中,深度优先和广度优先是最常使用的两种遍历方式。这两种遍历方式对无向图和有向图都是适用的,并且都是从指定的顶点开始遍历的。先看下两种遍历方式的遍历规则:(1)深度优先1)定义 深度优先遍历也叫深度优先搜索(Depth F转载 2015-03-14 16:30:59 · 992 阅读 · 0 评论 -
(1.2.5.4)二叉排序树=二叉搜索树
1.二叉排序树的概念: 二叉排序树是一种动态树表。 二叉排序树的定义:二叉排序树或者是一棵空树, 或者是一棵具有如下性质的二叉树: ⑴ 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ⑵ 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ⑶ 左、右子树本身又各是一棵二叉排序树。二叉排序树的性质: 按中序遍历二叉排序树,原创 2015-03-14 14:08:14 · 979 阅读 · 0 评论 -
(1.2.5.7)哈弗曼树=最优二叉树
(q)根据哈弗曼树的定义,一棵二叉树要使其WPL值最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。哈弗曼依据这一特点提出了一种构造最优二叉树的方法,其基本思想如下: 下面演示了用Huffman算法构造一棵Huffman树的过程:(2)例题:假设一个文本文件TFile中只包含7个字符{A,B,C,D,E,F,G转载 2015-03-14 15:15:20 · 1239 阅读 · 0 评论 -
(1.2.6.3)最小生成树--Kruskal算法:O(elog2e) 适合稀疏图
Kruskal算法 求解最小生成树的另一种常见算法是Kruskal算法,它比Prim算法更直观。从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条边不能使已有的边产生回路,即连接两个联通分量。手动求解会发现Kruskal算法异常简单,下面是一个例子先对边的权值排个序:1(0,1) 2(2,6) 4(1,3) 6(1,2) 8转载 2015-03-14 17:43:34 · 1606 阅读 · 0 评论 -
(1.2.6.8)关键路径
暂无原创 2015-03-14 18:39:11 · 687 阅读 · 0 评论