数据结构
文章平均质量分 65
宇哲_安菲尔德
这个作者很懒,什么都没留下…
展开
-
模板模拟实现stack和queue
在这里我们接下来实现两个数据结构,一个是stack,一个是queuestack和queue数据特性?毫无疑问,我想每一个学过数据结构的人都可以脱口而出,栈的数据特性采用的是先进后出,而队列采用的时候先进先出。 stack和queue采用什么类型的数据结构?我们来这样思考,对于栈来说,我们最多需要操作的是栈顶,如果我们采用链式的方式,就需要从头一直遍历到尾部,然后才能再次进行维护。而如果我们采用原创 2016-09-10 10:57:20 · 1194 阅读 · 0 评论 -
关于哈希表
学习完了有关二叉树的搜索结构,今天我们来接触另外一种结构,叫做哈希表。1.什么是哈希表哈希表:是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。它的所保存的数据和位置会有一种关系,这种关系我们叫做哈希函数。2.构建哈希表的方法常用的构建哈希表的方法有5种。这5种方法分别是: 构建哈希表的方法有: 1)直接定址法原创 2016-11-08 15:29:36 · 1037 阅读 · 0 评论 -
哈希的拓展——位图
关于哈希表,我们需要拓展一些知识,在这有一个位图需要我们理解。首先我们来看一道腾讯的题。 给4 0 亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这4 0 亿个数中。这道题我们怎么做呢?这是一道关于海量数据查找的题,其实这道题,我们就可以和哈希表联系在一起,为何说是海量数据呢,对于一个40亿整数,我们如果要存的话,按照无符号整数来存储,那么下来,大概就需要40亿*4这原创 2016-11-08 16:01:17 · 1787 阅读 · 0 评论 -
堆&&堆排序&&N个数中找出K个最大值&&优先级队列
学习二叉树后,有一个东西需要我们来关注下,就是堆,对于堆,来说我们可以把堆看作一颗完全二叉树。这里我们也可以叫做二叉堆。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。另外,需要关注的就是有一个大堆和一个小堆。 大堆就是父节点的数值大于任何一个子节点的数值。 小堆就是父节点的数值小于任何一个子原创 2016-10-14 12:39:51 · 3485 阅读 · 0 评论 -
哈希拓展——布隆过滤器
哈希表的另外一个应用是布隆过滤器。1.什么是布隆过滤器关于布隆过滤器,我们需要讲很多关于它的东西,首先我们可以知道这个东西是个叫做布隆的人发现的,它一般用于解决网络爬虫重复问题,还有比如防垃圾邮件或垃圾网页的实现,都可以利用它。布隆过滤器也是针对的是哈希冲突,可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有原创 2016-11-08 16:32:45 · 1363 阅读 · 0 评论 -
初识STL——set,multiset,map,multimap
最近在学习STL,在前期分析了vector和list的源码,印象很深,感觉对自己以后的代码之路产生了很多改变,今天,介绍下STL当中的几个关联式容器。本博客所有论述的都为SGI版本的STL。1.什么是关联式容器关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及po原创 2016-11-13 15:08:59 · 1583 阅读 · 0 评论 -
浅析——B树,B+树,B*树以及分析MySQL的两种引擎
接触到了数据结构当中的B树,B+树,B*树,我觉得应该写一篇博客记录下,毕竟是第一次接触的,只有写了博客以后,感觉对这个的印象才会更加深刻。 前言: 为什么要有B树? 学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢?这个要从几个方面来说了, 计算机有一个局部性原理,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。 所以当你用红黑树的时原创 2016-11-17 13:52:50 · 18136 阅读 · 5 评论 -
从直接插入排序到希尔排序
希尔排序需要和直接插入排序我们来联合起来进行比较。1.直接插入排序首先我们来看直接插入排序: 直接插入排序就是一个将无序区的内容向有序区放的一个过程,有序区不断地变大,无序区不断的变小,这样最后全部变为有序,就完成了直接插入排序的过程了。算法步骤:1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序原创 2016-11-17 14:15:17 · 1045 阅读 · 0 评论 -
二叉树——面试题
1.求二叉树中最远的两个节点的距离在这我们首先来分析思路,对于最远的两个节点,在这会有两种情况。1)如果root为NULL,那么这是一颗空树。空树的最远子节点距离和高度均为零。 2),如果root非空,最大距离要么是左子树中的最大距离,要么是右子树中的最大距离,要么是左子树节点中到根节点的最大距离+右子树节点中到根节点的最大距离,同时记录左子树和右子树节点中到根节点的最大距离。 示例代码://求原创 2016-11-30 12:33:21 · 1254 阅读 · 0 评论 -
选择排序及其优化
选择排序是八大内部排序方法中的一种,选择排序的整体的思想就是,我们在一个序列当中选出一个最大的(升序为最小的),然后和第一个元素交换,然后后面再在剩下的找最大的,再和第二个元素交换。这样最终就可以得到一个有序的序列。我们最先接触的就是这种写法。//Cpp版本template<typename T>void SelectSort(T* arr,int n){ int max = 0;原创 2016-11-23 22:22:22 · 9895 阅读 · 3 评论 -
快速排序及其优化
我们今天来研究下快速排序,快速排序的一个整体的思想就是分治的思想,在这个过程当中,首先对一个大区间进行单趟快速排序,然后把大区间分成多个区间,再去进行单趟排序,一直到这个区间中的元素只剩下一个元素,这样重复以后就可以得到最后的排序后的结果。 1.单趟排序分析快速排序的最重要的就是单趟排序,接下来就是进行分治的单趟排序,所以我们来重点说一下单趟排序。我们在这里介绍关于快速排序的单趟排序的三种方法。左原创 2016-11-23 22:13:46 · 2553 阅读 · 1 评论 -
分析归并排序
对于归并排序而言,我们应该需要关注一下思想,归并也是一种分治的思想,类似与快速排序,但是又和快速排序有本质的区别。归并排序归并排序将要排序的序列分成两个长度相等的子序列,然后对每一个子序列进行拆分,一直到只有两个元素的两个子序列,对这两个子序列进行归并,将它们合并成一个序列,这种方法就是所说的二路归并的方法。实现归并排序的思路: 所以,综合下来,我们实现代码://递归解决归并排序templat原创 2016-11-24 09:25:04 · 818 阅读 · 0 评论 -
内存池——实现一个简单的固定大小的内存池
最近在STL当中看到了第二级内存分配器,这里有个内存池的内容,在这在知乎上看到了内存池的相关内容,所以萌生了一个想自己写一个简单的内存池的想法。这种简单的内存池,援引自知乎的: 实现固定内存分配器: 即实现一个 FreeList,每个 FreeList 用于分配固定大小的内存块,比如用于分配 32字节对象的固定内存分配器,之类的。每个固定内存分配器里面有两个链表,OpenList 用于存储原创 2016-12-04 21:48:23 · 4213 阅读 · 1 评论 -
非比较排序—计数排序和基数排序
讲述完了比较排序以后,我们来看一下非比较排序。1.计数排序实现计数排序是一种稳定的排序算法,计数排序实现简单。它算法的步骤是:1)首先找出序列当中的最大和最小的数,然后通过这两个数确定一个范围,这样就可以直接建立一个范围这么大的哈希表。 2)把数对应哈希表的下标,统计次数。 3)通过哈希表,从小到大进行遍历,然后按哈希表顺序写入序列当中。 示例代码:#pragma once#define _C原创 2016-11-26 19:37:16 · 714 阅读 · 0 评论 -
从一道小米面试题看并查集
首先,我们从一道题来引出这个问题。假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友…),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。假如:n = 5,m = 3,r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋原创 2016-11-26 22:06:12 · 1597 阅读 · 1 评论 -
回溯法解决迷宫问题
迷宫问题,是一个非常经典的问题,我们通过栈这种数据结构来解决这个问题。1.设计思路我们这里采用回溯法解决迷宫问题,即从入口出发,顺某一方向试探,若能走通,则继续往前走,否则原路返回,换另一个方向继续试探,直至走出去为止。2.剖析实例例如,我们给定下面这样的迷宫:1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 10 0 0 1 1 1 1 1 1 11 1 0 1 1原创 2016-09-10 13:16:35 · 7081 阅读 · 1 评论 -
逆波兰表达式求值
逆波兰表达式:也被称作后缀表达式,在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。而逆波兰表达式,它的每个运算符总是和它前面的两个运算数进行结合。接下来我们来探讨一下逆波兰表达式求值的问题。1.确定保存形式在这里,我们利用枚举常量巧妙地来通用所有的元素。enum Type{ OP_SYMBOL, OP_NUMBER, ADD,原创 2016-09-11 22:02:07 · 1750 阅读 · 0 评论 -
关于队列和栈的几道面试题
关于队列和栈的几道面试题今天来说几道简单的栈和队列相关的几道面试题:1 . 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O (1 )第一道题,我们需要分析,我想一般的思维肯定是想到,开辟一块空间,进行保存最小值,这种方法也是大家通常地一下就可以想到的。但是在这里会有一个问题,就是如果你的最小值在栈顶,当你pop了栈顶以后,下面的数据中最小的元素就原创 2016-09-18 16:00:49 · 2505 阅读 · 2 评论 -
数据结构—顺序表的实现
线性表的顺序存储又称为顺序表。它是用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。第1个元素存储在线性表的起始位置,第i个元素的存储位置后面紧接着存储的是第i+1个元素。因此,顺序表的特点是表中元素的逻辑顺序与其物理顺序相同。所以在这里我们实现一下顺序表!seqlist.h#define _CRT_SECURE_NO_WARNINGS 1#if原创 2016-05-26 23:10:09 · 5338 阅读 · 0 评论 -
数据结构—动态顺序表的实现
前面我们实现了顺序表,但是我们应该会考虑到一个问题,顺序表一次性创建那么大空间造成的浪费很多,所以在这里,我们需要一个可以动态增长的顺序表来满足我们的需求!实现中需要注意的是:在这里我们要注意的是首先你应该给顺序表一个容量,当每次满了的时候,进行扩容!另外,在这里我分别使用了三种的排序算法:插入排序,选择排序,冒泡排序。dynamic_seqlist.h#define _CRT_SECURE_NO_原创 2016-06-01 19:05:43 · 3407 阅读 · 0 评论 -
排序算法总结(一)
今天,我们来总结一下排序算法: 排序分为冒泡排序,选择排序,插入排序,希尔排序,合并排序,快速排序,堆排序,基数排序等等,本篇文章我来详细解析冒泡排序,选择排序,直接插入排序。冒泡排序首先说说最简单的冒泡排序:从老谭那本书就开始认识冒泡排序了,这种方法简单易懂: 这张动图可以解释冒泡排序。 接下来,看代码的实现:#include<stdio.h>#include<stdlib.h>#i原创 2016-06-01 21:53:20 · 4911 阅读 · 0 评论 -
链式队列的实现
今天实现以下链式的队列,首先,要清楚对列是什么: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(head)进行删除操作,而在表的后端(tail)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 所以总结一下队列就是后进前出的一种数据结构,在这里,我们首先来写出链队列的实现。linked_queue.h#define _CRT原创 2016-06-08 17:57:54 · 2641 阅读 · 0 评论 -
巧妙利用栈实现计算器
首先我们实现一个计算器,用户所输入的为中缀表达式,这是通用的算术公式的表达方法,但是有一个缺点就是不容易被计算机所理解。所以,有了所谓的后缀表达式! 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 * 然后咱们通过栈来实现这个计算器的功能。 在这里中缀表达式转后缀表原创 2016-06-04 18:41:28 · 9800 阅读 · 0 评论 -
数据结构—单链表的实现
关于单链表,是最熟悉不过的一种数据结构了。今天,花费了很长的时间写出了单链表,和大家分享一下,有问题大家可以提出来!!!linklist.h#define _CRT_SECURE_NO_WARNINGS 1#ifndef __LINKLIST_H__#define __LINKLIST_H__#include<stdio.h>#include<stdlib.h>#include<assert原创 2016-06-04 15:37:47 · 3630 阅读 · 1 评论 -
链表面试题总结(一)
基于上一次写的链表,现在,我们来讨论下面这些问题。1.链表的冒泡排序 2.删除无头非尾节点 3.反转链表 4.在当前节点前插入一个数据x 5.查找链表的中间节点。 6.删除单链表的倒数第K个节点(K>1&&K<总长度)对于上面这6个问题,我们进行分析与解答。链表的代码我都已经写过博客:数据结构—单链表的实现另外,我也在我的github上有链表的代码,github链接如还有什么问题,可以发邮原创 2016-06-11 12:06:14 · 11835 阅读 · 1 评论 -
关于对称矩阵和稀疏矩阵问题的探究
今天我们来探讨下对称矩阵和稀疏矩阵的问题。 为什么要探讨这个问题呢,其实主要是为了他们的一些性质我们可以善加利用。1.对称矩阵对称矩阵:关于对称矩阵,元素以主对角线为对称轴对应相等的矩阵。 例如所以综合以上特点,我们就可以来想办法保存这个对称的矩阵,因为上面这个矩阵的上半部分和下半部分是一样的,所以在这里我们只需要保存一半,然后我们将对角线也进行保存就好了,所以,在这里,我们所以思路就是我们先对原创 2016-09-24 11:36:18 · 2719 阅读 · 0 评论 -
搜索二叉树
二叉搜索树:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树有个特点,最左的是最小的节点,最右的是最大的节点。 当我们把二叉搜索树进行中序遍历的时候,它是进行排序后的结果,所以我们也把二叉搜索树叫做排序二叉树。接下来我们介绍二叉原创 2016-10-21 20:41:24 · 1787 阅读 · 0 评论 -
剑指offer—关于判断二叉树是否为平衡二叉树
判断一颗二叉树是否为平衡二叉树,当这到面试题摆在我们眼前的时候,我们需要进行思考,二叉树满足平衡二叉树的条件是什么,就是对于每一个节点,它的右子树深度减去左子树的深度的绝对值必须是小于2才行。对于这个深度差,我们也叫做平衡因子。所以,根据上面的条件,我们可以进行一种最简单的思路,就是我们首先可以对每一个节点进行遍历,然后看它的平衡因子进行比较判断,看它是不是合法。 bool _IsAVLBin原创 2016-10-23 20:41:17 · 12424 阅读 · 0 评论 -
浅析AVL树
1.为什么提出AVL树学习完搜索二叉树以后,我们应该想到一个问题,如果我们的搜索二叉树的趋向于单链的形式,类似于: 这两种情况随之而来的是时间复杂度太高,当我们在这两种当中搜索,时间复杂度为O(N),所以这样效率大大下降了!2.二叉平衡树概念和结构为了解决上述问题,所以提出了一个概念,叫做二叉平衡树。二叉平衡树,相对于二叉搜索树,引入了一个叫做平衡因子的概念。 平衡因子:平衡因子就是右子树的原创 2016-10-27 11:03:41 · 2587 阅读 · 0 评论 -
简单实现二叉树
简单的实现一个二叉树所需要的基本要求,后续进行其他的更新。二叉树最重要的是递归的思想,在这里我想请你去参考我上一篇的广义表,那个思想比起二叉树来说更加简单一些。#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<cstdlib>#include<cassert>#include<queue>using namespace s原创 2016-09-26 14:10:13 · 1118 阅读 · 0 评论 -
二叉树的非递归的实现
二叉树的非递归的实现,其实就是实现二叉树递归的思想,二叉树的递归实现压栈,然后递归,在这里,是通过数据结构栈来实现。1.非递归前序遍历因为二叉树前序遍历是先访问根节点,在访问左节点,再是右节点,所以我们在这里首先循环到最左节点,并且在这个过程中,输出访问的节点,并且把节点入栈,这样就到最左边的节点,然后看最左边节点的左子树,这时为NULL,然后取出栈顶元素。这个时候就回到最左边的节点,然后访问它的右原创 2016-09-27 15:28:07 · 1070 阅读 · 0 评论 -
线索化二叉树
关于二叉树的线索化的问题,是为了解决平时的节点中空的指针域,所以在这里我们引入了线索化二叉树。利用一些节点当中空的指针域。线索化二叉树的思想是需要一个prev指针来记住前驱,然后通过对cur节点的维护和prev指针分别进行维护。#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<cstdlib>using namespace st原创 2016-10-09 14:37:46 · 1184 阅读 · 0 评论 -
广义表的实现
广义表:广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。毫无疑问,广义表是一种线性表的推广,也有人叫做列表。广义表存储结构广义表中的元素是可以具有不同结构的,所以难以用顺序结构来表示,通常都采用链式的存储结构。在这个结构中我们共有三种类型的节点,一种保存正常值的,一种是头节点,一种是子表节点。 在这里我们来看看下原创 2016-09-24 14:04:32 · 1763 阅读 · 0 评论 -
浅析红黑树(一)
1.了解红黑树学习完AVL树,开始了红黑树的学习,关于红黑树,和AVL树是类似的,都是会在我们进行插入操作或者删除操作以后会进行一些操作,来使得整个二叉树保持一个平衡。红黑树和AVL树的区别在于一个是依照平衡因子来维持整个树,而红黑树是利用颜色来限定平衡。 自从红黑树出现以后,AVL树就慢慢消失了,原因,会在后面讲解。另外,最为重要的是在STL当中,有很多都应用了红黑树,比如:set, multis原创 2016-10-30 12:18:17 · 1990 阅读 · 0 评论