数据结构
生活在醉光明的角落
这个作者很懒,什么都没留下…
展开
-
【数据结构】单链表—冒泡排序
单链表的排序(冒泡排序)原创 2016-07-26 09:56:18 · 687 阅读 · 0 评论 -
【数据结构】布隆过滤器
布隆过滤器(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。 它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难,但是没有识别错误的情形。在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中原创 2016-09-04 11:22:57 · 422 阅读 · 0 评论 -
【数据结构】位图
位图(bitmap),就是用一块内存区域的每个比特表示一个对象的数据结构。优点是速度快,内存空间占用小,能表示大范围的数据。假设要对0到一千万范围内的、没有重复元素的正整数排序,则利用位图数据结构很合适。应用场景: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 思路:如果内存够的话,40亿个整型使用位图存储需要500M左右的空间。#pragm原创 2016-09-04 11:12:22 · 360 阅读 · 0 评论 -
【数据结构】单链表—寻找两个相交链表中第一个公共结点 — 蛮力法 / 栈 / 指针先走
题目:输入两个链表,找到它们的第一个公共结点。思路一:蛮力法 在第一个链表上顺序遍历每一个结点,每遍历一个节点在第二个链表顺序遍历每一个结点,如果第二个链表上有一个结点和第一个链表上一样,说明两个链表在这个结点上重合,于是就找到它们的公共结点。len1 = m,len2 = n,时间复杂度为O(mn)。思路二:栈 分别把两个链表的结点放入两个栈里,这样两个链表的尾结点就位于两个栈的栈顶,接下来就原创 2016-07-26 13:44:25 · 678 阅读 · 0 评论 -
【数据结构】单链表—合并两个排序链表 — 递归
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍使按照递增排序的。思路: 代码如下:template<class T>struct ListNode{ T _value; ListNode<T>* _next; ListNode(const T& value) :_value(value) ,_next(NULL)原创 2016-07-26 13:26:33 · 466 阅读 · 0 评论 -
【数据结构】单链表—在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。思路:如果按常规思路来 删除一个结点需要找到该结点的前一个结点,将这个节点的_next指向被删除节点的 _next,找到这个该结点的前一个结点就需要遍历链表,此时就不是O(1)时间。 删除结点我们不需要找到前一个结点,我们可以很方便的找到后一个节点,我们可以把后一个节点的值给前一个结点原创 2016-07-26 13:06:55 · 531 阅读 · 0 评论 -
【数据结构】单链表—从尾到头输出单链表 — 栈 / 递归
题目:输入一个链表的头节点,从尾到头反过来打印每个节点的值思路一:遍历的顺序是从头到尾,而输出的顺序是从尾到头,也就是说第一个遍历的最后一个输出,最后一个遍历的第一个输出,这是先进后出,我们可以借助栈,遍历链表将每一个节点放入栈中,然后再从栈顶逐个输出节点的值。此时输出的顺序已经反过来了。思路二:可以用栈实现我们就可以想到递归。我们每访问一个结点时,先递归输出后面结点的值,然后再输出自身的值,这样链原创 2016-07-26 12:01:07 · 2428 阅读 · 0 评论 -
【数据结构】单链表—判断一个链表是否形成了环形结构 — 快慢指针
题目:判断一个链表是否形成了环形结构? 思路:定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步,如果走的快的指针追上走的慢的指针,那么链表就是环形链表,如果走的快的指针走到了链表的末尾都没有追上第一个指针,那么这个链表就不是环形链表。代码如下:template<class T>struct ListNode{ T _value; ListNode<原创 2016-07-26 11:48:55 · 746 阅读 · 0 评论 -
【数据结构】单链表—链表中倒数第K个结点 — 快慢指针
输入一个链表,输出该链表中倒数第K个结点。注:链表的尾结点是倒数第一个结点。 思路一: 遍历一遍链表,求出链表的长度。 正数 = 长度 - 倒数 + 1 如图所示: 然后遍历正数的次数,便得到了倒数第K个结点。但是这种方法需要遍历链表两次。思路二: 遍历一次可以用快慢指针解法,即定义两个指针,快指针和慢指针,求倒数第K个:结点快指针先走K-1步,然后快慢指针一起走当快指针走到结尾,慢原创 2016-07-26 11:40:23 · 533 阅读 · 0 评论 -
【数据结构】单链表—求链表中间节点(只遍历一次链表)— 快慢指针
题目:给出一个单链表的,不知道结点N的值,怎样只遍历一次就可以求出中间结点。我们可以定义两个指针,快指针和慢指针,都从头开始遍历链表,快指针每次走两步,慢指针每次走一步,当快指针走到结尾时,慢指针指向的便是链表的中间节点。代码如下:template<class T>struct ListNode{ T _value; ListNode<T>* _next; ListNode原创 2016-07-26 10:37:59 · 1332 阅读 · 0 评论 -
【数据结构】单链表—逆置单链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并返回反转链表后的头结点。 我们可以借助图来分析一下:我们定义一个新的头结点为head,将begin指向head->_next,当begin不为空的时候,tmp = begin,begin = begin->_next,此时tmp是我们要摘下来的结点。tmp->_next = head; head = tmp;就完成了结点链接的操作。当循环走完时原创 2016-07-26 10:28:26 · 4893 阅读 · 0 评论 -
【C++】顺序表的实现
顺序表:用一段地址连续的存储单元依次存储数据元素的线性结构。为什么要实现顺序表? 定义数组,长度是固定的比如数组num,只能存储十个元素,如果多于十个元素,也不能再增加存储空间了,不能动态分配内存。 顺序表是连续的存储空间。不同之处在于可以动态分配内存。静态存储&动态存储 // 顺序表的静态存储(存在的问题:空间不能增大或缩小) typedef int DataType; typede原创 2016-08-13 10:11:44 · 340 阅读 · 0 评论