
数据结构区
文章平均质量分 59
yanerhao
信雅之言,微言大意
展开
-
leet-code 所有二叉树路径问题
二叉树路径的问题大致可以分为两类:1、自顶向下:顾名思义,就是从某一个节点(不一定是根节点),从上向下寻找路径,到某一个节点(不一定是叶节点)结束具体题目如下:原创 2021-06-06 20:55:56 · 448 阅读 · 0 评论 -
二分法解决最值的最值化
1.两球之间的磁力,求的是m个球中相邻两球距离的最小值的最大化func maxDistance(position []int, m int) int { /* 二分法,图片可以参考:https://leetcode-cn.com/problems/magnetic-force-between-two-balls/solution/c-er-fen-sou-suo-by-acvv_itdef-og5j/ 0.最小磁力指的是这 m 个球中相邻两球距离的最小值的结论。对于i<j原创 2021-04-19 22:48:41 · 305 阅读 · 0 评论 -
字典树及GO实现
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。前缀树的3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的所有子节点包含的字符原创 2021-03-28 14:29:25 · 338 阅读 · 0 评论 -
并查集及GO实现
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。并查集被很多人认为是最简洁而优雅的数据结构之一,主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:合并(Union):把两个不相交的集合合并为一个集合。 查询(Find):查询两个元素是否在同一个集合中。具体引入可以参考:说明三种主要操作:Make_Set(x):建立一个新的集合,其唯一原创 2021-03-27 15:39:23 · 988 阅读 · 0 评论 -
线段树GO实现
var sum []intvar lazyT[]intvar arr[]int//改变了区间中某一个值或某些值时,我们需要沿着线段树向上更新改变值的节点与根节点间的所有值,可以看出这部操作与线段树的高度有关,复杂度为O(logn)func pushUp(idx int){ sum[idx]=sum[idx*2]+sum[idx*2+1]}//buildfunc build(left,right,idx int){ if left==right{ //单节点 sum[idx]=a.原创 2021-03-21 17:13:09 · 389 阅读 · 0 评论 -
线段树--用于海量数组中高效查询与修改1
经典场景:一个给定较大的数组X:要求1: 可以随时更新某个区间[i,j]内的元素要求2:可以查询火统计某个区间[i,j]内最值/和等。常见做法:对于要求1,遍历区间[i, j],进行元素的更新,时间复杂度 O ( n ) ;对于要求2,遍历区间[i, j],查询最值,时间复杂度 O ( n ) ;如数组元素个数较大时,耗时严重。由此引入线段树,保证对数数据内更新火查询某个区间。线段树定义:线段树是一种利用分治思想处理对一段序列进行大量区间操作(修改、查询)的数据结构。线段原创 2021-03-21 15:16:52 · 234 阅读 · 0 评论 -
常见内排序-go版本实现
1 选择排序表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,O(1)的空间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间,不稳定。举个例子:对于2954816step1:在列表中先选择最大元9并与最后一个数字6交换2654819;step2:在剩余列表选择最大元8并与最后一个数字1交换2654189;step3:在剩下列表选择最大元6并与最后一个数字1交换2154689;s...原创 2020-12-25 19:26:29 · 255 阅读 · 0 评论 -
单调栈
单调栈:保持调顺序的栈。单调递增栈:从底到定从小到大排序,解决寻找最近的比本身值小的左或右的元素;具体来说:单调递增栈可以找到左起第一个比当前数字小的元素。比如数组 [2 1 4 6 5],刚开始空栈故2入栈,数字1入栈的时候,发现栈顶元素2比较大,1不能直接入栈否则破坏递增性,先将2移出栈,此时1入栈。那么此时说明2和1都没左起比自身小的数字。然后数字4入栈的时候,栈顶元素1小于4,于是1就是4左起第一个小的数字。此时栈里有1和4,然后数字6入栈的时候,栈顶元素4小于6,于是4就是6左起第原创 2020-12-06 16:34:00 · 258 阅读 · 0 评论 -
二叉树之二BST树,AVL树详解及B树和红黑树原理分析
B树原理及其分析在大规模数据存储方面,大量数据存储在外存磁盘中,而在外存磁盘中读取/写入块(block)中某数据时,首先需要定位到磁盘中的某块,如何有效地查找磁盘中的数据,需要一种合理高效的外存数据结构,就是下面所要重点阐述的B-tree结构,以及相关的变种结构:B+-tree结构和B*-tree结构。一 B-树B-是不是二叉树,而是一种多路搜索树,所有节点的孩子节点树最大值称为B原创 2017-03-13 11:20:34 · 836 阅读 · 0 评论 -
二叉数前序中序后序递归与非递归实现
#define M 20struct node{char data;node *l;node *r;};int max(int x,int y){if(x>y)return x;else return y;}void create(node*&b,char a[]){char c,i=0;node *q[M],*p;int top=-1;int f;c=a[i];whi原创 2015-10-15 13:32:29 · 358 阅读 · 0 评论 -
二叉树最长路径问题
已知一颗二叉树其定义如下:struct node1{int val;node1*left;node1*right;};例如: A | | | | |原创 2017-03-19 19:35:10 · 11684 阅读 · 1 评论 -
插入排序/选择排序/交换排序/归并排序/基数排序
数据处理时一个主要需求就是排序,目前主要的内存排序(处理的数据量百万级以下)主要基于关键字大小,具体可分一下几种:1. 插入排序:直接插入排序(稳定)和希尔排序(升级版,不稳定); 直接插入排序,关键是在以排序好的序列基础上再将加入一个新元素并完成排序,即数组a[0]-a[i-1]是已经按照从小到大的顺序排序好的序列,而a[i]-a[n-1]是待排序序列,取a[i]进入a[0]-a...原创 2016-12-18 22:35:15 · 3652 阅读 · 0 评论 -
关于高精度运算bign类的实现
对与基本的运算由于数据类型存储空间有限导致运算结果较大时容易计算溢出,这里通过引入数字数组定义适用于高精度运算的bign类实现大数运算的精确表示,包括常见的赋值/比较/四则运算:#include#include#include#include#define MAX_L 2005using namespace std;class bign{ public: int len;原创 2017-02-15 09:29:25 · 875 阅读 · 0 评论 -
枚举排列
输入整数n,按照从小到大顺序给出所有排列:n=3则全排列为(从小到大):123132213231312321采用递归思想:先输出所有以1开头的序列----->再输入以2开始的排列------>接着是以3开始的。。。。最后是以n开始的序列。分析题意可知,以i(i=1,2,3...n)开始的序列,后面是1,2,。。。,i-1,i+1,。。。n数字的排列,并且也是原创 2017-03-02 19:44:41 · 2716 阅读 · 0 评论 -
最长回文字符串常用求法
最长回文字符串常用求法一般有以下几种:1 暴力求解#define max 100+10char buf[max*2];char tmp[max*2];void get_longest_str(){printf("请输入字符串\n");fgets(buf,max,stdin);//fgets输入,遇见换行才停int len=strlen(buf);int i,j=0;int原创 2017-01-15 20:54:06 · 559 阅读 · 0 评论 -
二项树及二项队列
二项树及二项队列原创 2016-12-14 23:25:05 · 4694 阅读 · 0 评论 -
应用于外存查找树的B-树分析
B-的引入查找树中的二叉搜索树(二叉查找树)、及其延伸AVL树/伸展树等等都是当数据存储在内存中对应的搜索结构。当我们在内存数据中搜索的时候,用AVL树表示就可以获得很好的搜索性能了。但是,当数据量很大的时候,内存已经无法容纳了,我们就只好把数据存储在外存(如磁盘)中,这个时候由于磁盘读取数据非常耗时。磁盘的读写时间远远慢于内存访问的时间。如果我们可以减少磁盘存取操作的次数,那么就可以提高外搜原创 2016-11-24 22:42:26 · 1019 阅读 · 0 评论 -
图之AOV拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(TopoiSicai Order)的序列,简称拓扑序列。将顶点表示活动,有向边表示活动之间的先后关系:即活动u的完成是活动v的开始条件,则在u,v之间存原创 2015-12-07 21:58:47 · 1398 阅读 · 0 评论 -
前缀中缀后缀表达式及其互相转换
计算机中前缀中缀后缀表达式是数据结构栈的重要应用,他们都是对表达式的记法,只是相对位置不一样,顾名思义,前缀表达式指的是符号都在操作数之前,中缀表达式指的是运算符都在操作数之后,而后缀表达式是之后。如:(a+b)*c-d是中缀表达式-*+abcd是前缀表达式ab+c*d-是后缀表达式中缀表达式是我们常用也是人常见的一种记法,但对于计算机来说处理很复杂,一般都是先转换成前缀或者后缀表原创 2015-05-24 19:59:02 · 11610 阅读 · 2 评论 -
如何根据前序、中序、后序遍历还原二叉树
面试题目或多或少会出现这样的选择题或者简答题:首先我们得知道概念:前序遍历:先访问当前节点,再访问当前节点的左子树,最后访问当前节点的右子树。对于二叉树,深度遍历与此同。规律:根在前;子树在根后且左子树比右子树靠前,且第一个就是根节点;中序遍历:先访问当前节点的左子树,然后访问当前节点,最后是当前节点的右子树,二叉树,中序遍历会得到数据升序效果。规律:根在中;左子树在跟左边,右子树在根原创 2015-04-21 20:49:38 · 21723 阅读 · 5 评论 -
串模式匹配之BF算法和KMP算法
在给定两个串S=“s1s2...sn”和T=“t1t2...tm”,在主串S中寻找子串T的过程称为模式匹配,T称为模式,如果匹配成功则返回T在S中第一次出现的位置,否则返回0.在数据结构中一般串的存储采用的顺序存储:有两种算法来进行模式匹配:1、朴素的模式匹配算法--BF算法BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等原创 2015-05-23 20:22:35 · 2514 阅读 · 0 评论 -
C++实现BitMap数据结构
分治,分布式。BitMap(位图)及其升级版bloom filter是处理海量数据常用的方法,这里先介绍BitMap概念及其c++实现。一 BitMap位图该数据结构描述了一个有限定义域内的稠密集合,其中的每一个元素最多出现一次并且没有其他任何数据与该元素相关联。即使这些条件没有完全满足(例如,存在重复元素或额外的数据),也可以用有限定义域内的键作为一个表项更复杂的表格索引。所谓的原创 2017-06-02 23:16:07 · 12142 阅读 · 4 评论 -
二叉树之一BST树,AVL树详解及B树和红黑树原理分析
BST树,AVL树详解及B树和红黑树原理分析互联网面试中树尤其是BST,AVL是提问的重点也是难点,甚至B树乃至高级数据结构红黑树都是提问的重点,像阿里云面试就曾经问过map实现机制(红黑树)及其原理,这里我们要做到对BST/AVL完全熟悉能给出全部代码实现,红黑树、b树之类,有能力的需要完全理解,代码就不用掌握了。红黑树和b树看会就行了,当碰到你感觉他们不懂这方面的面试官的时候,可以逮着他们原创 2017-03-11 23:21:59 · 9900 阅读 · 2 评论 -
模式匹配算法
模式匹配:定义:主串s或者称作目标串,是匹配的的对象。而子串或者称作模式串t,是能在主串s中找到的一个与t相等的子串,实际上不属于主串s。这样称模式串t定位匹配主串的过程称作模式匹配。相关算法:1、BF算法即一个个比较。选择主串s,从第一个元素开始与模式串t第一个元素开始比较,如果相等则比较下一个;否则从主串第二个元素开始与模式串第一个字符比较。依次进行。int bf_inde原创 2015-09-22 21:18:59 · 566 阅读 · 0 评论 -
自定义memcpy和strcpy
memcpymemcpy是C语言中的内存复制函数,它的函数原型:void *memcpy(void *dest,const void *src,int size)它的目的是将SRC指向地址为起始地址的连续size 个字节的数据复制到dest指向的地址为起始地址的空间内,注意这两块内存区域不能重叠,同时与strcpy相比,没有遇到'\0'截止一说而是一定赋值size个字节,而且可以用来复制任原创 2017-09-15 11:28:52 · 488 阅读 · 0 评论 -
基于string的undered_map的实现
实现一个hash_map,要求key为string,valure任意一 string 字符串转整数方法1:将字符串中字符ASCII码值加起来,返回的值就是字符串对应的整数如果存储的表很长,那么这种整数HASH后将导致集中在表前部分,分布不均衡;方法2:int string2int(const char *key){int hashint=0;while(*key!='\0'原创 2017-08-13 23:37:23 · 761 阅读 · 0 评论 -
208. Implement Trie (Prefix Tree)
208. Implement Trie (Prefix Tree)这一题完全就是数据结构里树的DAT,就是类似BST/AVL一样构造Trie树。一 概念Trie树又被称为字典树、前缀树,是一种用于快速检索的多叉树。Tried树可以利用字符串的公共前缀来节省存储空间。但如果系统存在大量没有公共前缀的字符串,相应的Trie树将非常消耗内存。构造如下:Trie 的强大原创 2017-08-06 19:48:05 · 446 阅读 · 0 评论 -
leetcode Plus ONE
Given a non-negative number represented as an array of digits, plus one to the number.The digits are stored such that the most significant digit is at the head of the list.分析:这是一个进位加法运算,设置进位变量add,原创 2015-10-14 21:29:04 · 363 阅读 · 0 评论 -
伸展树C++类实现<二>自顶向下设计
上一篇主要基于父节点形式的自底向上的设计实现伸展树,这一篇将实现基于左右辅助树的自顶向下的设计。这种方式不需要节点存储其父节点的指针。当我们沿着树向下搜索某个节点x时,将搜索路径上的节点及其子树移走。构建两棵临时的树——左树和右树。没有被移走的节点构成的树称为中树。且有以下原则:1)当前节点x是中树的根;2)左树L保存小于x的节点且L上的每个节点值都要比中树的小,故当从中树移动接到到左原创 2016-11-21 20:39:26 · 780 阅读 · 0 评论 -
二分搜索树,堆,及优先队列
在描述二叉树,堆,优先队列之前之前,有必要介绍节点和向量,在二叉树,队,优先队列中会有使用:二叉树可以用链接在一起的一个个节点描述,每个节点包含一个数据元素和指向左右子树的指针,可以用类定义节点(结构体也可以):templateclass treenode{public:T ele;treenode*left;treenode*right;treenode(){ele=0;le原创 2015-04-24 20:24:38 · 523 阅读 · 0 评论 -
二叉树的深度优先遍历以及广度优先遍历
深度优先搜索算法(Depth First Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点。如图二叉树:A 是第一个访问的,然后顺序是 B、D,然后是 E。接着再是 C、F、G。那么,怎么样才能来保证这个访问的顺序呢?分原创 2015-04-25 14:34:05 · 544 阅读 · 0 评论 -
二叉树节点的插入与删除
1、先定义一个二叉树节点:templateclass treenode{public:T ele;treenode*left;treenode*right;treenode(){left=NULL;right=NULL;}treenode(T ele){ this->ele=ele;left=NULL;right=NULL;}};2、再进行二叉树的插入以创建一个二叉树:原创 2015-04-26 09:59:54 · 4495 阅读 · 0 评论 -
二叉树各种遍历算法(递归以及非递归)6
如对于上图二叉树:前序遍历:ABDECFG中序遍历:DBEAFCG后序遍历:DEBFGCA深度遍历:ABDECFG广度遍历:ABCDEFG前序遍历:先父节点,再左右节点递归算法:void inorder(treenode<T>*root){ if(root==NULL)return; else{<pre name="code" class="cpp"> ...原创 2015-04-25 15:56:33 · 504 阅读 · 0 评论 -
二分搜索树完整实现
包括二分搜索树的创建,插入,删除,前序、中序、后序、广度以及深度的递归和递归算法,获取二叉树最小节点,最大节点,获取当前节点的后序或者前序节点,对二叉树的搜索判定templateclass treenode{public:T ele;treenode*left;treenode*right;treenode(){left=NULL;right=NULL;}treenode(T el原创 2015-04-26 16:21:40 · 788 阅读 · 0 评论 -
用数组和链表分别实现栈类stack,队queue
栈(stack)是一种常见数据结构,以后进先出(LIFO)著称。比如编译器用栈处理函数调用,保存被调用函数的参数和局部变量。当一个函数调用另一个函数时候,新的函数参数和局部变量被入栈。调用结束,占用的资源从栈释放。原创 2015-04-19 16:52:31 · 1397 阅读 · 0 评论 -
链表的实现
单向和双向链表的实现原创 2015-04-18 21:34:22 · 394 阅读 · 0 评论 -
堆与栈的几点区别
对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。 申请大小: 栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空转载 2015-04-15 21:39:02 · 413 阅读 · 0 评论 -
迭代器
迭代器是C++中非常重要的结构,它是遍历不同容器的利刃!比如STL就是使用迭代器完成对list,vector,deque,set,map等容器元素的访问。迭代器简单来说可以看作指针,但不仅仅是指针,实际上是基于指针建立起来的类。其本质是对象!以链表linklist类为例,设计它的一个迭代器:templateclass linklist{private:node *head;node原创 2015-04-19 20:54:34 · 465 阅读 · 0 评论 -
用结构体创建链表和用类创建链表
当要保存和管理的数据元素的数目变化很大时,使用链表效率会很高。在链表每个元素都保存在节点: node 1 node 2 node nhead--->元素1 -->元素2..........元素n next next NULL用结原创 2015-04-18 14:32:48 · 1771 阅读 · 0 评论 -
排序算法及其效率分析(一)内排序
只要是接触编程,接触算法,排序是必修的一门基础课,它的应用之大不言而喻,下面就几种常用排序进行实现并进行时间复杂度的分析:1:选择排序法举个例子:对于2 9 5 4 8 1 6step1:在列表中先选择最大元9并与最后一个数字6交换 2 6 5 4 8 1 9;step2:在剩余列表选择最大元8并与最后一个数字1交换 2 6 5 4 1 8 9;step3:在剩下列表选择最大元原创 2015-04-30 21:33:31 · 769 阅读 · 0 评论