数据结构与算法
学习笔记与思考
BUG从入门到精通
业精于勤,荒于嬉;行成于思,毁于随。
展开
-
【数据结构】二叉树的构造
所谓构造是指能唯一确定一颗二叉树。任何n(n>0)个不同节点的二叉树,都可由它的(中序序列和先序序列)或(中序序列和后序序列)唯一地确定。先序序列:AB D G C E F中序序列:D G BAE C F后序序列:G D B E F CA我们要知道,中序序列的任何一个节点的左子树和右子树也都是中序序列;前序序列的任何一个节点的左子树和右子树也都是前序序列;后序序列的任何一个节点的左子树和右子树也都是后序序列。为什么必须要有中序序列才能构造二叉树呢?看一下这个过程:...原创 2020-12-03 11:09:25 · 2228 阅读 · 0 评论 -
【数据结构】二叉树基本概念与代码
目录基本概念树基本术语树的性质二叉树二叉树的性质代码基本概念树基本术语节点的度与树的度:树中一个节点的子树的个数称为该节点的度。树中各节点的度的最大值称为树的度,通常将度为m的树称为m次树或者m叉树。分支节点与叶节点:度不为零的节点称为非终端节点,又叫分支节点。度为零的节点称为终端节点或叶节点(或叶子节点)。孩子节点、双亲节点和兄弟节点:在一棵树中,每个节点的后继节点,被称作该机诶单的孩子节点。响应地,该节点被称作孩子节点的双亲节点(父母节点)。具原创 2020-12-01 14:20:18 · 470 阅读 · 0 评论 -
【数据结构】稀疏矩阵的压缩存储
目录关于矩阵稀疏矩阵行优先和列优先稀疏矩阵的压缩存储关于矩阵稀疏矩阵在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。如这个稀疏矩阵,这个矩阵占用了6*7的元素类型大小,但是里边有大量的0,,即有用信息很有限,因此我们可以只提取其有用信息来对其进行压缩。得到一个坐标及其元素值的表行优先和列优先举例说明:这里有一个数组行优先排列是这样的原创 2020-11-20 15:07:57 · 1486 阅读 · 0 评论 -
【数据结构】带动画显示过程的递归求解迷宫问题
采用递归算法求解迷宫问题,输出从入口到出口的所有路径。递归求解我真的也不是理解的很透,但是明显感觉到递归和栈、队列求解很像,都是树形的搜索过程。void f(){ //由外到内 f();//递归体 //由内到外}为了直观地观察过程,补充了一个动画过程,可以用来观察算法的搜索过程。从(1,1)走到(8,8),实心圆是不允许走的,空心圆是可以走的部分,星星是走过的路径。#include <stdio.h>#include <stdlib.h>#.原创 2020-11-19 18:16:58 · 466 阅读 · 0 评论 -
【数据结构】单链表的递归算法
设计递归算法的方法主要是求递归模型,递归模型的求解类似于(其实就是)数学中的归纳法。递归模型中应该包含递归体和递归出口两部分。代码如下:#include <stdio.h>#define NUM 8int A[NUM] = { 102,102,32,44,202,32,61,56 };int min(int a,int b){ if (a < b)return a; else return b;}int F(int A[], int原创 2020-11-19 14:59:32 · 2737 阅读 · 0 评论 -
【数据结构】递归和尾递归
目录概念递归什么时候用递归递归和尾递归一般递归尾递归概念递归在定义一个过程或函数时,直接或者间接调用自己的成分,称为(直接/间接)递归。直接递归就不用说了,间接递归如下。间接递归都可以转化为直接递归,因此一般只研究直接递归。什么时候用递归1.定义是递归的许多数学公式、数列的定义是递归的,例如阶乘、Fibonacci数列。2.数据结构是递归的比如不带头结点的单链表3.问题的求解方法是递归的比如Hanoi问题递归和尾递归一般递归原创 2020-11-19 11:30:56 · 478 阅读 · 0 评论 -
【数据结构】串的模式匹配-KMP算法
目录概念简述KMP算法原理代码计算next数组KMP算法测试概念简述从s中匹配t串,在BF算法中,通过指针回溯不断进行匹配,其思想是穷举。效率很低,但有些串有一定的规律,不需要回溯s串的指针,这就是KMP算法。比如 s:aaaaaab t: aaab在进行比较时,如果按照BF算法,需要进行最后一次才能匹配成功。但是我们发现s和t串前几位是相同的,不需要重复比较。当然,计算机不会像人这么敏感,但是能否设计出一种算法,提高类似这种模式匹配的...原创 2020-11-18 19:35:27 · 809 阅读 · 0 评论 -
一语道破KMP算法计算next数组中k=next[k]的理解
先上定义:主串和模式串免得后面的沟通理解有出入。首先,要理解KMP算法的核心思想:为什么要算next[]数组?数组中每个元素表示什么意思?核心思想就是模式串的某个元素(设为t[i])前的k个元素和该串开头k个元素分别相同,因此如果在模式串的t[i]处匹配失败,模式串的指针没必要完全回溯,只需要回溯到t[k]即可,这样一来主串指针也不用回溯了。而我们用数组就是要记录t[i]位置对应的k值,next数组中每个元素就表示模式串对应位置的前面有k个元素与开头元素分别相等。如果理解了上边这个(.原创 2020-11-18 18:18:12 · 1083 阅读 · 0 评论 -
【数据结构】串的模式匹配-BF算法
串(或字符串)是由零个或多个字符组成的有限序列。原创 2020-11-18 15:47:49 · 459 阅读 · 0 评论 -
顺序队列求解迷宫问题
队头指针:走队尾走过的路——一个一个指向队里的点。队尾指针:探队头四周的可走的路——将队头指向的点的附近的可走的点全部入队。对头指针的作用——保证入队的点的四周都会被扫描一遍。队尾指针——将可走的点入队。他们相辅相成,可以将所有的点都扫描一遍。下代码中,####部分是队头指向一个待扫描四周的点,****部分是队尾扫描四周并将可走的点入队。 /*###############################################################*/ whi原创 2020-11-16 11:13:13 · 518 阅读 · 0 评论 -
顺序栈求解迷宫问题
下图所示的迷宫,从(1,1)走到(8,8)int mg[10][10] = { //迷宫 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 0, 0, 1, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 1,.原创 2020-11-12 21:05:52 · 1440 阅读 · 1 评论 -
【数据结构】循环链表实现环形队列
概念循环链表写循环队列,只用一个队尾指针就够了,因为循环链表中队尾节点的下一个节点就是队首节点。队空条件:队满条件:不考虑进队操作:将新的节点插入到队尾,称为队尾节点,然后队尾指针指向这个新的节点。出队操作:将队尾节点的下一个节点数据取出,并绕过该节点。代码#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define ERROR 0#define OK 1typ原创 2020-11-12 17:00:15 · 578 阅读 · 0 评论 -
【数据结构】单链表实现线性队列
概念队空条件:fron=rear=NULL队满条件:不考虑进队操作:将新的节点插入到链表尾。出队操作:删除链表第一个节点。代码注意出队和入队操作入队操作要考虑到两种情况:1入队前,队为空时,队首和队尾指针都指向新的节点。2.入队后,队不为空,只动队尾指针就行。出队操作要考虑三种情况:1.原队为空,则返回异常。2.原队为只有一个节点,则删除节点后,都指向NULL;3.其他情况,则只操作队尾就行。#include <stdio.h>.原创 2020-11-12 15:17:56 · 165 阅读 · 0 评论 -
【数据结构】非循环队列-顺序存储
队列概念队列是对头出、队尾入的先进先出线性表。需要两个指针front和rear分别来指向队头和队尾。front指向队头元素的前一个位置,rear总是指向队尾元素。进队:rear+1出队:front+1队空条件:front=rear队满条件:rear = MaxSize - 1代码#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define E...原创 2020-11-12 13:49:21 · 728 阅读 · 0 评论 -
【数据结构】环形队列/循环队列-顺序存储
队列是对头出、队尾入的先进先出线性表。需要两个指针front和rear分别来指向队头和队尾。front指向队头的前一个位置,rear总是指向队尾元素。队空条件:front=rear队满条件:rear = MaxSize - 1进队:rear+1出队:front+1...原创 2020-11-12 11:19:46 · 1644 阅读 · 0 评论 -
【数据结构】入栈出栈代码-栈的链式存储
基本概念使用带头结点的单链表表示栈,头结点指向的即为栈顶,也就是说入栈就是所谓的头插法入栈,出栈也是从头结点的下一个节点出。空栈条件s->next==NULL栈满条件:由于链表的内存是随时申请和释放的,所以在内存允许的范围内是没有栈满条件的。进栈:将包含数据的节点插入到头结点之后。退栈:将头节点之后的节点删除,并释放其所占内存。代码stack.c/*********************栈的链式存储结构******************************原创 2020-11-11 19:53:49 · 2504 阅读 · 0 评论 -
【数据结构】入栈、出栈代码-栈的顺序存储
基本概念栈是一种只能在一端进行插入和删除操作的线性表允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。当栈中没有元素时,称为空栈。栈的插入操作称为进栈或入栈;栈的删除操作称为退栈或出栈。栈是先进后出的线性表,即先进展的元素先出栈,比如一个狭窄(只有一个人宽度)的死胡同就类似一个栈,先进去的人只能等最后才能出,这就是先进后出。一个栈应该包括数据部分和栈顶指针,数据部分用来存放数据,栈顶指针用来始终指向栈顶。空栈时,栈顶指针指向-1;当发生入栈时,先栈顶指针加一指向一个新的元素空间,然后原创 2020-11-11 15:45:32 · 6785 阅读 · 0 评论 -
【数据结构】尾插法和头插法-单链表的创建和销毁
前文《【数据结构】链表元素查找、插入和删除-线性表的链式存储》记过了链表的元素查找、插入和删除,本文记链表的创建。目录头插法和尾插法概述代码头插法尾插法其他测试代码头插法和尾插法概述链表的创建有两种方法,一种是头插法(下图),另一种是尾插法。头插法是直接将头结点的下一个节点交给新节点,然后头结点指向新节点。尾插法是直接让单链表的最后一个节点的指向新节点,然后让新节点指向NULL。尾插法时,千万不要忘了最后一个节点指向NULL,否则会出大错!无论什么...原创 2020-11-08 11:47:13 · 948 阅读 · 0 评论 -
【数据结构】链表元素查找、插入和删除-线性表的链式存储
目录头指针和头结点代码查找元素插入元素删除元素头指针和头结点线性链表的存储结构,整个链表的存取必须从头结点开始。头指针指向头结点,头结点的数据域不存放任何数据,也可以存储线性表长度等信息,头结点的指针域存储指向第一个节点的指针。头结点的作用:防止单链表是空的而设的,当链表为空的时候,带头结点的头指针就指向头结点,如果当链表为空的时候,单链表没有带头结点,那么它的头指针就为NULL。 是为了方便单链表的特殊操作,能有效减少代码量,在插入在表头或者删除第一个结点时不原创 2020-11-07 21:37:16 · 6806 阅读 · 0 评论 -
【数据结构】线性表的顺序表
拖延了好久了,终于开始动手了....大二就想要学数据结构,还为此专门找了计科专业的同学借了他们的课本,但是看了一些然后太枯燥(没找对方法)没看的下去。一转眼,两年多过去了,我今年已经毕业了,我还在原地踏步,呵呵。目录线性表基本概念代码创建顺序表插入元素删除元素定位查找元素其他函数测试代码线性表基本概念定义:线性表是一个具有相同特性的数据元素的有限序列。(相同特性:所有元素数据属于同一数据类型)线性表的存储结构:顺序存储结构、链式存储结构(单链表、双链表、循环链原创 2020-11-07 18:05:31 · 342 阅读 · 0 评论 -
数学随记
本文用于临时添加补充零碎知识,随时更新。若有错误,欢迎指正。原创 2020-06-19 10:59:07 · 387 阅读 · 0 评论 -
蒙特卡洛方法
蒙特卡洛方法(Monte Carlo method,也有翻译成“蒙特卡罗方法”)是以概率和统计的理论、方法为基础的一种数值计算方法,将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解,故又称随机抽样法或统计试验法。上述就是蒙特卡洛方法的基本概念,比较抽象,下面结合实际工作中的理解,谈一谈对蒙特卡洛方法的一些认识。(1)首先,蒙特卡洛不是个人名,而是个地名,转载 2018-02-01 21:30:38 · 39508 阅读 · 6 评论 -
数据结构的基本概念
1.什么是数据结构?数据元素:是数据(集合)的一个个体,它是数据的基本单位。数据项:用来描述数据元素,数据的最小单位。数据对象:具有相同性质的若干个数据元素的集合,如整数数据对象是所有整数的集合。eg.下表就是学生为数据对象,数据项包括学号、姓名,班级,性别,班号。而数据元素就是数据对象的基本单位,即每一个学生的数据。比如“1号张斌,性别男,班号9901”,这就是一个数据元素。数据对象:学生;数据项:学号,姓名,性别,班号;数据元素:一个学生的所有数据项下的所有数据的集合。原创 2020-06-17 14:09:26 · 3953 阅读 · 1 评论