![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 56
persistence_s
这个作者很懒,什么都没留下…
展开
-
全排列
方法一:采用递归的方式例子1、将数组int arr[4]={1,2,3,4}进行全排列static int n = 0;void Perm(int *arr, int k, int m){ if (k ==m) { for (int i = 0; i <m; i++) { cout << arr[i]; } cout << endl; ++n; }原创 2017-04-19 10:25:49 · 243 阅读 · 0 评论 -
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 【腾讯】
40亿占多少个字节:4G 10个亿需要1G 一个整型需要4个字节,40亿个则需要16G 由于如果我们直接使用这种方式去存储需要16个G显然这是不可能的,因此我们需要用到下面的方式去存储,采用位图 我们用一个Bit位去标识一个数存在还是不存在 我们都是到一般字节是存储的最小单位 那么一个字节有8个位,巧妙的利用这一点来实现我们的位图 比如10我们先确定他存在第几个字节,再去确定它在第几个原创 2017-06-16 21:51:39 · 1710 阅读 · 0 评论 -
AVL树
AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树是建立在二叉搜索树的基础之上的,因为二叉树搜索树有缺陷 当我们的二叉搜索树是如上图的样子,那么它是顺序查找,在它的最坏情况下 时间复杂度是O( N),在这种情况下如果原创 2017-06-02 09:27:16 · 461 阅读 · 0 评论 -
红黑树
红黑树(Red Black Tree) 是一种自平衡二叉查找树,红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能,它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强原创 2017-06-04 02:17:37 · 311 阅读 · 0 评论 -
STL之map的使用方法
map的元素都是“实值/键值”所形成的一个对组。每个元素都有一个键,是排序的准则。每个键只能出现一次,不允许重复使用。map可以被视为关联式数组,也就是具有任意索引型别的数组。map就是一种红黑树的K,V模型 关于STL中map的使用方法:1、关于map迭代器的使用 这些迭代器迭代器的使用和set中迭代器的使用类似#include<iostream>#include<stdlib.h>#原创 2017-06-08 13:17:35 · 900 阅读 · 0 评论 -
Linux下mysleep的实现
第一种方式:mysleep的实现实际上是利用alarm(timeout)函数和利用pause函数将当前进程挂起pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause 不返回;如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为 EINTR, 所以p原创 2017-07-01 18:33:42 · 410 阅读 · 0 评论 -
选择排序和堆排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法,选择排序是一种时间复杂度为O(N^2)的算法void SelectSort(int*arr, int n){ int left = 0; int right = n;原创 2017-07-02 11:23:17 · 235 阅读 · 0 评论 -
布隆过滤器
布隆过滤器实际上就是哈希和位图的结合 它的优点:速度快并且节省空间 它的缺点:存在误判(比如存在不同的字符串可能存在相同的ASCII,这样我们在判断的时候就会出现误判) 这样的误判一定是发生在 判断它存在的情况下 误判一定不会发生在 不存在的情况下 为了降低误判率,我们必须尽可能的减少哈希冲突 也就是一个Key值可以有多个映射的位置原创 2017-06-24 11:35:53 · 234 阅读 · 0 评论 -
归并排序
基本思想:将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后将他们 合并成一个序列。合并两个子序列的过程称为两路归并.void _Merge(int*arr, int*tmp, int begin1, int end1, int begin2, int end2){ int index = 0; while (begin1 <= end1&&begin2 <= e原创 2017-07-05 11:13:24 · 175 阅读 · 0 评论 -
守护进程
守护进程也称精灵进程( Daemon),是运行在后台的⼀一种特殊进程。它独立于控制终端并 且周期性地执行某种任务或等待处理某些发生的事件。守护进程是⼀一种很有用的进程。 Linux的⼤大多数服务器就是⽤用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd 等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等 Linux系统启动时会启动很多系统服务进程,这些系原创 2017-07-05 21:56:30 · 409 阅读 · 0 评论 -
并查集
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中的这种数据结构叫做并查集。 已知有N个人和m对好友关系,如果这两个人士直接好友或者间接的好友(好友的好友….)则认为他们属于同一个朋友圈,n=5,m=3,r={{1,2},{2,3},{4,5}}求出这n个人里一共有多少个朋友原创 2017-07-06 10:39:17 · 304 阅读 · 2 评论 -
直接插入排序和希尔排序
直接插入排序是先将第一个数当做有序区,然后对之后的数进行排序依次将它们放入有序区 void InsertSort(int*arr, int n){ for (int i = 0; i < n - 1; ++i) { int end=i; int tmp = arr[end + 1]; while (end >= 0)原创 2017-07-01 12:38:05 · 419 阅读 · 0 评论 -
交换排序
void BubbleSort(int *arr,int n){ int end = n - 1; while (end > 0) { bool flag = false; for (int i = 0; i < end; ++i) { if (arr[i]>arr[i + 1])原创 2017-07-04 16:02:15 · 408 阅读 · 0 评论 -
关于set的用法
map的元素都是“实值/键值”所形成的一个对组。每个元素都有一个键,是排序的准则。每个键只能出现一次,不允许重复使用。map可以被视为关联式数组,也就是具有任意索引型别的数组。 set内部的元素根据其值自动排序,可以将set视作一种特殊的map,其元素实值就是键值。关于STL中set的用法:1、set的迭代器的使用: #include<iostream>#include<stdlib.h>#原创 2017-06-05 23:36:04 · 473 阅读 · 0 评论 -
搜索二叉树的基本操作
搜索二叉树的非递归基本操作为什么要找右孩子的最左节点因为右孩子的最左节点一定比要删除的节点的右孩子上的任意一个节点都要小替换删除之后搜索为茶树还是搜索二叉树#includeiostream>#includestdlib.h>using namespace std;templateclass K>struct BinarySearchTreeNode{ Bin原创 2017-05-31 09:51:50 · 238 阅读 · 0 评论 -
堆排序
堆排序:堆排序其实和选择排序一样 如果对堆进行升序排序应该建一个大堆 如果对堆进行降序排序应该建一个小堆首先进行升序排序 堆排序的过程 1、 2、 3、 …….一直循环交换调整直到a[0]和a[0]交换的时候循环终止,这话i后排序已经完成 排序的算法,升序排序依赖于建一个大堆 首先先建立一个大堆 建堆的时间复杂度 N*lgN 再加上向下调整算法的时间复杂度 N*lgN(原创 2017-05-16 13:55:10 · 448 阅读 · 0 评论 -
二叉树的创建
先序遍历:根左右:1->2->3->4->5->6->7->8 中序遍历:左根右:2->3->1->5->6->7->4->8 后序遍历:左右根:3->2->7->6->5->8->4->1如何创建一个二叉树,采用自定义来定义每个结点的成员 采用递归的方式来创建一棵树根左右的方式,不断的进行递归来创建二叉树的左子树,右子树 例如这里举个例子创建如下的树 看它是怎么递归来创建的 #in原创 2017-05-01 15:17:17 · 686 阅读 · 0 评论 -
队列初体验
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。 进行插入操作的一端称为队尾,通常称为入队列;进行删除操作的一端称为队头,通常称为出队列。 队列具有先进先出的特性(FIFO)。 队列又分为顺序队列和链式队列 所谓顺序队列也就是分配个这个队列的存储空间是连续的链式队列相当于我们的单链表 对链式队列的操作相当于对我们单链表的操作,不过在插入的时候我们需要移动尾指针,在原创 2017-04-20 13:19:14 · 415 阅读 · 0 评论 -
实现对称矩阵以及压缩存储
对称矩阵压缩存储 压缩矩阵:对称矩阵存储时只需要存储上三角或下三角的数据,所以最多存储 n*(n+1)/2个数据。 在存数据的 时候我们只需要将一半的数据存入一个一维数组中: 当然包含对角线元素 如果我们想要通过保存的这个一维数组的内容打印出二维数组的内容那么就要根据极具特色的行和列 #include<iostream>#include<stdlib.h>using namespa原创 2017-04-20 17:18:27 · 2072 阅读 · 0 评论 -
递归和栈求解迷宫的最短路径
采用递归的方式求最短路径 1、用一个栈专门用来保存有效的路径 2、再用一个栈来辅助保存所有走过的路径。 3、然后再用一个栈用来保存最短的路径 4、如果每次找到了出口,那么必然有两个栈一个保存了所有走过的路径,一个保存了通路的路径 5、于是每找到一次出口,那么开始进行比较,如果当前最短路径中所保存的每个坐标的个数如果大于本次通路的路径,那么就将最短路径中的所有数据出栈,并将本次通路的路径放入原创 2017-04-29 17:17:45 · 2401 阅读 · 0 评论 -
标准STL中list的各个接口的使用
list是标准STL的序列式容器,它里面的元素是有序的线性序列 STL中的list就是一个带头结点的循环双向链表,可以高效的删除和插入元素。 但是list是不支持随机访问的,因为它的存储空间是不连续的。 而且标准的STL的list我们是通过迭代器来遍历容器里的元素的,迭代器是一种检查容器内元素并遍历元素的数据类型。 标准STL中list的成员函数 constructor:list的成原创 2017-04-21 20:09:32 · 621 阅读 · 1 评论 -
迭代器模拟实现STL中的list
list中的迭代器类似与智能指针的作用,它是将指向链表指向结点的指针管理起来。 在STL中的list是带头结点的双向循环链表,这样的设计很巧妙,可以让我们的插入和删除元素的时候减少一些需要考虑的边界问题。 要模拟实现STL中的list我们首先得模拟实现迭代器,设计成用来管理指向list中结点的指针。因此要先给出迭代器这个类。所以在使用标准库中的迭代器的时候实际上是定义了一个迭代器对象,在这个对象原创 2017-04-22 17:45:34 · 422 阅读 · 0 评论 -
稀疏矩阵的压缩存储以及快速转置
稀疏矩阵的压缩存储 压缩存储值存储极少数的有效数据。使用{row,col,value}三元组存储每一个有效 数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。 矩阵的转置 将原矩阵的行、列对换,也就是将[i][j]和[j][i]位置上的数据对换。 在压缩存储的过程中要注意越界问题 SparseMatrix( T *arr , int m, int n, T invalid)原创 2017-05-06 00:06:18 · 859 阅读 · 0 评论 -
C++实现计算器(四则混合运算)
计算器是带括号的四则运算实际上利用的是栈后进先出的原则 转换思想: #define _CRT_SECURE_NO_WARNINGS 1#include"stdio.h" #include"stdlib.h" #include"string.h" #define maxsize 1024typedef struct{ float data[maxsize]; in原创 2017-04-29 18:34:01 · 28047 阅读 · 4 评论 -
哈夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。1、路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长 哈夫曼树 哈夫原创 2017-05-25 17:29:04 · 603 阅读 · 0 评论 -
线索化二叉树
二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只 能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。 为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。 前序的线索化:也是建立在前序的递归遍历的基础之上的 void _PreThread(Node*c原创 2017-05-12 13:08:17 · 338 阅读 · 1 评论 -
二叉树的基本操作方式
二叉树的一些基本操作都是通过递归来实现的 在用递归解决二叉树的问题时要善于二叉树划分为根节点左子树和右子树。 二叉树递归创建的具体函数调用过程二叉树的递归实现的基本操作#include<iostream>#include<stdlib.h>#include<queue>using namespace std;template<class T>struct BinaryTreeNode原创 2017-05-07 10:05:22 · 368 阅读 · 0 评论 -
二叉树的非递归遍历
二叉树的非递归实现 在解决二叉树的问题的时候要善于把树划分成为根左子树和右子树 前序遍历:根–>左–>右 中序遍历:左–>根–>右 后序遍历:左–>右–>根 这三种遍历的方式的思想都是一样的,借助栈来保存,利用栈先进后出的特性 中序遍历也是同样的思想,而后序遍历大致也是同样的方式不过必须要做一个标记避免陷入死循环,因为只有右子树访问完了,才能将根节点访问并且pop出去,那么此时就原创 2017-05-07 10:11:12 · 231 阅读 · 0 评论 -
STL之空间配置器
最近在看侯捷老师写的STL源码剖析,想通过看优秀的代码来提高自己的编程水平。 首先STL提供了六大组件,彼此可以套用使用。 借助一张从书上截的图来表明: Container通过Allocator来获取数据存储空间 Algorithms通过迭代器来获取Container的内容,Functors可以协助Algorithms完成不同策略变化 Adapter可以修饰或者套接Functor由此可原创 2017-07-22 11:39:55 · 480 阅读 · 0 评论