数据结构
文章平均质量分 72
mxrrr_sunshine
这个作者很懒,什么都没留下…
展开
-
数据结构-时间,空间复杂度
初始数据结构几个概念:数据:描述客观事物的符号,,是计算机可以操作的对象,能被计算机识别,并输入给计算机处理的符号集合。数据元素:是组成数据的有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录数据项:一个数据元素可以有若干数据项组成。数据项是数据不可分割的最小单位。数据结构:相互之间存在的一种或多种的特定关系的数据元素的集合 衡量算法的复杂度算法的复杂度:算法的时间复杂度和算法的原创 2018-03-08 16:23:21 · 232 阅读 · 0 评论 -
数据结构-求解迷宫问题带环最短路径问题
带环最短路径问题首先,构造地图: 首先构造一个多通路并且带环的迷宫。思路与之前的求多通路的最短路径一样,需要先遍历完所有的可落脚点,将最短路径保存在最小路径栈中,与之不同的是,标记方式发生了变化,这次不能是简单标记为2,而是应该标记为它的路径长度(大致),然后比较时,就可以直接比较数值,如果当前路径走到该点的路径步数比之前的值小,我就可以走这条路,继续走。 辅助函数:由于一些判断条件和以前的问题原创 2018-04-19 15:05:30 · 621 阅读 · 0 评论 -
数据结构-二叉树的前序,中序,后序遍历(非递归实现)
之前在实现二叉树的前中后序遍历时,采用了递归版本实现,比较简单。 这次,我采用了非递归版本实现。需要借助到栈的基本操作。前序根据之前学到的,前序实际上就是先访问,再遍历左子树,再遍历右子树。 下面画图解释: void PreOrderByLoop(TreeNode* root){ if(root==NULL) { return; } T原创 2018-05-02 18:27:14 · 274 阅读 · 0 评论 -
数据结构-二叉树的前序,中序,后序,层序遍历(递归版本)
说到二叉树,最基本的操作就是遍历。四种遍历方式:前序,种序,后序,层序。本篇博客主要叙述如何用递归解决以上操作,非递归方式会另外记录。二叉树的定义我在这了采用了孩子表示法,主要是为了实现二叉树的操作,用孩子表示法便于我们找到两个孩子结点。typedef char TreeNodeType;typedef struct TreeNode{ TreeNodeType d...原创 2018-04-27 18:12:00 · 311 阅读 · 0 评论 -
数据结构-实现堆的相关操作
堆的概念首先:堆是一个完全二叉树。 堆有两种:大堆及小堆 小堆: 这个树的根节点是这个树中的最小的元素 对于任意一个子树来说, 子树的根节点, 小于左右孩子节点的值. 大堆: 这个树的根节点是这个树种的最大元素 对于任意一个子树来说, 子树的根节点, 大于左右孩子节点的值. 举例说明:实现操作堆的初始化与销毁向堆中插入一个元素给一个数组创建一个堆取堆...原创 2018-05-14 17:53:09 · 270 阅读 · 0 评论 -
数据结构-二叉树的相关面试题总结
主要操作是以下:创建二叉树 克隆二叉树求二叉树的高度 求二叉树中结点的个数 求二叉树的叶子结点个数求二叉树中第k层结点的个数 判断一个节点是否在一棵二叉树中求结点的左孩子求结点的右孩子求结点的父结点求二叉树的镜像(递归与非递归)判断一棵树是否是完全二叉树创建二叉树树的定义是递归创建的,所以创建树也可以递归地创建一棵树,首先需要一个序列,按什么顺序来创建,我采用了前序的遍历方原创 2018-04-28 18:50:31 · 215 阅读 · 0 评论 -
数据结构-搜索结构之哈希
哈希概念 理想的搜素方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种一种存储结构,通过某种函数使元素的存储位置与他的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该结构中: a - 插入元素时,根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放。 - 搜索元素时,对元素的关键码进行同样的计...原创 2018-05-21 15:19:43 · 288 阅读 · 0 评论 -
数据结构-哈希扩展-位图and布隆过滤器
关于哈希表,有一些扩展的东西需要我们了解。 下面是一道腾讯的笔试题: 给4 0 亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这4 0 亿个数中。这是一道关于海量数据查找的题,其实这道题,我们就可以和哈希表联系在一起,为何说是海量数据呢,对于一个40亿整数,我们如果要存的话,按照无符号整数来存储,那么下来,大概就需要40亿*4这么多字节,下来大概就是1...原创 2018-05-25 14:22:26 · 419 阅读 · 0 评论 -
数据结构-二叉搜索树
二叉搜索树二叉搜索树又称为二叉排序树,它要么是一颗空树,要么是一颗具有以下性质的树:若他的左子树不为空,则左子树上所有节点的值都小于根结点的值若他的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也满足二叉搜索树的性质如下图所示,满足一个二叉搜索树:对一个二叉搜索树做以下操作:插入查找删除插入向一个二叉搜索树中插入一个元素: 需要考...原创 2018-05-15 20:39:03 · 354 阅读 · 0 评论 -
数据结构-海量分析问题总结
题目一: 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分) 首先,我们的思路就是利用哈希进行文件的切分,我们把100G大小的文件分为1000份,那么下来差不多每一个文件就是100M左右,然后再利用哈希函数除留余数的方法分配到对应的编号文件中,然后得出每个文件中出现次数最多的IP,然后堆排序取得这1000个ip中出现次...原创 2018-05-27 21:23:37 · 337 阅读 · 0 评论 -
数据结构-基于顺序表实现栈
首先:要了解栈这样一种结构。 栈:一种特殊的线性结构,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任何元素地栈称为空栈,栈又称为后进先出的线性表。 基于动态顺序表实现的栈,实现以下操作:入栈操作出栈操作取栈顶元素为了更好地实现以上操作,需要对栈进行初始化与销毁,容量不够时自动扩容的操作。顺序栈声明如下:#pragma o原创 2018-04-07 14:06:11 · 265 阅读 · 0 评论 -
数据结构-求解迷宫多通路最短路径问题
上一次解决了迷宫问题的简单求解,如果迷宫中存在多通路,我们想要找寻一条最短的路径该如何解决。最短路径求解首先构造一个多通路迷宫:void MazeInitShortPath(Maze* m){ int map[ROW][COL]={ {0,1,0,0,0,0}, {0,1,1,1,0,0}, {0,1,0,1,1,1},...原创 2018-04-18 14:56:15 · 1703 阅读 · 0 评论 -
数据结构-实现静态顺序表
实现首先需要一个.c文件和一个.h文件,在.c文件中定义结构体与声明函数,在.h文件中实现顺序表基本操作及单元测试。 头文件实现如下: 定义一个结构体类型,其中成员变量有数据与顺序表大小。 (这里自定义类型是为了在实现中方便我们不用每次都写struct) 1 #pragma once 2 3 #include <stddef.h> 4 #define ...原创 2018-03-11 23:17:39 · 302 阅读 · 0 评论 -
数据结构-基于链表实现链式栈
链式栈基于链表实现链式栈,对栈做以下操作:出栈入栈取栈顶元素初始化销毁基于栈后进先出的结构,入栈可以用头插来实现,出栈用头删来实现即可。初始化void LinkStackInit(LinkStack** phead){ if(phead==NULL) { return;//非法输入 } *phead=NULL;}销毁void Link原创 2018-04-07 21:08:18 · 478 阅读 · 0 评论 -
数据结构-基于顺序表实现顺序队列
首先了解队列这种结构: 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表 进行插入操作的一端称为队尾(入队列) 进行删除操作的一端称为对头(出队列) 队列具有先进先出的的特性基于顺序表实现的队列有以下操作:初始化队列入队列出队列取队首元素销毁队列定义结构定义了一个最大长度为100的队列,一个size用来记录当前顺序队列的大小,一个head一个ta原创 2018-04-08 11:46:17 · 692 阅读 · 0 评论 -
数据结构-实现单链表基本操作
首先要认识单链表: 单链表大致可以分为八种: 带头的,不带头的 带环的,不带环的 单向的,双向的我实现的功能如下:void LinkListInit(LinkNode** phead);//初始化链表void LinkListPrintChar(LinkNode* head,const char* msg);//打印链表void LinkListPushBack(LinkNode** phe原创 2018-03-21 16:17:01 · 517 阅读 · 0 评论 -
数据结构-基于链表实现队列
使用链表实现队列有以下操作:队列的初始化队列的入队列队列的出队列取队列首元素队列的销毁定义结构typedef char LinkQueType;typedef struct LinkQueNode{ LinkQueType data; struct LinkQueNode* next;}LinkQueNode;初始化void LinkQueInit(LinkQue原创 2018-04-08 17:31:43 · 262 阅读 · 3 评论 -
数据结构-单链表相关面试题
从尾到头打印单链表我们在学习递归时,曾经遇到过这样一道题目,打出1234的每一位数,那么我们用递归的思想是:打印1234,就要打出123+4,接下来是12+3+4,在然后1+2+3+4,就能打印每一位数,显然是将一个复杂问题拆解为一个个小问题。 那么同理逆序打印单链表也是,先打最后一个然后以此类推。直接上代码。void LinkListReversePrint(LinkNode* head){原创 2018-03-27 17:02:29 · 312 阅读 · 0 评论 -
数据结构-栈和队列面试题
实现一个栈,要求实现push,pop,min的时间复杂度最低。 思路是:入栈时一次入两个元素,第一个元素是要入栈的元素,第二个元素是min,min为当前栈的最小元素与插入元素的较小的那个元素。出栈时每次出两个,保证栈的结构仍然是先进后出。取栈顶元素时,也能保证每次取到的都是栈里最小的元素。//实现一个栈要求,出栈入栈,返回最小值的时间复杂度是O(1)typedef struct min_stac原创 2018-04-12 14:53:03 · 300 阅读 · 0 评论 -
数据结构-带头结点带环的双向链表基本操作
首先,带头结点带环的双向链表的特点:带头节点:但是我们并不关心头节点中的元素,只起“带头”的作用。带环双向:要求每个结点中都有一个next指针指向下一个,一个prev指针指向上一个初始化void DLinkListInit(DLinkNode** phead){ if(phead==NULL) { return;//非法输入 } *phead原创 2018-04-03 16:47:42 · 250 阅读 · 0 评论 -
数据结构-回溯法解决迷宫问题
回溯法:对一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为若干个子问题求解的算法;当搜索到某个结点发现无法再继续搜索下去时,就让搜索过程回溯(回退)到该节点的前一个结点,继续搜索该节点外的其他尚未搜索的分支;如果发现该结点无法再搜索下去,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一直进行到搜索到问题的解或者搜索完了全部可搜索分支没有解存在为止。...原创 2018-04-15 20:35:59 · 1087 阅读 · 0 评论 -
数据结构-七大排序算法总结
首先总结一下排序的算法分别是什么:冒泡排序之前写过冒泡排序的思路及其优化,所以再次就不再赘述了。 冒泡排序 在此写一个从后向前冒泡的版本://每次冒泡将当前最小值冒到第一个位置上//[0,bound)表示有序元素//[bound,size)表示待排序区间void BubbleSort(int arr[],size_t size){ if(arr==NULL|...原创 2018-06-01 15:14:46 · 557 阅读 · 0 评论