数据结构
文章平均质量分 59
birate_小小人生
专注,自信,坚持
展开
-
红黑树的系列文章
最近看到一篇写的很详细的红黑树的系列文章:红黑树(一)之 原理和算法详细介绍红黑树(二)之 C语言的实现红黑树(三)之 Linux内核中红黑树的经典实现红黑树(四)之 C++的实现转载 2021-09-12 17:33:54 · 77 阅读 · 0 评论 -
布隆过滤器的设计和实现
什么情况下需要布隆过滤器?先来看几个比较常见的例子字处理软件中,需要检查一个英语单词是否拼写正确在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上在网络爬虫里,一个网址是否被访问过yahoo, gmail等邮箱垃圾邮件过滤功能这几个例子有一个共同的特点: 如何判断一个元素是否存在一个集合中?常规思路数组链表树、平衡二叉树、TrieMap (红黑树)哈希表虽然上面描述的这几种数据结构配合常见的排序、二分搜索可以快速高效的处理绝大部分判断元素是否存在集合中的需求。但是当集合里面的元素数量原创 2021-01-04 22:19:14 · 689 阅读 · 0 评论 -
C++数据结构 23 图-广度优先搜索(BFS)
#include <iostream>#include <stack>#include <queue>#define MAX_VERTS 20using namespace std;/**使用邻接矩阵来表示一个图**/class Vertex{public: Vertex(char lab) { Label=la...原创 2018-11-05 21:03:18 · 393 阅读 · 0 评论 -
C++数据结构 23 图-深度优先搜索(DFS)
还是按邻接矩阵的图,使用深度优先搜索(DFS:使用堆栈) #include <iostream>#include <stack>#define MAX_VERTS 20using namespace std;/**使用邻接矩阵来表示一个图**/class Vertex{public: Vertex(char lab) {Label...原创 2018-11-05 20:40:49 · 335 阅读 · 0 评论 -
C++数据结构 22 图-邻接表
#include <iostream>#include <list>using namespace std;class Vertex{};template<class T>class Graph{public: Graph(const int vertices):n(vertices) { Vert...原创 2018-11-05 19:02:42 · 257 阅读 · 0 评论 -
C++数据结构 21 图-邻接矩阵
#include <iostream>#define MAX_VERTS 20using namespace std;/**使用邻接矩阵来表示一个图**/class Vertex{public: Vertex(char lab){Label=lab;}private: char Label;};class Graph{public: ...原创 2018-11-05 17:22:55 · 406 阅读 · 0 评论 -
C++数据结构 20 哈希
哈希(hash_map)是最快的数据结构算法,但是插入数据是以无序的方式插入的,所以数据是没有排序的.二叉树(tree_map)比哈希慢点(O(LogN)),但是二叉树是以排序方式插入的(大的数据在根的右边,小的数据在根的左边)。哈希不是标准的stl,但是VS里面可以直接包含<hash_map>直接使用代码:#ifndef __LinearMap_H__#defin...原创 2018-11-05 13:28:07 · 419 阅读 · 0 评论 -
C++数据结构 17 二叉查找树
Bst(Binary Search Tree)有以下性质: 每一个元素有一个键值,而且不予许重复 左子树的键值都小于根节点的键值 右子树的键值都大于根节点的键值 左右子树都是二叉查找树 代码:#ifndef __BST_H__#define __BST_H__#include<iostream>using namespace st...原创 2018-10-24 18:18:43 · 203 阅读 · 0 评论 -
C++数据结构 19 堆排序
堆排序就是把一个数据的元素放入堆中,然后在依次取出来。很简单,不多说原创 2018-10-29 15:09:38 · 117 阅读 · 0 评论 -
C++数据结构 18 堆
堆:使用数组实现堆的实现通过构造二叉堆(binary heap),实为二叉树的一种;由于其应用的普遍性,当不加限定时,均指该数据结构的这种实现。这种数据结构具有以下性质。任意节点小于(或大于)它的所有后裔,最小元(或最大元)在堆的根上(堆序性)。 堆总是一棵完全树。即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右填入。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆...原创 2018-10-29 14:57:59 · 215 阅读 · 0 评论 -
C++逆波兰算法
逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示式。 逆波兰是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+c...原创 2018-11-30 13:16:58 · 5288 阅读 · 1 评论 -
leetcode_刷题五 二叉树与图
树是n(n>=0)个节点的有限集,且这些节点满足如下关系:1.有且仅有一个节点没有父节点,该节点称为树的根。2.除根外,其余的每个节点都有且仅有一个父节点3.树中的每一个节点都构成一个以它为根的树。二叉树有前序遍历、中序遍历和后序遍历。二叉树有深度优先遍历(DFS使用栈)和广度优先遍历(BFS使用队列): //深度优先搜索 //利用栈,现将右子树压栈再将左子树压栈 void ...原创 2019-06-09 17:26:53 · 283 阅读 · 0 评论 -
Leetcode 刷题1
例题一:链表逆序 leetcode206已知链表头结点指针head,将链表逆序。(不可申请额外空间)依次遍历链表节点,每遍历一个节点即逆置一个节点ListNode *reverseList(ListNode * head){ ListNode* new_head = NULL; while(head){ ListNode * next = head->next; ...原创 2019-06-30 22:31:57 · 166 阅读 · 0 评论 -
Linux多线程
创建线程#include <pthread.h>int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,void *(*start_rtn)(void),void *arg)tidp:线程idattr:线程属性(通常为空)start_rtn:线程要执行的函数arg:start_rtn的参数编译的时候需要加...原创 2018-12-08 15:33:05 · 132 阅读 · 0 评论 -
Leetcode 刷题2
栈:先进后出的数据结构:在STL中有S.top()S.empty()S.push(x)S.pop()S.size()队列:先进先出的线性表:Q.empty()Q.front()Q.back()Q.pop()Q.push(x)Q.size()第一题:使用队列实现栈:实现一个栈,支持如下操作,这些操作的算法复杂度需要是常数级,O(1),栈的内部存储数据的结构为队列,队列的方...原创 2019-07-03 21:53:39 · 116 阅读 · 0 评论 -
Leetcode刷题3
第一题:已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s>=某个孩子的需求因子g时,代表该糖果可以满足该孩子;求使用这些糖果,最多能满足多少孩子?(每个孩子最多只能用1个糖果满足)例如:需求因子数组g = [5,10,2,9,15,9];糖果大小数组s=[6,1,20,3,8];最多可以满足3个孩子。 leetcode 455这题我们可以用贪心来做:可...原创 2019-07-07 22:28:45 · 744 阅读 · 0 评论 -
Leetcode刷题 9
动态规划:第一题:爬楼梯 leetcode 70在爬楼梯时,每次可向上走1阶台阶或2阶台阶,问有n阶楼梯有多少种上楼的方式?思考:用常规得到暴力搜索肯定时间通不过,故我们分析。由于每次最多爬2阶,楼梯的第i阶,只可能从楼梯的第i-1阶与第i-2阶到达,故到达第i阶有多少种爬法,只与第i-1阶、第i-2阶的爬法数量直接相关。所以第i阶的爬法数量=第i-1阶爬法数量+第i-2阶爬法数量。1....原创 2019-06-26 22:47:04 · 370 阅读 · 0 评论 -
LeetCode 刷题8
第一题:岛屿数量用一个二维数组代表一张地图,这张地图由字符“0”与字符“1”组成,其中“0”代表水域,“1”代表小岛土地,小岛“1”被水"0"所包围,当小岛土地“1”在水平和垂直方向相连接时,认为是同一块土地。求这张地图中小岛的数量。Leetcode 200思考:给定该二维地图grid,与一个二维标记数组mark(初始化为0),mark数组的每个位置都与grid对应,设计一个搜索算法(BFS和...原创 2019-06-21 15:48:15 · 333 阅读 · 0 评论 -
Leetcode 刷题六
这次主要看二分查找和二分搜索:二分查找又称折半查找,首先,假设表中元素是按升序排列,将表中间位置的关键字与查找关键字比较:1.如果两者相等,则查找成功。2.否则利用中间位置将表分成前后两个子表:(1)如果中间位置的关键字大于查找关键字,则进一步查找前一子表(2)否则进一步查找后一子表重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。递归方式查找...原创 2019-06-11 17:20:35 · 127 阅读 · 0 评论 -
Leetcode刷题七
哈希表与字符串哈希表是根据关键字值(key)直接进行访问的数据结构,它通过把关键字值映射到表中一个位置(数组下标)来直接访问,以加快查找关键字值的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。最简单的哈希:字符哈希#include <iostream>#include <string>using namespace std;int main()...原创 2019-06-20 17:55:07 · 135 阅读 · 0 评论 -
C++数据结构 16 二叉树
树集成了数组和链表的优点(查找速度快)树:结点,度,叶结点,父结点,子结点,兄弟结点,树的度,树的高度。具体概念可以参考:https://blog.csdn.net/u012928324/article/details/61194190?utm_source=itdadao&utm_medium=referral #ifndef _BinaryTree_H__#d...原创 2018-10-23 15:30:01 · 263 阅读 · 0 评论 -
C++数据结构 15 基数排序
具体的原理可以参考这篇文章:http://www.cnblogs.com/Braveliu/archive/2013/01/21/2870201.html 代码实现:#include <iostream>#include <list>using namespace std;int maxdixgit(int data[],i...原创 2018-10-22 14:07:08 · 259 阅读 · 1 评论 -
C++数据结构 10 链表
#ifndef __LIST_H__#define __LIST_H__#include <iostream>using namespace std;template <class Type> class List; //声明节点template <class Type>class ListNode //节点{friend clas...原创 2018-10-17 15:22:55 · 182 阅读 · 0 评论 -
C++数据结构 8 顺序栈
后进先出(LIFO)或者先进后出(FILO)栈顶、栈底之分操作:PUSH TOP POP ISEMPTY;下面是代码:#ifndef _MYSTACK_H__#define _MYSTACK_H__template <class T>class MyStack{public: MyStack(int StackCapacity=10); /...原创 2018-10-11 09:35:18 · 237 阅读 · 0 评论 -
数据结构之线性表---链式存储结构
顺序表的缺点: 顺序表的最大问题是插入和删除需要移动大量的元素。链式存储定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。n个结点链接成一个链式线性表的结构叫做链表,当每个结点中只包含一个指针域时,叫做单链表。链表的基本概念表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息,表头节点不是数据元素。数据...原创 2018-04-27 22:17:27 · 144 阅读 · 0 评论 -
数据结构之线性表---静态链表
单链表的实现严重依赖指针,数据元素中必须包含一个额外的指针域,没有指针的程序设计语言无法实现。静态链表的定义顺序表数组中的元素由两个数据域组成:data和next。 data域用于存储数据 next域用于存储下一个元素在数组中的下标如下图所示: 静态链表是在顺序表的基础上利用数组实现的单链表//定义结点typedef struct _tag_TStaticListNode{ unsigned...转载 2018-04-27 22:13:58 · 151 阅读 · 0 评论 -
数据结构之线性表---顺序存储结构
线性表::零个或者多个数据元素的有限序列。线性表的顺序的存储结构指的是用一段地址连续的存储单元依次存储线性表的数据元素。线性表的存储的结构代码:.h文件中typedef void SeqList; //顺序表typedef void SeqListNode; //顺序表的元素SeqList * SeqList_Creat(int capacity)...原创 2018-04-27 16:01:41 · 199 阅读 · 0 评论 -
栈的应用一:
如何实现编译器中的符号成对检测?解决方案算法思路 从第一个字符开始扫描 当遇见普通字符时忽略,当遇见左符号时压入栈 当遇见右符号时从栈中弹出栈顶符号 进行匹配• 匹配成功:继续读入下一个字符• 匹配失败:立即停止,并报错 结束:• 成功: 所有字符扫描完毕,且栈为空• 失败:匹配失败或所有字符扫描完毕但栈非空 int isLeft(char c){ int ret = 0; s...原创 2018-05-09 21:09:51 · 150 阅读 · 0 评论 -
数据结构之--链式栈
接上篇直接上代码Linklist.h#ifndef __Linklist_H__#define __Linklist_H__#include <stdio.h>#include <stdlib.h>typedef void Linklist;typedef struct _tag_LinklistNode LinklistNode;struct _tag_...原创 2018-05-09 10:51:34 · 156 阅读 · 1 评论 -
数据结构之---双向链表
单链表的局限: 单链表的结点都只有一个指向下一个结点的指针。 单链表的数据元素无法直接访问其前驱元素。逆序访问单链表中的元素是极其耗时的操作双向链表的定义在单链表的结点中增加一个指向其前驱的pre指针。双向链表拥有单链表的所有操作 创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到位置pos 删除位置pos处的元素插入操作删除操作双向链表的新操作获取当前游标指向的数据元...原创 2018-05-02 15:30:21 · 140 阅读 · 0 评论 -
数据结构之线性表---循环链表
单链表的局限: 单链表可以用于表示任意的线性关系。 有些线性关系是循环的,即没有队尾元素。循环链表的定义将单链表中最后一个数据元素的next指针指向第一个元素。循环链表的操作循环链表拥有单链表的所有操作: 甚至有的操作在代码上完全相同下面的相同: 创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作插入元素到位置pos,若在头部第一个元素和尾部最后一个元素插入时,做成循环。 删除位置...原创 2018-05-02 15:23:57 · 448 阅读 · 0 评论 -
C++数据结构 9 顺序队列
队列:先进先出(FIFO)或者后进后出(LILO)#ifndef __QUEUE_H_#define __QUEUE_H_#include <iostream>#include <algorithm>using namespace std;template <class T>class Queue{ public: Qu...原创 2018-10-11 20:35:50 · 169 阅读 · 0 评论 -
C++数据结构 3 选择排序与顺序查找
选择排序1.从当前未排序的证书中找一个最小的整数,将它放在已排序的整数列表的最后。2.选择排序选最小的,往左边选(区分冒泡的排序的点)比较简单直接上代码:#include <iostream>using namespace std;void SelectionSort(int *List,const int n){ for(int i=0;i&l...原创 2018-10-06 11:01:04 · 418 阅读 · 0 评论 -
C++数据结构4 二分查找(递归方法)
二分查找比顺序查找效率高很多同样的100万个数据,顺序查找需要50万次,而二分查找需要20次左右既可以了。但是二分查找需要的数据是已经排列好的,无序的数据则用不了二分查找。#include <iostream>/* 二分查找:必须是已经排序好的数,有递归和迭代(循环)两种方式,递归的效率比迭代的效率高得多*/using namespace std;int ...原创 2018-10-06 16:38:02 · 1151 阅读 · 0 评论 -
C++数据结构 14顺序容器的STL
顺讯容器的STL,list类是双向循环的链表(Vect是数组,deuqe是队列),使用迭代器进行数据的查找和操作等#include <iostream>#include <list>using namespace std;void Print(const list<int> &listoutput)//打印迭代器的数据{ list...原创 2018-10-22 11:07:16 · 160 阅读 · 0 评论 -
C++数据结构 13链式队列
先进先出#ifndef _QueenList_H__#define _QueenList_H__template <class T>class Queue{public: Queue(); ~Queue(); bool IsEmpty() const; const T& GetFront()const; //得到队首数据 ...原创 2018-10-19 14:50:48 · 221 阅读 · 0 评论 -
C++数据结构 12链式栈
使用链表做的堆栈先进后出栈的主要三个操作Push Pop Top #ifndef __LinkStack_H__#define __LinkStack_H__#include <iostream>template <class T> class LinkStack;template <class T>class LinkN...原创 2018-10-19 14:49:24 · 261 阅读 · 0 评论 -
C++数据结构 11 双向链表
双向链表:有三个域:左链域 llink 右链域 rlink 数据域 data需要有表头结构#ifndef __DoubleList_H__#define __DoubleList_H__#include <iostream>using namespace std;class DoubleList; //声明class DoubleListN...原创 2018-10-18 15:24:03 · 308 阅读 · 0 评论 -
C++数据结构 7 归并排序
归并排序算法采用的是分治算法,即把两个(或两个以上)有序表合并成一个新的有序表,即把待排序的序列分成若干个子序列,每个子序列都是有序的,然后把有序子序列合并成整体有序序列,这个过程也称为2-路归并.一般来说,n个数据大致会分为logN层,每层执行merge的总复杂度为O(n), 所以总的复杂度为O(nlogn)。归并排序包含不相邻元素的比较,但并不会直接交换。在合并两个已排序的数组时,如果遇到...原创 2018-10-08 11:09:45 · 263 阅读 · 0 评论 -
C++数据结构 6 快速排序
快速排序算法是最快的算法,也是最受欢迎的算法。快速排序采用的是分治法,其平均时间复杂度为O(nlogn)一趟快速排序的算法是[1]: 1)设置两个变量I、J,排序开始的时候:I=0,J=N-1; 2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0]; 3)从J开始向前搜索,即由后开始向前搜索(J=J-1即J--),找到第一个小于key的值A[j],A[j]与A...原创 2018-10-07 12:19:05 · 258 阅读 · 0 评论