数据结构
文章平均质量分 58
相关数据结构的基础知识讲解以及代码实现
小心眼儿猫
这个作者很懒,什么都没留下…
展开
-
排序算法:快速排序和归并排序
快速排序(升序排序):快速排序的核心就是找到一个基准值(我们这里采用最后一个元素作为基准值),然后在剩下的区间里从左往右找到一个大于基准值的数,再从右往左找到一个小于基准值的数然后将二者交换,直到二者相遇一趟排序结束。然后在继续下一趟排序。 //////////////////////////////////////快速排序的递归版本/////////////////////////...原创 2018-06-03 11:37:57 · 488 阅读 · 0 评论 -
排序算法:冒泡,选择,插入,希尔以及堆排序
冒泡排序:时间复杂度O(N^2),空间复杂度O(1),稳定排序 这里的我们使用冒泡排序对数据升序排序,从后往前冒,每冒完一趟我们都会找到这一堆数据(待排序的数据)中最小的一个,并且该最小的数据就在待排序的数据中第一个位置上,此时我们修改有序的区间,再进行下一趟的冒泡排序,并且已经被排好的数据就不会二次被进行排序(二次排序是不必要的,这里就是借用一个有序区间避免了这种不必要)。#inclu...原创 2018-05-30 17:05:55 · 289 阅读 · 0 评论 -
浅析海量数据处理问题
生活中我们经常会遇到一些海量数据处理的问题,那么怎样的问题就算是海量数据了呢?来看以下这几个问题: 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址 。 给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数)。 有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件...原创 2018-05-29 17:01:01 · 2735 阅读 · 0 评论 -
哈希表的基本操作(二):哈希桶处理哈希冲突
哈希桶//hash.h文件内容#pragma once#define max_size 1000typedef int KeyType;typedef int ValType;typedef int (*HashFunc)(KeyType key);typedef struct HashElem{ KeyType key; ValType value; ...原创 2018-05-20 18:26:31 · 1463 阅读 · 0 评论 -
哈希表的基本操作(一):线性探测法解决哈希冲突
哈希概念 在之前学习过的顺序搜索和二叉树搜索中,元素存储位置和元素各关键码之间没有对应关系,因此在查找一个元素时,必须要经过关键码的多次比较。搜索的效率取决于搜索过程中元素的比较次数。 我们希望可以不经过任何比较,一次直接从表中得到想要的元素,这样一来,搜索效率就有了质的提高。如果构造一种存储结构,通过某种函数是元素的存储位置与他的关键码之间能够建立一一映射的关系,那么在查找的时候通...原创 2018-05-20 18:22:27 · 33733 阅读 · 2 评论 -
数据结构·堆
堆:堆的表现形式其实是一棵完全二叉树,只不过,该完全二叉树中的元素有一些其他的考究。 1、首先堆分为大堆和小堆 2、大堆(小堆):任一节点的关键码大于(小于)等于他的左右孩子的关键码,位于堆顶节点的关键码永远是这棵二叉树中最大(最小)的一个值,从根节点到每个节点的路径上数组元素组成的序列都是递减(递增)的 1、堆存储在下标为0开始的数组中,因此在堆中给定下标为i的点时:...原创 2018-05-12 17:08:38 · 198 阅读 · 0 评论 -
二叉树基本操作(三)(非递归实现前中后序遍历)
非递归实现前序遍历思路:非递归的前序遍历就比较简单,借助一个栈,将根节点入栈,然后通过循环,取栈顶元素,出栈就可访问当前栈顶元素(也就是当前树的根节点(前序遍历的顺序是VLR)),有先序遍历的顺序规则,在将其右子树入栈,在将其左子树入栈,只需要注意一点,左右子树的入栈顺序一定是先入栈右子树在入栈左子树。(因为我们先序遍历是访问了根节点之后就访问左子树在访问右子树,而栈的特点是后进先出,因此我们要想...原创 2018-05-06 02:06:16 · 592 阅读 · 0 评论 -
二叉树及其基本操作(二)(C语言)
前面我们知道了二叉树的相关概念和性质,也了解了二叉树的相关遍历方法,接下来我们来实现一下其他的有关二叉树的相关基本操作。二叉树及其基本操作(一)(C语言递归实现前中后层序遍历)//求二叉树节点个数int TreeSize1(TreeNode *root){ if(root == NULL) { //空树 return 0; } ...原创 2018-04-30 14:31:55 · 237 阅读 · 0 评论 -
二叉树及其基本操作(一)(C语言递归实现前中后层序遍历)
树的概念: 由N(N>=0)个节点构成的集合,对于N>1的树,有: 1、有一个特殊的节点,称为根节点,根节点没有前驱节点 2、除根节点外其余节点被分成M(M>0)个互不相交的集合T1,T2……Tm,其中每一个集合Ti(1<=i<=m) 是一棵结构与树类似的子树,每棵子树的根节点有且只有一个前驱,可以有0个或多个后继因此,树是递归定义的。...原创 2018-04-30 12:10:43 · 1724 阅读 · 0 评论 -
多通路带环和不带环迷宫求最短路径(C语言)
求解了简单迷宫,接下来我们来看一看多通路的带环和不带环的迷宫求最短路径的问题。 问题一:不带环的多通路迷宫求最短路径 思路: 1、给定一个点,判断该点是否能落脚,不能落脚直接返回 2、能落脚就将这个点标记,并且入栈cur_path,该栈中保存着我们走过的路径 3、判断这个点是否为出口,是出口说明找到了一条路 4、此时cur_path栈中保存着我们走过的这条路,将cur...原创 2018-04-21 22:20:55 · 541 阅读 · 0 评论 -
回溯法求解简单迷宫(C语言)
前两天学习了栈和队列的相关知识,今天来看一下如何用栈来走出迷宫。 先来一个迷宫:0表示墙(不能走),1表示路(能走)为便于观察我将这里可走的路用红色标记一下 前面收到我们要使用栈的相关知识来走出这个迷宫,下面就正式开始来说一说怎么解决迷宫问题。 方法一:使用函数本身的栈。我们都知道调用一个函数时,该函数都会形成自己的函数调用栈,当函数调用结束返回以后,该栈结构就会随之消失,而这里的调用栈的原创 2018-04-21 11:19:07 · 4196 阅读 · 0 评论 -
通过一个数组实现两个栈(C语言)
通过一个数组实现的两个栈也叫作共享栈。我们可以将一个数组一分为二,供两个栈使用。 也有另外一种虽然也是讲一个数组一分为二供两个栈使用,但在具体实现上有所不同。 牢记栈1的区间是[0,top1)的左闭右开区间,栈2的区间是[top2,max_size)的左闭右开区间。其中的top1位置并不存放栈1的值,而max_size是数组的边界值也取不到。 正式由于两个栈的区间的取值,所以当top1与...原创 2018-04-17 20:06:01 · 2546 阅读 · 0 评论 -
通过两个栈实现一个队列(C语言)
思路:如下图,我们可以定义两个栈,其中一个input用于实现队列的入队列的操作(就是input栈的入栈),另外一个output用于实现出队列和取队首元素的操作(就是output栈的出栈和取栈顶元素)。 当我们要出队列或者去队首元素时时,因为出队列和取队首元素要从output栈出,所以要先将input中的元素移到output中(而且谁最后入栈,就先把谁移到output中,这样一来,后入栈(后入队原创 2018-04-16 00:33:34 · 3168 阅读 · 0 评论 -
通过两个队列实现一个栈(C语言)
stackBy2Queue.h文件#pragma once#define max_size 1000typedef char DataType;typedef struct Queue{ DataType data[max_size]; int head; int tail; //队列中有效元素个数 int size;}Queue;...原创 2018-04-16 23:42:01 · 9691 阅读 · 1 评论 -
判断元素出栈入栈顺序的合法性(C语言)
题意:假设有字符串1**abcde**和字符串2**bceda**,试判断是否能以字符串1的入栈顺序得到字符串2的出栈顺序。思路: 步骤1:先将字符串1的第一个字符入栈: 步骤2:将该元素与字符串2的下一个元素进行比较 步骤3: a):如果相等,就将该元素出栈并且将字符串1的下一个字符入栈,与字符串2的下一个字符进行比较。 b):如果不相等,继续将字符串1的...原创 2018-04-17 20:43:50 · 6009 阅读 · 0 评论 -
实现一个栈:取栈中的最小值的时间复杂度为O(1)
思路:每次入栈前先找到最小的元素(每次有新元素入栈时就将新的元素假设为最小的元素min)(情况1:入栈时,栈内没有任何元素,即是一个空栈。这时候先将要入栈的元素入栈,再紧接着将最小的元素入栈;*情况2*:入栈时栈内已经有元素了,这时候将最小值min与栈顶元素相比较,如果栈顶元素比最小值还要小,则将其赋值给最小值min(min永远是最小的值)。然后先将要入栈的元素入栈再紧接着将最小值入栈。)如此一来...原创 2018-04-15 15:27:56 · 1808 阅读 · 0 评论 -
C语言实现链式队列
C语言实现基于顺序表的顺序队列 linkqueue.h文件#pragma oncetypedef char linkType;typedef struct linkNode{ linkType data; struct linkNode *next;}linkNode;//初始化函数void linkQueueInit(linkNode **qhead);...原创 2018-04-14 09:12:53 · 2011 阅读 · 1 评论 -
C语言实现基于顺序表的队列
队列:有且仅有三种操作:入队列,出队列,取队首元素。 只允许从一端进行插入数据操作(入队列),从另一端进行删除数据操作(出队列)或者取队首元素操作。进行插入操作的这一端叫做队尾,进行删除操作的这一端叫做队首。 特点:先进先出代码实现:seqQueue.h文件#pragma once#define Max_Size 100typedef char QueueType;typedef struct原创 2018-04-10 01:21:20 · 590 阅读 · 0 评论 -
C语言实现基于链表的链式栈
C语言实现基于顺序表的顺序栈 代码实现: linkStack.h文件#pragma once#include<stddef.h>typedef char linkType;typedef struct linkNode{ linkType data; struct linkNode *next;}linkNode;linkNode *stac...原创 2018-04-13 22:48:51 · 231 阅读 · 0 评论 -
C语言实现顺序栈
栈:是一种特殊的线性表,我们只能对栈 的固定的一端进行插入和删除元素操作。这固定的一端被称之为栈顶,另外一端就叫做栈底。如果一个栈中没有任何元素就将其称为空栈。 特性:先进后出(后进先出) seqstack.h文件#pragma once#include<stddef.h>typedef char seqStackType;typedef struct se...原创 2018-04-07 23:10:50 · 6177 阅读 · 1 评论 -
C语言实现双向链表的增删查改
定义一个带头节点的双向链表需要一个数据域两个指针域,其中一个next指针是指向当前节点的下一个节点,另外一个prev指针是指向当前节点的前一个节点。如下图所示: 该头结点本质上只是一个傀儡节点并无实际用处,带头节点的好处就是我们在实际操作链表时不用考虑头指针的指向。而双向链表的前后指针域也大大方便了我们对于链表的实际操作。 代码示例: DBlinklist.h文件#pragma ...原创 2018-04-03 22:35:04 · 3523 阅读 · 2 评论 -
单链表的相关面试题(一)
以下内容接《C语言实现单链表的增删查改》有需要者自行戳链接查看 linklist.h文件新增内容//冒泡排序void linklistBubbleSort(LinkNode *head);//找出中间节点LinkNode *FindMidNode(LinkNode *head);//找倒数第K个节点LinkNode *FindLastKNode(LinkNode *head,siz...原创 2018-04-07 13:58:16 · 339 阅读 · 0 评论 -
单链表的相关面试题(二)
单链表的基础操作:单链表的相关面试题(一) 之前介绍了单链表的基础的增删查改的先关操作,详细信息请戳上文链接查看文章。 接下来我们来解决一些常见的单链表的相关面试题。 linklist.h文件#pragma once#include<stddef.h>typedef char LinkType;typedef struct LinkNode{ Lin...原创 2018-05-02 08:12:03 · 188 阅读 · 0 评论 -
C语言实现单链表的增删查改
链表:一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,称存储单元为一个节点。 链表分类:单链表双链表双向循环链表代码实现单链表的增删查改: linklist.h文件#pragma once#include<stddef.h>typedef char LType;typedef struct LinkNode{ //数据...原创 2018-03-25 15:23:06 · 17654 阅读 · 0 评论 -
顺序表的增删查改(二)
顺序表的增删查改(二)原创 2018-03-19 16:00:11 · 211 阅读 · 0 评论 -
顺序表的增删查改(一)
顺序表所谓线性表,就是n个数据元素组成的一个有限序列,可以在其任意位置上进行插入和删除操作的线性数据结构。从数据在物理内存存储形式上线性表可分为顺序表和链表。今天我们了解一下顺序表,顺序表就是用一段地址连续的存储单元依次存储数据元素的线性结构。地址连续的存储空间,我们通常会用数组,数组有静态数组和动态数组之分,所以说顺序表也有静态顺序表和动态顺序表之分,我们就先看一看静态顺序表的增删查改的操作。具...原创 2018-03-15 11:47:16 · 866 阅读 · 0 评论