
数据结构
文章平均质量分 81
Hanani_Jia
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
排序五 归并排序
今天我给大家介绍排序中的最后一个排序---归并排序,归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用 既然提到分治法这里我就对分治法进行一个简单的介绍:分治法可以通俗的解释为:把一片领土分解,分解为若干块小部分,然后一块块地占领征服,被分解的可以是不同的政治派别或是其他什么,然后让他们彼此异化。分治法的精髓:分--将问...原创 2018-06-09 13:17:12 · 498 阅读 · 0 评论 -
C语言用堆思想解决TopK问题
之前介绍了堆的一些操作,对堆排序的操作是在提前创建了堆的数据结构的基础上直接调用以前的数据结构,但是今天我们要做的是,假如现在你去面试或者遇到问题的时候没有堆这个数据结构可以直接调用的时候怎么办呢?难道要现场创建一个吗?也不是说不可以,但是毕竟你的时间是有限的,而且其实可以通过直接对数组的操作来进行堆的操作。 其实TopK问题就是复杂之后的堆排序问题,所以今天我主要给大家介绍一个TopK问题,其...原创 2018-05-03 23:52:49 · 1515 阅读 · 0 评论 -
判断二叉树是否是完全二叉树
二叉树中有一个知识点就是完全二叉树,先介绍一下什么是完全二叉树。 我们之前所用的二叉树就是完全二叉树若设二叉树的深度为h,除第h 层外,其它各层(1~h-1)的结点数都达到最大个数,第 h层所有的结点都连续集中在最左边,这就是完全二叉树。 将这颗树的4结点去掉这棵树就不再是完全二叉树。如何通过程序来判断某一颗树是不是完全二叉树呢?其实通过上边对完全二叉树的定原创 2018-04-20 23:43:52 · 1447 阅读 · 0 评论 -
二叉树的非递归后序遍历
昨天写了二叉树的先序、中序的非递归遍历,今天写的是二叉树的后序非递归遍历,为什么将后序和前边两个分开写,因为后序并不是想递归那样直接在先序上进行一个简单的更改就行了,非递归的情况是这三种之中最复杂的。为什么这么说?因为按正常思维来说写出来的后序遍历是很容易陷入一个死循环之中的。 还是拿之前的图来说,后序遍历的话你需要先访问完1的左子树,然后右子树,然后再是1.想访问2的话就是先访问3,4。...原创 2018-04-23 22:25:52 · 958 阅读 · 0 评论 -
堆的创建以及简单操作
今天我给大家介绍的是堆,其实大家要深刻理解数据结构这个概念,队列也好,栈也好,二叉树也好,还有我今天要说的堆,其实他并不是说,他就是一个单独的数据结构或者说是一种和之前完全不一样的东西,这些东西是你用之前的知识对他进行特定的设定而构造出来的。就比如说栈经常是用数组来实现,队列,二叉树经常是用链表来实现,而并不是说他就是一个单独的全新的数据结构,为什么我要说这些是因为这个堆其实包括形状也好甚至思路也...原创 2018-04-30 22:53:50 · 508 阅读 · 0 评论 -
两个队列实现一个栈
之前写过通过两个栈来实现一个队列的情况,今天是两个队列实现一个栈,其实还是之前说的,队列和栈的区别还是本质上的对数据操作的区别,栈是只能在栈顶位置进行操作,队则是队尾插入元素,队头删除元素。 这是两个队。还是同样选取其中一个队当做入数据的,因为栈是先进后出,所以当你入数据的队列完成入数据的时候,如果想出就需要借用Q2队列, 依次入四个元素1、2、3、4,这时候如果想出元素的话,要出原创 2018-04-13 12:22:11 · 489 阅读 · 0 评论 -
二叉树的先序、中序非递归遍历
之前写过二叉树的递归遍历的三种情况,很简单的讲解,很简单的代码就能实现,因为二叉树的很多操作都基于二叉树这个自然的递归情况,所以操作起来十分简单。但是我们今天还是要介绍一下二叉树的非递归遍历,为什么还要写这个更复杂的非递归遍历呢?其实这个大家也应该都清楚啊,递归的优点和缺点,如果你的树足够大的话,一直递归下去怎么办?栈的空间通常也只有几兆大小而已,总有一天会用完,所以就需要通过非递归的方式来解决这原创 2018-04-22 23:50:06 · 702 阅读 · 0 评论 -
判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】
这个图是两个链表的六种状态第一种是最常见见也是最简单的状态,两个不带环单链表并且两个链表不相交。第二种是两个不带环单链表在半路相交了,之前也写过判断两个链表是否相交的函数,第三种是一个链表带环一个链表不带环,但是两个链表不想交,第四种是两个链表都带环,但是彼此不相交,第五种是一个带环一个不带环,两个相交但是相交位置是在带环链表的环外,第六种就是最复杂的一种,一个链表带环一个不带环,两个链表相交,但...原创 2018-04-06 13:13:41 · 717 阅读 · 0 评论 -
单链表实现约瑟夫环问题
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。今天我是需要做的是通过函数来计算约瑟夫环中的最后那个数是什么。其实这里不过是需要一个成环的单链表,然后通过循环不断的找到第m个数然后将第m个数删原创 2018-04-21 23:13:05 · 1303 阅读 · 0 评论 -
一个数组实现两个栈(共享栈)
一个数组实现两个栈,既然是一个数组变成两个栈,首先得把你的数组分成两部分, 这是一个十个元素的数组,有几种方法把他分成两部分呢?这么分! 还是这么分! 或者这么分!言归正传,其实分成两部分还是有两种分发的,第一种就是我上边画的第三种从中间开始分,将你的数组分成两个,分别成为一个栈。但是还有一种分发,是比较不容易想到的,那就是将你的数据的数据进行奇偶分开。 下标是红色的是一个栈,绿色的是另外一个栈...原创 2018-04-12 15:22:40 · 2299 阅读 · 0 评论 -
求两个已排序单链表中相同的数据。
void UnionSet(SListNode* l1, SListNode* l2){ assert(l1 || l2);while ((l1!=NULL)&&(l2!=NULL)){ if (l1->_data == l2->_data){printf("%d\n", l1->_data);l1 = l1->_ne...原创 2018-04-05 20:34:59 · 1323 阅读 · 0 评论 -
字符串中第一个出现一次的字符时间复杂度O(1)
最近接触了哈希。Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。其实...原创 2018-05-10 12:27:06 · 1003 阅读 · 0 评论 -
注释转换
将c语言类的注释(/* */)通过程序转换成c++类注释(// )。当你遍历一个文件的时候会处于五种状态:第一种是正常代码状态,第二种是找到了代表注释的/,第三种是找到了代表注释的*,第四种是当前在C语言的注释类型中,第五种是当前在c++的注释类型中。因为你的状态类型是有限的所以通过一个枚举类型的结构体来表示现在程序所处的状态。enum State{NORMAL,//正常状态FOU...原创 2018-04-26 23:28:32 · 481 阅读 · 0 评论 -
排序二:选择排序和堆排序
上次给大家介绍了插入排序和希尔排序,今天给大家介绍的是选择排序和堆排序。堆排序之前也已经给大家介绍过一次,今天就着重给大家介绍一下选择排序。 选择排序顾名思义就是选择出来一个数让开始进行排序,这里初始的思想是,我选择一个最大的放到第一个(降序),直接让他和第一个元素进行交换即可,然后继续从剩下的元素里边继续。{5, 4, 8, 9, 2, 1} 假如这是我要排序的数组。如果我现在要排的顺序为...原创 2018-05-31 22:32:40 · 530 阅读 · 0 评论 -
排序四 快速排序之左右指针法
上次写了快速排序的一种方法今天要给大家解释的是快速排序的另一种实现方法。相比上次的前后指针法,今天的左右指针法更容易被理解,实现起来也相对简单。 虽然这两种方法都叫指针法,但是因为这是数组所以我们操作的都是下标,这里用左右指针法 当你传入 数组区间之后,依然是选最右边的那个值为你的基准值key,然后将left指向第一个元素,right指向倒数第二个元素,因为你最后一个元素变成了key,然...原创 2018-06-05 22:20:46 · 2583 阅读 · 0 评论 -
排序三--快速排序之前后指针法
这次我继续给大家介绍的排序是快速排序,为什么快速排序单独提出来说一下,是因为快速排序其实可以从他的名字来看出来,快速排序,一定是相对于其他排序来说在某种程度上时间复杂度相对来说还是比较低的,并且快速排序是有好几种实现方式的。今天就给大家具体的介绍一下快速排序到底是个怎么回事。 首先要说的是我们的第一种实现方法----前后指针法,通过两个指针,前边的指针找比基准值小的元素,后边的指针找比基准值...原创 2018-06-04 19:21:49 · 3949 阅读 · 5 评论 -
海量数据处理2
之前介绍了一些海量数据处理的问题,今天我给大家介绍其他几种类型的海量数据的处理。3. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集 4.1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数 首先看第三个问题,问题要把握关键点,这个题我认为关键点在题中的那一句我们只有1G内存,1G内存代表着什么,代表着你不能直接把你的所有数据读取进来然后不...原创 2018-05-23 16:30:45 · 248 阅读 · 0 评论 -
排序一:插入排序和希尔排序
今天开始给大家介绍一些排序,之前海量数据还有一部分没总结完,在总结布隆过滤的时候遇到了一些问题,所以之后我会给大家继续总结。 今天介绍的排序是插入排序和希尔排序。 首先要说的是插入排序,插入排序是一个相对容易理解的排序,从他的名字就可以看出,他是通过插入的方式来进行排序的。当你拿到一个数组的时候,首先你要确定你的数组是要升序还是降序。这里我们拿升序来举例子。拿到数组的时候从你的第二个元素开始...原创 2018-05-27 20:09:25 · 1139 阅读 · 0 评论 -
哈希拉链法(哈希桶)
昨天写了哈希的开放定址法的博客,今天我们要说的是拉链法,还有一个名字叫哈希桶。哈希桶要做的就是,之前我们用的开放定址法,通过将数据映射到数组中来实现哈希。这里每个数组的位置只能存放一个数据,如果冲突的话会继续往下找找到空的位置然后放进去,但是其实大家都能感觉出来上一个代码很简单,也很扯,感觉实现起来完全不行,不要说海量数据了, 有点数据感觉就不行了,虽然可以扩容但是也是一件很复杂的事情。这里我...原创 2018-05-22 20:10:52 · 721 阅读 · 0 评论 -
搜索二叉树递归操作
之前给大家介绍了搜索二叉树的非递归算法,今天给大家介绍一些搜索二叉树的递归算法的操作。 这里主要介绍的是插入,查找和删除。其实插入和之前的二叉树的操作是一样的,不过依然是需要判断你要查入的元素应当插入的位置。int BSTreeInsertR(BSTreeNode** tree, DataType x){if (*tree == NULL){*tree = BuyBSTreeN...原创 2018-05-08 17:33:27 · 1722 阅读 · 0 评论 -
哈希-------开放定址法
最近刚学了哈希,因为之前就写了一个字符串中第一个出现一次的字符时间复杂度O(1)的博客 https://blog.csdn.net/hanani_jia/article/details/80265815已经对哈希有一个简单的介绍了,这里就不多说了,哈希已经学完一段时间了,最近才有时间拿出来整理在我看来哈希是一种思想,要用映射的方式不断的去扩展,去解决一些在其他方式不好解决的问题。今天就说一下最...原创 2018-05-21 21:34:58 · 1039 阅读 · 0 评论 -
搜索二叉树基本操作(非递归)
今天我们要介绍的是一种特殊的二叉树,也就是搜索二叉树。搜索二叉树又叫排序树,其实我认为还是排序树这个名字更适合它。 这就是一棵搜索二叉树,可以看出来,他的孩子的数值是有一定的规律的,根的左孩子一定比根小,根的右孩子一定比根要大。在更多的应用中,他不只是数字的大小还会有更多的应用,今天我们就拿数字的大小来对他进行一定的讲解。 搜索二叉树在一定条件下查找数字是一个相对方便的情况,但是他的时间复杂度是...原创 2018-05-06 20:46:25 · 1057 阅读 · 0 评论 -
海量数据处理问题
哈希切割top K问题 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 位图应用 给定100亿个整数,设计算法找到只出现一次的整数原创 2018-05-17 23:41:40 · 388 阅读 · 0 评论 -
使用两个栈实现一个队列
大家都知道,栈和队列是两种不同的数据结构,栈是只能在栈顶对数据进行操作,队列是一个在队尾插入元素,在队头删除元素的数据结构。其实最通俗的一点这两个的区别就是,栈是先进后出,而队列是先进先出。 今天要解决的问题是,用两个栈来实现一个队列。 两个栈分别来实现不同的功能,S1用来做队的队尾,专门用来将元素入队,S2则是用来做队的队头,专门用来出元素。 入的话就是直接在S1中入元素原创 2018-04-11 21:22:19 · 697 阅读 · 0 评论 -
求二叉树深度以及寻找二叉树中某一节点值
size_t BTreeDepth(BTNode* root) BTNode* BTreeFind(BTNode* root, BTDataType x) 求二叉树的深度依然用的是二叉树递归的特性。二叉树的深度就是你根节点的这一层加上他左孩子或者右孩子中深度大的哪一个,同样这也能被划分为子问题。 size_t BTreeDepth(BTNode* root){if (root == NULL)return 0;if (BTreeDepth(root->_left) >原创 2018-04-17 14:34:51 · 4866 阅读 · 0 评论 -
复杂链表的复制
复杂链表的复制。一个链表的每个节点,有一个指向next指针指向 下一个节点,还有一个random指针指向这个链表中的一个随机节点 或者NULL,现在要求实现复制这个链表,返回复制后的新链表。原创 2018-04-07 22:09:28 · 994 阅读 · 0 评论 -
拓扑排序 关键路径的代码实现
问题描述通常把计划、施工过程、生产流程、程序流程等都当成一个工程。工程通常分为若干个称为“活动”的子工程。完成了这些“活动”,这个工程就可以完成了。通常用AOE-网来表示工程。AOE-网是一个带权的有向无环图,其中,顶点表示事件(EVENT),弧表示活动,权表示活动持续的时间。AOE-网可以用来估算工程的完成时间。可以使人们了解:(1)研究某个工程至少需要多少时间?(2)哪些活动是原创 2017-12-30 10:55:23 · 3297 阅读 · 1 评论 -
创建邻接矩阵和邻接链表
//***************创建邻接矩阵*************#define INFINITY INT_MAX //最大值无穷大#define MAX_VERTEX_NUM 20//假设存储的最大顶点数typedef enum{DG,DN,AG,AN} GraphKind;typedef struct ArcCell //弧结点的定义{ VRType adj; //边 I原创 2017-12-15 00:39:03 · 1161 阅读 · 0 评论 -
用邻接链表存储图并且实现拓扑排序
#define _CRT_SECURE_NO_WARNINGS 1#include #include #include #define MAX_NAME 3#define MaxVernum 20 int degree[MaxVernum];typedef char VertexType;//typedef int Weight;//存储图的边typedef struct原创 2017-12-21 21:52:03 · 1707 阅读 · 0 评论 -
二叉树的创建和递归遍历
二叉树的创建和递归遍历原创 2017-11-13 18:26:41 · 568 阅读 · 0 评论 -
二叉树的创建和先序遍历
#include#includetypedef struct BiNode{char data;struct BiNode *lchild;struct BiNode *rchild; }BiNode, *BiTree;int CreatBiTree(BiTree &T){int m;scanf("%d", &m);if (m == -1)T原创 2017-11-09 22:51:36 · 809 阅读 · 0 评论 -
乱扯递归与非递归
最近在学数据结构的树,学了二叉树之后,老师一直在说要实现对二叉树的递归和非递归两种形式的先序,中序和后序遍历,六个程序。会不会遍历暂先不谈,对于递归和非递归我也是一头雾水。 今天空闲时间想编写对二叉树的建立与遍历,但是发现毫无头绪,所以我先了解了对于程序的递归和非递归两种形式 递归:程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。一个原创 2017-11-08 23:31:49 · 493 阅读 · 0 评论 -
链表编写26个字母按特定字母值插入或删除的完整程序
实现26个英文字母按特定完整输出,并在特定位置插入或删除;原创 2017-10-11 00:15:47 · 4036 阅读 · 1 评论 -
线性表的两种实现
最近新学了数据结构的线性表,这里先简单的介绍一下。线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。下边介绍两个一个是线性表的顺原创 2017-09-19 22:47:40 · 1217 阅读 · 0 评论 -
单链表的冒泡排序
大家之前都对数组进行过冒泡排序,排序的方式很简单,通过两个for循环来解决问题,也很好理解,第一次循环的时候是将整个数组中最大的数字或者说最小的数字放到数组中的最后一个,之后是将数组中第二大或者第二小的放到数组中倒数第二个,所以直接将这个思想放到链表中就可以了。 每次循环都是从头结点开始,但是第一次结尾是最后一个元素,第二次结尾是倒数第二个元素,这里是一样的,但是链表你是不确定他到底有多少个原创 2018-03-30 23:40:45 · 3636 阅读 · 1 评论 -
判断两个链表是否相交,若相交,求交点。(假设链表不带环)
int SListIsCrossNode(SListNode* list1, SListNode* list2){SListNode *L1 = list1;SListNode *L2 = list2;DataType n1 = 0;DataType n2 = 0;DataType n = 0;while (L1){n1++;L1 = L1->_nex...原创 2018-04-04 11:59:48 · 656 阅读 · 0 评论 -
二叉树的层序遍历
之前写过二叉树的先序、中序、后序遍历,今天给大家介绍一下二叉树的层序遍历。二叉树的层序遍历 层序遍历也很好理解,一层一层的将你的二叉树遍历后输出。根据这个图输出顺序也就是125346. 上一篇文章也说了,二叉树的操作大多是通过递归来实现的,如果还按你以前的顺序你会遍历1,2,3,4这样下去,但是你现在又不能输出,那要怎么办?最早我的想法是用一个栈存起来,我让二叉树后序遍历,然后将这些遍历过得顺序...原创 2018-04-16 23:43:54 · 1903 阅读 · 0 评论 -
判断单链表是否带环?若带环,求环的长度?求环的入口点?并计算
void SListIsCycle(SListNode* list){assert(list);SListNode *fast = list;SListNode *slow = list;SListNode *entry=list;SListNode *meet = NULL;DataType count = 0;fast = fast->_next->...原创 2018-04-03 23:14:13 · 650 阅读 · 0 评论 -
实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间 复杂度为O(1)
实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间 复杂度为O(1) 其实找到这个栈的最小值并不难,难的是让返回最小值的复杂度为0(1)也就是说我什么时候想要这个栈中的最小数的你不需要遍历栈直接就可以返回给我。 其实这种题有两种思路,第一种是创建两个栈,用两个栈来实现,其中一个栈就是正常存放你的数据,另一个栈就是用来存放你的栈中所有元素的最小值。 正常栈入的第一个元...原创 2018-04-10 21:22:24 · 1347 阅读 · 0 评论 -
二叉树的基本操作
在学习数据结构的时候学完栈、队列之后下一个比较难、比较重要的就是树。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。这是百度的一个词条介绍,一点都不...原创 2018-04-15 19:22:33 · 435 阅读 · 0 评论