数据结构
文章平均质量分 59
清枫若待佳人醉
目前就职腾讯,从事推荐引擎相关工作,有感兴趣的可以互相讨论。
展开
-
二叉树的基本操作
唯一需要注意的就是里面几种遍历的非递归实现,借助了队列和栈来进行实现。 下面是完整的代码:#pragma once#include<iostream>#include<stack>#include<queue>using namespace std;//孩子表示法template<class T>struct BinaryTreeNode{ BinaryTreeNode(co原创 2017-05-21 11:21:02 · 223 阅读 · 0 评论 -
链表面试题-逆置单链表和逆序打印单链表
先来讨论逆序打印的问题:逆序打印:所谓逆序打印,就是先打印整个链表的最后一个节点,故此可以使用一个栈,只要节点存在就一直入栈,当所有的节点都入栈后,此时最后一个节点就在栈顶了,然后一次pop()即可。代码实现:void PrintTailToHead(Node* Head){ if(Head == NULL) return; stack&...原创 2018-03-13 10:03:28 · 580 阅读 · 1 评论 -
链表面试题-合并两个有序单链表(递归和非递归)
题目描述: 合并两个有序单链表,使得最终的链表也是递增的。节点的结构typedef struct ListNode{ ListNode* _next; int _data;}Node;递归:Node* MergeListR(Node* Head1,Node* Head2){ if(NULL == Head1 || NULL == ...原创 2018-03-12 09:35:03 · 514 阅读 · 1 评论 -
链表面试题-单链表带环和环的入口点问题
带环问题判断链表是否带环如果带环则环长是多少求环的入口点1、判断单链表是否带环思路:设置一个快指针,每次走两步,再设置一个慢指针每次走一步。然后判断是否有交点即可。 就好比你在环形跑道和别人赛跑,不管你俩速度如何,只要他比你快,总会追上你将你套圈(甩你好几圈的意思)基于这种思路实现如下代码://判断链表是否带环bool IsExistLoop(Node* H...原创 2018-03-11 10:09:17 · 461 阅读 · 0 评论 -
链表面试题-复杂链表的复制
题目描述: 请实现函数ComplexListNode* Clone(ComplexListNode* Head),复制一个复杂链表,在复杂链表中,每个节点除了有一个_next指针指向下一个外,还有一个Sibling指针指向链表中的任意节点或者nullptr。节点类型struct ComplexListNode{ int _data; ComplexLis...原创 2018-03-15 15:13:18 · 224 阅读 · 0 评论 -
链表面试题-单链表排序(冒泡,快速,归并)
面试中单链表是一个被问及频率很高的问题,这几天同学面试中多次被问及,所以今天整理一下。注:对链表排序时,只需要交换结点间的_data即可,如果想法是改变指针,那么只能是走弯路了。结点类型struct Node{ //构造函数 Node(int data) :_next(nullptr) ,_data(data) {} Node...原创 2018-03-15 12:40:42 · 2855 阅读 · 2 评论 -
布隆过滤器
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。背景介绍: 在一个集合内想要快速查找一个元素是否存在,如果是整数集合的话,可以直接采用位图,可以在O(1)的时间复杂度内判断出是否存在,但是位图的缺陷很原创 2017-12-07 14:48:51 · 229 阅读 · 0 评论 -
两个栈实现一个队列&两个队列实现一个栈
两个栈实现一个队列实现思路:定义两个栈stack1,stack2。stack1存放入队列序列,stack2存放出队列序列。如果进行Push操作,直接对stack1进行操作。如果进行Pop操作,stack2不为空,直接对stack2进行Pop操作,如果stack2为空,将stack1中的数据Push进stack2,然后对stack2进行操作。整个流程如下图: 先Push 1 2 3,然后进原创 2017-12-06 15:37:17 · 272 阅读 · 0 评论 -
出栈的合法性检测
对于一个给定的入栈顺序,可能的出栈顺序会有很多,但是肯定都要遵循栈“后进先出”的特点,那么怎么进行合法性检测呢?算法思想如下:定义变量InIndex标记入栈序列的当前位置,定义OutIndex标记出栈序列的当前位置对InIndex和Outindex处的数进行比较,如果相同,同时往后走。如果不相同,则出栈序列去和辅助栈的栈顶的数据比较,如果相同,则pop掉栈顶,++OutIndex,然后继续和栈原创 2017-12-02 18:24:01 · 1026 阅读 · 0 评论 -
实现最小栈
题目要求实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)首先针对这道题有多重解决方案。 1、定义两个栈,一个正常栈,另一个栈的栈顶始终保存整个栈内的最小值。思路如下:无论Push什么数据,正常栈肯定直接Push进去。而当新Push的数据大于最小栈的栈顶时,最小栈将自己的栈顶再次Push一遍。而当新Push的数据小于最小栈的栈顶时,意思是该原创 2017-12-02 17:17:30 · 888 阅读 · 0 评论 -
位图
位图(Bit Map)是一个数组的每一个数据的每一个二进制位表示一个数据,0表示数据不存在,1表示数据存在。不好理解的话,由下面这道题来引出位图的使用: 给出40亿个不重复的无符号整数,没排过序,给出一个无符号整数,如何快速判断一个数是否在这40亿个数中?解题思路:首先没由给出数的范围,只说了无符号整数,所以就要考虑到0到最大整数42亿的整个区间的所有数。所有数据没有排过序,故而不能使用类似二原创 2017-12-07 11:15:43 · 347 阅读 · 0 评论 -
堆的实现以及优先级队列
堆的概念堆是将一组数据按照完全二叉树的存储顺序,将数据存储在一个一维数组中的结构。 堆有两种结构,一种称为大顶堆,一种称为小顶堆,如下图。 小顶堆:任意结点的值均小于等于它的左右孩子,并且最小的值位于堆顶,即根节点处。 大顶堆:任意结点的值均大于等于它的左右孩子,并且最大的值位于堆顶,即根节点处。既然是将一组数据按照树的结构存储在一维数组中,那么父子之间关系的建立就很重要了。 假设一个节点的原创 2017-10-08 11:34:42 · 3569 阅读 · 0 评论 -
二叉搜索树-红黑树
前面介绍了AVL树,虽然AVL树将二叉树的高度差保证在1,但是实现的太过复杂,因为要不断调整平衡因子。故而要来介绍另外一个用途比较广的结构-红黑树。红黑树先来看来红黑树的特性: 1、每个节点非红即黑 2、根节点为黑色 3、不能有连续的红节点 4、每条路径上的黑色节点数相等 5、空节点为黑色先来想一个问题,红黑树的定义保证它最长路径不会超过最短路径的二倍,那么来想想为什么?节点的结构因为搜索原创 2017-11-14 15:14:52 · 452 阅读 · 0 评论 -
二叉搜索树-AVL树的实现
首先,AVL树是一棵加了额外平衡条件的搜索树。这是因为普通的搜索树如果插入的key接近有序的话,二叉树将会退化成一个单链表,导致查找的时间复杂度为O(N),而AVL树中用一个平衡因子来制约树的左右子树的高度,保证任何节点的左右子树高度之差最多相差1,这样就能保证树深度的平衡状态。既然AVL树是一课搜索树,它就满足搜索树的性质,这里就不啰嗦了,可以参考二叉搜索树的基本实现。AVL实现原理假设有一组元素原创 2017-10-19 12:18:29 · 495 阅读 · 0 评论 -
动态查找之-二叉排序树
二叉排序树简叙从图上可得出二叉排序树的基本概念。左子树小于根,右子树大于根中序遍历后有序树中最小的树在最左边,最大的在最右边这里主要分析一下二叉排序树的插入和删除。插入 pCur = new Node(key, value); if (key < pParent->_key) { pParent->_pLeft = pCu原创 2017-05-20 18:32:49 · 419 阅读 · 0 评论 -
c++智能指针
C++ 智能指针详解,本文系转载,原文出处 诚然原博主总结的非常好,我只是加一些自己觉得需要补充的地方,并且在最后给出目前c++11在智能指针这方面的弥补。一、简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。 用智能转载 2017-09-13 11:37:28 · 352 阅读 · 0 评论 -
exit()函数
进程的终止方式: 有8种方式使进程终止,其中前5种为正常终止,它们是 1:从 main 返回 2:调用 exit 3:调用 _exit 或 _Exit 4:最后一个线程从其启动例程返回 5:最后一个线程调用pthread_exit 异常终止有3种,它们是 6:调用 abort 7:接到一个信号并终止 8:最后一个线程对取消请求做出响应exit()函数整个过程: 1、调用atex原创 2017-05-07 13:21:02 · 982 阅读 · 1 评论 -
数据结构查找之-单链表的基本操作
先给出结构体的定义:#include<stdio.h>#include<assert.h>#include<malloc.h>typedef int DataType;typedef struct Node{ struct Node* next; DataType data;}Node, *PNode;//这里定义一个结构体类型和一个结构体指针类型单链表的基本操作实现://原创 2017-03-11 16:53:13 · 894 阅读 · 0 评论 -
string中的npos
STL中的string.find()函数原型如下:size_t find (const string& str, size_t pos = 0) const noexcept;size_t find (const char* s, size_t pos = 0) const;size_t find (const char* s, size_t pos, size_type n)...原创 2018-06-27 14:02:44 · 1271 阅读 · 0 评论