![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
diligentyang
主要研究PHP编程,网站后端开发,网站维护,mysql。会熟练使用CI框架。yii入门级。
展开
-
串的模式匹配(BF算法,KMP算法)
模式匹配(Pattern Matching) 即子串定位运算(Index函数)。算法目的:确定主串中所含子串第一次出现的位置(定位) ——即如何实现 Index(S,T,pos)函数初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(s) 操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符起第一次出现的位置;否则函数值为0。原创 2016-05-24 10:49:37 · 8201 阅读 · 1 评论 -
树和二叉树自测题
一、判断题.( 对 )1. 若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。( 错 )2.二叉树中每个结点的两棵子树的高度差等于1。 ( 对 )3.二叉树中每个结点的两棵子树是有序的。 ( 错 )4.二叉树中每个结点有两棵非空子树或有两棵空子树。 ( 错 )5.二叉树中每个结点的关键字值大于其左非空子树(若存在的原创 2016-06-03 14:58:40 · 16458 阅读 · 2 评论 -
【PHP】冒泡排序以及优化
最近看了一下冒泡排序这个经典的算法,在网上也看到了很多改进冒泡排序算法的方式,这里总结一下:冒泡排序最简单的实现方式如下(我用PHP来实现,用其他语言也是一样的):for($i=0;$i<$arr_count;$i++){ for($j=0;$j<$arr_count-1;$j++){ if($rand_arr[$j] > $rand_arr[$j+1]){原创 2016-12-10 15:31:24 · 3555 阅读 · 0 评论 -
【数据结构】插入排序
插入排序的基本思想是:每步将一个待排序的对象,按其关键字大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。简言之,边插入边排序,保证子序列中随时都是排好序的。直接插入排序新元素插入到哪里?在已形成的有序表中线性查找,并在适当位置插入,把原来位置上的元素向后顺移。关键字序列T=(13,6,3,31,9,27,5,11),请写出直接插入排序的中间过程序列。关键字序列T= (21,2原创 2017-03-04 16:46:07 · 1290 阅读 · 0 评论 -
数据结构--绪论自测题
一.填空题1. 数据结构被形式地定义为(D, R),其中D是 数据元素 的有限集合,R是D上的 有限集合。2. 数据结构包括数据的 逻辑结构 、数据的 存储结构 和数据的 运算 这三个方面的内容。3. 数据结构按逻辑结构可分为两大类,它们分别是 线性结构 和 非线性结构原创 2016-05-06 18:15:04 · 5047 阅读 · 0 评论 -
【数据结构】汉诺塔和菲波那切数列--递归
<?php$i=1;//记录移动次数function move($n,$from,$to){ global $i;//获取全局变量 echo "第{$i}步:将第{$n}号盘子从{$from}移到{$to}上<br>"; $i++;}function hanno($n,$from,$depend_on,$to){ if($n==1){ move原创 2017-03-17 10:58:45 · 1744 阅读 · 0 评论 -
【排序】归并排序
归并排序的基本思想是:将两个(或以上)的有序表组成新的有序表。更实际的意义:可以把一个长度为n 的无序序列看成是 n 个长度为 1 的有序子序列,首先做两两归并,得到n / 2个长度为 2 的子序列 ;再做两两归并,…,如此重复,直到最后得到一个长度为 n 的有序序列。关键字序列T=(21,25,49,25*,93,62,72,08,37,16,54),请给出归并排序的具体实现过程。PHP的实现<?原创 2017-04-05 13:26:55 · 1001 阅读 · 0 评论 -
【数据结构】栈的应用---四则运算表达式求值(中缀表达式与后缀表达式转换)
用计算机实现带括号的四则运算的方式。这里的困难在于乘除运算的优先级高于加减运算,并且加入了括号,使得问题变得更加困难。20世纪50年代,波兰逻辑学家想到了一种不需要括号的后缀表达法,我们也把它称为逆波兰表示。比如:9+(3-1)*3+10/2,如果用后缀表示法就是9 3 1 - 3 * + 10 2 / +,这样的表达式称为后缀表达式,叫后缀的原因在于所有的符号都是要在运算数字的后面出现。后缀表达式原创 2017-04-29 14:11:27 · 14442 阅读 · 2 评论 -
【排序】堆排序
堆的定义设有n个元素的序列 k1,k2,…,kn,当且仅当满足下述关系之一时,称之为堆。 解释:如果让满足以上条件的元素序列 (k1,k2,…,kn)顺次排成一棵完全二叉树,则此树的特点是:树中所有结点的值均小于(或大于)其左右孩子,此树的根结点(即堆顶)必最小(或最大)。怎样建堆?从最后一个非终端结点开始往前逐步调整,让每个双亲大于(或小于)子女,直到根结点为止。注:终端结点(即叶子)没有任何子女原创 2017-04-06 14:24:41 · 934 阅读 · 0 评论 -
【数据结构】哈夫曼树及哈夫曼编码
哈夫曼树 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。树节点间的边相关的数叫做权。从树中的一个节点到另一个节点之间的分支构成两个点之间的路径,路径上的分支数目称作路径长度。图中二叉树a中,跟节点到D的路径长度就是4,b中根节点到D的路径长度为原创 2017-04-30 21:02:11 · 36951 阅读 · 12 评论 -
【数据结构】图的存储结构
是否可以采用顺序存储结构存储图?图的特点:顶点之间的关系是m:n,即任何两个顶点之间都可能存在关系(边),无法通过存储位置表示这种任意的逻辑关系,所以,图无法采用顺序存储结构。如何存储图?考虑图的定义,图是由顶点和边组成的,分别考虑如何存储顶点、如何存储边。邻接矩阵(数组)表示法基本思想:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系。假设图A=(V,E原创 2017-05-01 13:51:08 · 5908 阅读 · 0 评论 -
【数据结构】处理散列冲突的方法
摘自大话数据结构我们设计得再好的散列函数也不可能完全避免冲突,这就像我们再健康也只能尽量预防疾病,但却无法保证永远不得病一样,既然冲突不能避免,就要考虑如何处理它。那么当我们在使用散列函数后发现两个关键字key1≠key2,但是却有f(key1) = f(key2),即有冲突时,怎么办呢?我们可以从生活中找寻思路。试想一下,当你观望很久很久,终于看上一套房打算要买了,正准备下订金,人家告诉你,这房原创 2017-05-03 14:05:15 · 4530 阅读 · 0 评论 -
【数据结构】二叉树的遍历(递归与非递归)
先序遍历(递归)遍历过程访问根结点先序遍历其左子树先序遍历其右子树void PreOrderTraversal(BinTree BT){ if( BT ) { printf("%d", BT->Data); PreOrderTraversal(BT->Left); PreOrderTraversal(BT->Right); }原创 2017-05-11 17:58:41 · 1484 阅读 · 0 评论 -
【数据结构】看图理解单链表的反转
如何把一个单链表进行反转?方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。方法2:使用3个指针遍历单链表,逐个链接点进行反转。方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。方法4: 递归(相信我们都熟悉的一点是,对于树的大部分问题,基本可以考虑用递归来解决。但是我们不太熟悉的一点是,对于单链表的一些问题,也可以使用递转载 2017-05-04 19:38:04 · 1276 阅读 · 0 评论 -
串的基础知识
从数据结构角度看,栈和队列是操作受限的线性表,他们的逻辑结构相同。 串是重要的非数值处理对象,它是以字符作为数据元素的线性表。 串:即字符串,是由零个或多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。 若干术语: 串长:串中字符个数(n≥0), n=0 时称为空串 。 空白串:由一个或多个空原创 2016-05-20 20:09:27 · 2077 阅读 · 0 评论 -
栈和队列测试题
一、填空题1. 向量、栈和队列都是 线性 结构,可以在向量的 任何 位置插入和删除元素;对于栈只能在 栈顶 插入和删除元素;对于队列只能在 队尾 插入和 队首 删除元素。2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为 栈顶 。不允许插入和删除运算的一端称为 栈底 。3. 队列 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性原创 2016-05-19 20:26:05 · 10939 阅读 · 1 评论 -
数组的基础知识
数组的定义: 数组是由一组类型相同的数据元素构成的有序集合,每个数据元素称为一个数组元素(简称为元素),每个元素受n(n≥1)个线性关系的约束,每个元素在n个线性关系中的序号i1、i2、…、in称为该元素的下标,并称该数组为 n 维数组。 数组的特点: 元素本身可以具有某种结构,属于同一数据类型; 数组是一个具有固定格式和数量的数据集合。原创 2016-05-28 12:04:05 · 6203 阅读 · 0 评论 -
广义表
广义表的定义:在广义表中约定:① 第一个元素是表头,而其余元素组成的表称为表尾; ② 用小写字母表示原子类型,用大写字母表示广义表。 广义表与线性表的区别和联系?广义表中元素既可以是原子类型,也可以是广义表; 当每个元素都为原子且类型相同时,就是线性表。特点:特别提示:任何一个非空表,表头可能是原子,也可能原创 2016-05-28 16:37:09 · 2253 阅读 · 0 评论 -
串和数组自测题
一、填空题1. 不包含任何字符(长度为0)的串 称为空串; 由一个或多个空格(仅由空格)组成的串 称为空白串。2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的字符定位的位置为 3 。4. 子串的定位运算称为串的模式匹配; 被匹配的串 称为目标串, 子串 称为模式。5. 设目标T=”abccdcdc原创 2016-05-29 14:56:44 · 7704 阅读 · 0 评论 -
树的基本概念
特点:非线性结构,一个直接前驱,但可能有多个直接后继(1:n)树结构和线性结构的比较 线性结构 第一个数据元素(无前驱) 最后一个数据元素(无后继) 其它数据元素(一个前驱、一个后继) 树结构 根结点(无前驱) 多个叶子结点(无后继)原创 2016-05-29 17:34:51 · 1675 阅读 · 0 评论 -
数据结构基础知识
简单的说,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。 描述一类非数值计算问题的数学模型不再是数学方程,而是诸如表、树和图之类的数据结构。 "数据结构"的研究不仅涉及到计算机硬件(特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配原创 2016-05-06 17:54:44 · 2294 阅读 · 0 评论 -
栈和队列基础知识
栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型。栈 栈是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。 栈又称为后进先出的线原创 2016-05-17 21:31:01 · 2503 阅读 · 0 评论 -
二叉树的基础知识
为何要重点研究结点最多只有两个 “叉” 的树? 二叉树的结构最简单,规律性最强; 可以证明,所有树都能转为唯一对应的二叉树。二叉树的定义 定义:是n(n≥0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成 。 逻辑结构: 一对二(1:2) 基本特征: ① 每个结点最多原创 2016-05-31 11:16:07 · 3039 阅读 · 0 评论 -
遍历二叉树
1. 二叉树的遍历 遍历定义 ——顺着某一条搜索路径巡访二叉树中的结点,使得 每个结点均被访问一次,而且仅被访问一次。 “访问”的含义可以很广,如:输出结点的信息等。 遍历用途——查找具有某种特征的结点;对树中全部结点逐一进行某种处理。遍历是二叉树一切运算的基础和核心。遍历规则二叉树由根、左子树、右子树构成,定义为D、 L原创 2016-05-31 11:35:54 · 3926 阅读 · 0 评论 -
线索二叉树
普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。 若将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快“顺藤摸瓜”而遍历整个树了。例如中序遍历结果:B D C E A F H G,实际上已将二叉树转为线性排列,显然具有唯一前驱和唯一后继。1. 线索二叉树的定义规定: 1)若结点有左子原创 2016-05-31 14:34:06 · 1949 阅读 · 0 评论 -
线性表自测题
一、填空题1.在顺序表中插入或删除一个元素,需要平均移动 表中一半 元素,具体移动的元素个数与 表长和该元素的个数 有关。2.线性表中结点的集合是 有限的 的,结点间的关系是 一对一 的。3.向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动 n-i+1 个元素。4.向一个长度为n的向量中删除第i个元素(1≤原创 2016-05-18 20:19:51 · 9718 阅读 · 0 评论 -
树和森林
树和森林与二叉树的转换:树如何转为二叉树?二叉树怎样还原为树?法一: ① 各森林先各自转为二叉树;② 依次连到前一个二叉树的右子树上。 法二: 森林直接变兄弟,再转为二叉树 举例(方法二)二叉树如何还原为森林?树和森林的存储方式原创 2016-05-31 21:53:08 · 2515 阅读 · 1 评论 -
编程实现顺序表的以下基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表。
#include #include #include using namespace std;typedef int ElemType;typedef int Status;#define OK 1#define ERROR 0#define OVERFLOW -2#define LIST_INIT_SIZE 100#define LISTINCREMENT 10ElemTy原创 2016-05-08 23:01:55 · 17741 阅读 · 6 评论 -
Huffman树及其应用
最优二叉树(赫夫曼树) 路 径:由一结点到另一结点间的分支所构成。 路径长度:路径上的分支数目。a→e的路径长度=2 树的路径长度:从树根到每一结点的路径长度之和。树长度=10 结点的权:一些应用中,赋予树中结点的一个有某种意义的实数。 带权路径长度:结点到根的路径长度与结点上权的乘原创 2016-06-01 10:56:38 · 3913 阅读 · 0 评论 -
【数据结构】二叉搜索树
什么是二叉搜索树二叉搜索树(BST)也称为二叉排序树或二叉查找树。二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质。非空左子树的键值小于其根结点的键值。非空右子树的键值大于其根结点的键值。左右子树都是二叉搜索树。二叉搜索树的查找操作查找从根结点开始,如果树为空,返回NULL。若树非空,则根结点关键字和X进行比较,并进行处理:若X小于根结点的值,只需要在左子树中继续搜索。若X大于原创 2017-05-14 18:58:32 · 925 阅读 · 0 评论