
数据结构
文章平均质量分 75
德卡拉
始于乐趣 终于经典
展开
-
迭代器失效问题及迭代器的应用
说到迭代器,首先我们要了解STL提供的六大组件,彼此可以组合套用: 1、 容器(Containers):各种数据结构,如:vector、list、deque、set、map。用来存放数据。从实现的角度来看,STL容器是一种class template。 2、 算法(algorithms):各种常用算法,如:sort、search、copy、erase。从实现的角度来看,STL算法是一种 fu原创 2017-12-08 11:41:04 · 268 阅读 · 0 评论 -
RBT红黑树
引入 最开始我们学习了搜索二叉树,但是最后我们发现搜索二叉树有缺陷,之后我们又引入了AVL树。AVL树是一种高度平衡的二叉搜索树,能够满足增删查都是O(logN)的时间复杂度。既然AVL树已经满足了我们的期望,那么为什么还要引入红黑树呢? 这是由于AVL树是高度平衡的二叉搜索树,维持一颗AVL树的代价相比于红黑树来说是非常大的,由于它的高度平衡,使得它几乎每次插入或者删除都需要调...原创 2018-03-28 16:37:55 · 309 阅读 · 0 评论 -
处理大数据———位图以及布隆过滤器
相应知识点回顾: (一)内存单位的转换 1int = 4byte 1kb = 1024byte 1M = 1024kb 1G = 1024M 4G = 4*1024*1024*1024=42亿九千万(二)逻辑运算 (1)按位与运算&: 只有对应的两个二进位均为1时,结果位才为1 ,否则为0 (2)按位或运算|:只要对应的二个二进位有一个为1...原创 2018-04-22 22:58:02 · 363 阅读 · 0 评论 -
海量数据处理
1)给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 初步分析: 100G普通机器内存中肯定是放不下的,目前使用的IP地址相当于一个32位的字符串,所以我们考虑切分,假设有1G可用内存我们切分为100份,那我们需要把这100个文件全部遍历,每一次出现的IP地址进行统计,最后找出出现次数最多的IP地址,此办法可行但是效率不高。 优化: 把...原创 2018-05-09 11:32:39 · 602 阅读 · 0 评论 -
数据结构:哈希表
哈希概念: 构造一种存储结构,通过某种函数使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该结构中插入元素时,根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放。 当先结构中搜索元素时,对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若关键码相等,则搜索成功。 该方...原创 2018-04-21 09:19:21 · 419 阅读 · 0 评论 -
插入排序和选择排序
排序:将一组杂乱无章的数据按照一定的规则有组织地排列起来。 排序的稳定性:如果在排序中,存在前后相同的两个元素的话,排序前和排序后他们的相对位置不发生变化。 今天,先来学习插入排序和选择排序: 插入排序 直接插入排序 (1)思想: 每一步将一个待排序的元其排序码的大小,插入到前面已将排好序的一组元素的合适位置上去,直到全部元素插入完为止。 元素集合越接近有序,直接插入排...原创 2018-05-18 10:04:26 · 3140 阅读 · 0 评论 -
交换排序
利用交换元素的位置进行排序的方法称作交换排序 冒泡排序: (1)思想(以升序为例): 比较相邻的元素,如果第一个比第二个大,就交换它们,从开始的第一对到结尾最后一对作相同的工作,第一轮下来会将最大的数冒到最右边,然后区间右边减少一个,重复上述步骤,直到区间缩小为1。(2)图解: 实现4趟冒泡排序就可将下列数组排为有序。 (3)优化思想: 设置标志位,用来判断该次排...原创 2018-05-18 11:38:32 · 4676 阅读 · 0 评论 -
归并排序和计数排序
归并排序 (1)思想: 将待排序的元素序列分成两个长度相等的子序列,对每一个子序列排序,然后将她们合并成一个序列,合并两个子序列的过程的过程称为二路归并。(2)步骤: 将数组按二分法分成两个区间,继续将区间进行递归划分,直到区间只有一个数为止;将相邻两个区间进行排序,使之合并为有序的区间;返回上一层递归,继续合并,直到全部被合并。(3)图解: (4)复杂度:...原创 2018-05-21 17:45:26 · 950 阅读 · 0 评论 -
数据结构:并查集和图
并查集 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。 常涉及两个基本操作 (1)合并两个不相交的集合 (2)判断两个元素是否属于同一个集合。将N个不同元素分成一组不想交的集合。开始时,每个元素就是一个集合,然后按照规律将两个集合进行合并。 通过上述分析不难发现: 确定一共有几个集合? 观察有几个下标的值小于0,就有几个集合。 判断两个数据...原创 2018-05-24 22:09:14 · 1097 阅读 · 1 评论 -
AVL平衡搜索树
平衡? 平衡搜索二叉树是一种高度平衡的二叉排序树, 什么叫做高度平衡呢?意思是要么它是一颗空树,要么它的左子树和右子树都是平衡二叉树。平衡因子:二叉树上节点的左子树深度减去右子树的深度的值 最理想的平衡条件是左右两个子树的高度完全相等,但只有节点数为2^n-1(n为层数)的树才满足,当插入一个节点时,这种绝对状态便会被破坏,所以要求一颗AVL树左右子树高度差最多为1.也就是平衡因子...原创 2018-03-26 21:04:05 · 206 阅读 · 0 评论 -
堆的基本操作及堆排序
堆简介 堆是一种特殊的数据结构,它通常是一个可以看做一棵树的数组对象。 堆既然是一个数组,它便通过下标以二叉树的方式来保存。 以下图二叉树模型为例 红色数字代表节点的值,黑色数字代表节点的下标。 这是一颗乱序的完全二叉树,可以观察到 父节点下标 = (左孩子下标-1)/2 左孩子下标 = (父节点下标*2)+1 根据以上规律便可以很好地存储一棵树了。 堆有两种存储结构: 最...原创 2018-03-14 13:05:58 · 250 阅读 · 0 评论 -
线索化二叉树
什么是线索化?下图二叉树中的指针域并不是充分的利用了,有许许多多的”^”,也就是空指针域的存在,为避免浪费,我们最好充分利用起来。 对上图二叉树做中序遍历得到HDIBJEAFCG这样的字符序列,节点I的前驱是D,后继是B,遍历过后我们可以很清楚直到任意节点的前驱和后继是哪一个。可以在二叉链表上,我们只能知道每个节点指向其左右孩子节点的地址,而不知道其前驱是谁,后继是谁。要想知道必须遍历...原创 2018-03-23 20:48:17 · 372 阅读 · 0 评论 -
STL--vector容器用法
我们都知道,数组是静态地分配空间放入对应的元素,一旦配置了就不能改变,若要改变其大小,需要进行“配置新空间->数据移动->释还新空间”的过程,成本代价太高。接下来就体现了vector的优势。 vector功能:实现动态的分配数组,数组元素的大小随着vector对象元素个数变化而变化。 vector的数据结构:线性连续空间,会分配额外的空间以适应可能的增长,这里也体现了容量的观念。 vector原创 2017-12-03 16:09:10 · 203 阅读 · 0 评论 -
数据结构:二叉树的递归实现
一,概念 二叉树就是一颗特殊的树,二叉树每个结点最多有两个孩子结点,即就是左孩子和右孩子。接下来我们将以此树为例来进行分析! 表示 (1)数组表示 当二叉树的大小和形态不发生剧烈变化时,用一组连续的存储单元存储二叉树的数据元素,为反应各结点在二叉树中的位置及相互关系,须适当安排各结点的存储次序。 假若一个子结点的下标为i,那仫它的父节点的下标为:(i-1)原创 2017-12-26 19:10:29 · 772 阅读 · 0 评论 -
反转单链表+求单链表倒数第k个节点+不用加减乘除做加法
一,逆置/反转单链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。(1)反转指针ListNode* ReverseList(ListNode* head){ ListNode* cur == NULL; ListNode* prev == NULL; ListNode* next == NULL; if(head == NU原创 2018-01-20 20:10:21 · 260 阅读 · 0 评论 -
链表相交带环问题+复杂链表的复制
一, 判断单链表是否带环?若带环,求环的长度?求环的入口点? (1)判断是否带环:利用快慢指针法,快指针一次走两步,慢指针一次走一步,若快慢指针相遇,说明链表带环,并且返回相遇点即此时慢指针所指处,无环则返回NULL。//判断是否带环Node* IsHaveLoop(Node* head){ if(head == NULL) { return NULL;原创 2017-09-23 20:54:27 · 568 阅读 · 0 评论 -
二叉树的非递归遍历(前序,中序,后序)
之前我们通过递归的方式来实现二叉树的:http://blog.youkuaiyun.com/zjx624bjh/article/details/78905493采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,但如果我们的二叉树只有左子树,而且树的高度还很深的时候,这个时候递归调用遍历的时候,栈帧空间开辟的较大,很可能造成栈溢出。但是我们一个程序中,为堆分配的空间要比栈大的多,所以对于树的遍历可...原创 2018-02-13 19:16:09 · 375 阅读 · 0 评论 -
栈和队列之经典(上篇)
要完成下面关于栈和队列的题目,首先要明白 栈的特性:后进先出 队列的特性:先进先出 (1)实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1) 。 本题的关键是要得到栈的最小元素min,我们的第一反应可能是每次压入一个新的元素时,将栈里所有元素排序,让最小元素位于栈顶,但是这样破坏了栈的规律,它不能保证最后入栈的元素可以最先出栈。 ...原创 2017-12-11 17:11:04 · 226 阅读 · 0 评论 -
二叉树相关面试题(上)
一,将二叉搜索树转换为一个排序的双向链表。 提示:要求不能创建任何新的结点,只能调整树中节点的指向。 eg: 搜索二叉树:左节点的值小于父节点的值,右节点的值大于父节点的值。 思路:二叉树中每个节点有两个指向子节点的指针,双向链表中每个节点也有两个指针,两个节点结构相似,同时二叉搜索树也是一种排序的数据结构。因此理论上可能实现二叉搜索树和排序双向链表的转换。 步骤:在将二叉搜索树转换...原创 2018-03-02 16:27:00 · 989 阅读 · 0 评论 -
二叉搜索树的基本操作
概念:二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树 (1)若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。 (2)若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。 (3)它的左右子树也分别为二叉搜索树。 下图就是一棵标准的搜索二叉树 构造一棵二叉搜索树的目的其实并不是为了排序而是为了提高查找和插入删除关键字的速度,在一个有序数据集上...原创 2018-03-19 20:53:22 · 293 阅读 · 0 评论 -
文件压缩(哈夫曼树)
以字符串“aaaabbbccd”为例实现文件压缩。 (1)统计各字符出现个数 a:4 b:3 c:2 d:1 (2)利用各字符出现的字符作为权值构建huffman树 哈夫曼树又称为最优二叉树,是加权路径长度最短的二叉树。 构建规则:每次在给定数据中挑选出两个权值最小的数,分别作为左右孩子节点,构建一个父节点将两个孩子节点链接起来,父节点权值等于左右孩子权值之和,然后再将父节点放回存...原创 2018-08-02 22:11:07 · 2373 阅读 · 1 评论