数据结构
文章平均质量分 79
带你去网吧里偷耳机
这个作者很懒,什么都没留下…
展开
-
前缀树(Trie树)
Trie树Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串...转载 2021-09-29 22:57:19 · 143 阅读 · 0 评论 -
二叉树前/中/后序遍历的非递归写法
转载 2020-02-11 15:55:48 · 130 阅读 · 0 评论 -
最短路径dijkstra算法及其优先队列的优化
最短路径问题:对任意给出的图G(V,E)和起点S,终点T,如何求从S到T的最短路径。解决最短路径问题的算法有Dijkstra算法,Bellman-Ford算法,SPFA算法和Floyd算法。Dijkstra算法描述主要用于解决单源最短路径问题,即给定图G(V,E)和起点s,通过算法得到S到达其他每个顶点的最短距离。算法步骤:设置集合S存放已被访问的顶点,然后执行n次下面的每个步骤(n为...原创 2019-02-28 20:43:21 · 2851 阅读 · 0 评论 -
括号匹配问题
卡特兰数括号匹配问题与卡特兰问题很像,把括号组合看作字符串,那么任意字符串前缀左括号的个数应该大于等于右括号的个数,否则括号组合一定非法。题目一 寻找合法的字符串这其实可以看作一个DFS深度优先遍历问题,总是优先匹配左括号。#include <vector>#include <string>#include <iostream>...原创 2019-02-19 22:46:21 · 214 阅读 · 0 评论 -
找实习干货链接
分享链接原创 2019-02-25 23:39:52 · 236 阅读 · 0 评论 -
直通BAT-二分查找
1 简介与实例在有序数组中查找某一数据所在的下标,若存在该数据,返回下标,否则返回-1。#include <cstdio>int a[10]={1,3,5,7,9,11,13,15,17,19};int value; //待查找元素的值int index; //查找到的下标,如果没有查到,返回-1int search_index(int a[],int n)...原创 2019-02-20 16:07:43 · 312 阅读 · 0 评论 -
手动实现strcpy并考虑内存重叠
在没有内存重叠的风险时的操作如下:char *strcpy_(char *dst,const char *src){ assert(dst!=NULL&&src!=NULL); //头文件是#include <cassert> char *r=dst; while((*dst++ = *src++)!='\0'); //dst指针一直...原创 2019-03-01 22:29:02 · 743 阅读 · 0 评论 -
可能是求质数最高效的算法
这标题,怎么感觉好像有点震惊体的意思了。先上代码: C++版:#include <iostream>using namespace std;int prime(int n);int main() { prime(100); return 0;}int prime(in...转载 2019-03-03 11:20:18 · 338 阅读 · 0 评论 -
求素数
需求一般情况下,求素数,会有2种需求:1 求出1-N之间的所有素数。2 求出自然数的前N个素数。普通需求的几种解法1 遍历法即如果要判断数字N是不是素数(只被1和自己整除的数,1除外)。只需要遍历2-N-1看看数字是否被他们任意一个整除即可。#include <cstdio>bool is_prime(int n){ bool res=tru...原创 2019-03-03 11:40:46 · 138 阅读 · 0 评论 -
直通BAT-位运算
算术运算常见操作符:+ - * / %位运算操作符:& | ^ ~ << >>位运算的面试题目大部分靠平时积累。案例一 布隆过滤器如果使用哈希表,把黑名单存入哈希表或者数据库,由于单个URL为64字节长度,100亿个黑名单长度为64B*100亿=6400亿B,约等于640G空间。思想:碰到网页黑名单问题/垃圾邮件过滤问题/爬虫的网址判断重复...原创 2019-03-03 17:24:33 · 1022 阅读 · 0 评论 -
回溯法详解
1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 许多复杂的...原创 2019-04-04 11:41:18 · 498 阅读 · 0 评论 -
位图法的代码
一 简介所谓bitmap就是用一个bit位来标记某个元素对应的value值,而key就是该元素。由于采用了bit为单位来存储数据,可大大节省空间。二 Map映射bitmap中一个比特代表一个数字,1个int有32个bit,那N个数据需要N/32个int空间,所以需要申请的内存空间大小为int a[1+N/32],其中a[0]在内存中占32,可以对应十进制数为0-31,以此类推:a[1]...原创 2019-04-07 19:23:54 · 402 阅读 · 0 评论 -
如何在数组(可以定义条件为有序)中找到出现次数最多的数字
法一如果数组长度为n,且数组中元素值都在0~n-1之间,假设数值最大为k。那么可以使用在原数组上进行操作的方法(如果可以改变数组)。即数组下标代表数值本身,当该元素出现时,就把相应下标对应的值加k,每出现一次就加k,最后比较数组元素值,最大的元素值代表其下标出现的次数最多。注意这样会改变原来的值,可以使用value%k来获得数组原来的值。注意点:(1)如何输入不定长的数组(2)...原创 2019-03-28 22:12:06 · 2135 阅读 · 0 评论 -
字符串四则运算表达式求值
例如:9+(3-1)*3+10/2先把中缀表达式转为后缀表达式:9 3 1 - 3 * + 10 2 / +再计算值为20中缀表达式转后缀表达式维护一个队列存放后缀表达式,一个栈存放中间过程的操作符。最后队列中放置最后的后缀表达式,栈为空。遍历中缀表达式每一个项。(1)如果遇到数字,直接放入队列。(2)如果遇到左括号,直接入栈。如果遇到右括号,依次把栈中元素出栈,...原创 2019-03-29 09:44:16 · 376 阅读 · 0 评论 -
topK问题
剑指offer最小的k个数法一:快速排序注意partition函数的vector要加引用,同时需要判断数组长度和k的大小。时间复杂度为O(n),但会修改数组class Solution {public: int Partition(vector<int> &input,int start,int end) { ...原创 2019-03-29 11:36:36 · 119 阅读 · 0 评论 -
使用数组实现固定长度的队列/栈
使用数组实现固定长度的队列主要的思路是:2个指针start和end,加上一个变量cur_size 用来表示当前队列的元素个数,只要size大于数组长度就不能再入队,size小于0就不能再出队列了。入队:移动end变量,每次让end指向队尾元素的下一个位置,每次入队只需把元素放入到end位置。如果到达数组尾部且队列没有满,让end为0,继续循环出队:移动start变量,每次start变量...原创 2019-08-28 16:45:50 · 331 阅读 · 0 评论 -
图,图的存储,图的遍历
图图是由顶点和边组成,每条边的2端都必须是图的顶点(可以是相同的顶点)。而图G(V,E)表示图G的顶点集合V,边集E。一般来说,图可以分为有向图和无向图。有向图的所有边都有方向,即确定了顶点到顶点的一个指向;而无向图的所有边都是双向的,即无向边所连接的2个顶点可以相互到达。顶点的度是指和该顶点相连的边的个数。特别对于有向图来说,顶点的出边条数称为顶点的出度,顶点的入边条数称为顶点的入度...原创 2019-02-24 23:08:11 · 222 阅读 · 0 评论 -
algorithm头文件下常用函数
使用前:#include <algorithm>using namespace std;1 max(),min(),abs()前2个的参数必须是2个,可以为浮点型。最后一个只有一个参数且必为整数。2 swap(x,y)交换x,y 的值#include <iostream>#include <algorithm>using nam...原创 2019-02-28 11:23:47 · 180 阅读 · 0 评论 -
哈希散列
哈希散列技术:存储位置=f(关键字)这样就可以通过查找关键字不需要比较就可以获得需要的记录的存储位置。哈希技术是在记录的存储位置和他的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key)。把对应关系f称作散列函数,又称哈希函数。采用散列技术将记录存储在一块连续的储存空间中,这块连续的存储空...原创 2019-02-23 23:59:44 · 294 阅读 · 0 评论 -
快速排序&归并排序&qsort
一 快速排序1 法一#include <stdio.h>int Partition(int a[],int low,int high) //返回枢纽位置{ int key=a[low]; //把第一个元素作为枢纽元素 while(low<high) { while(low<high&&a[hi...原创 2019-01-12 20:22:15 · 248 阅读 · 0 评论 -
牛客数据结构错题集(一)
1 链表的插入和删除操作复杂度分析复习循环链表的表示方式。带有尾指针的单循环链表查找第一个元素和最后一个元素都是o(1),而带有头指针的循环链表查找最后一个元素负责督为o(n)2 排序操作归并排序没有交换操作。...原创 2019-01-14 22:56:45 · 827 阅读 · 0 评论 -
BST二叉搜索树
深入学习理解BST#include <iostream>using namespace std;typedef struct BiTNode{ int data; struct BiTNode *left,*right;}BiTNode,*BiTree;//二叉树的插入操作void Insert(BiTNode *&root,int x) ...原创 2019-01-28 00:07:12 · 197 阅读 · 0 评论 -
平衡二叉树AVL
AVL树详解#include <iostream>using namespace std;//平衡二叉树节点typedef struct BiTNode{ int value,height; struct BiTNode *left,*right;}BiTNode,*AVL;//获得以root为根节点的子树的当前heighrint GetHei...原创 2019-01-28 09:55:29 · 91 阅读 · 0 评论 -
堆及堆排序
一 定义堆是一棵完全二叉树,树中每个节点的值都不小于(不大于)其左右孩子节点的值。如果父亲节点的值大于或等于孩子节点的值,这样的堆称为大顶堆。这时每个节点的值都是以它为根节点的子树的最大值;反之则称为小顶堆。堆一般用于优先队列的实现,优先队列默认情况下是大顶堆。二 基本操作针对一组无序数组,建堆的过程如下:(1)首先把数组元素按照树的层序从上往下,从左往右依次排放。(2...原创 2019-01-28 16:53:16 · 188 阅读 · 0 评论 -
排列组合/八皇后问题
全排列的递归解法法一#include <iostream>#include <cstdio>using namespace std;void swap_alpha(char *a,char *b){ char temp=*a; *a=*b; *b=temp; return;}void main_function(c...原创 2019-02-04 15:15:44 · 315 阅读 · 0 评论 -
动态规划专题
一 动态规划的递归写法和递推写法1 动态规划动态规划DP是用来解决一类最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解为若干个子问题,通过综合子问题的最优解来得到原问题的最优解。动态规划会将每个求解过程的子问题的解记录下来,这样当下次碰到同样的子问题时,就可以直接使用之前记录的结果,而不是重复计算。一般可以用递归或递推的方式来解决动态规划问题,其中递归写法又叫做记忆化搜...原创 2019-02-21 17:26:51 · 288 阅读 · 0 评论 -
哈夫曼树/哈夫曼编码
经典的合并果子问题有n堆果子,每堆果子的质量已知,现在需要把这些果子合并为一堆,但是每次都只可以把2堆果子合并为一堆。同时会消耗与2堆果子质量之和相同的体力。显然,在进行n-1次合并之后,只剩下一堆了。为了节省体力,请设计出合适的次序方案,使得耗费的体力最少,并给出体力值。不妨把每堆果子看作节点,果堆的质量看作节点的权值,这样合并2个果堆相当于生成一个父节点,权值等于他们的质量之和,于是把...原创 2019-02-21 21:15:57 · 1377 阅读 · 0 评论 -
DFS/BFS
一 DFS深度优先遍历有n件物品,每件物品重量为w[i],价值位c[i]。现在需要选出若干件物品放入一个容量为V的背包中,使得在选入背包中的物品容量和不超过容量V的前提下,让背包中物品的价格之和最大,求最大价值。由于对每件物品都有选与不选两种选择,这就是岔道口。一旦选择的物品重量之和超过V,就会到达死胡同,需要返回就近的岔道口。显然每次都要对物品进行选择,因此DFS函数的参数必须记录...原创 2019-01-30 19:54:14 · 1104 阅读 · 0 评论 -
并查集
一 并查集介绍并查集是一种维护集合的数据结构,并查集名字“并” “查” “集”分别取自Union Find Set这3个单词。并查集支持下面2个操作(1)合并:合并2个集合。(2)查找:判断2个元素是否在一个集合中。并查集是用数组实现的。int father[i];father[i]表示元素i的父亲节点,而父亲节点本身也是这个集合中的元素。father[1]=2表示元...原创 2019-02-16 20:29:01 · 1500 阅读 · 0 评论 -
大数问题 大整数运算
简介对于A+B,如果A和B是有着1000个数位的整数,就不可以用基本的数据类型如int来存储了。这时只可以老实地模拟加减乘除的过程。大整数又称为高精度整数,其含义就是用基本数据类型无法存储其精度的整数。大整数的存储我们可以用数组来存储大整数,比如用int型数组d[1000],这个数组的每一位就代表存放整数的每一位。数组的高下标存储的是整数的高位,低下标存储的是整数的低位。为了方便获...原创 2019-02-15 20:36:29 · 1601 阅读 · 0 评论 -
排序总结
一 排序的基本概念与分类排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等十大排序算法。用一张图概括:对前7中排序算法而言,只看平均时间复杂度,归并/快速/堆排序要胜过希...原创 2019-02-17 15:16:37 · 277 阅读 · 0 评论 -
贪心/贪婪算法
贪心算法简介简单贪心贪心法是求解一类最优化问题的方法,它总是考虑在当前状态下局部最优(较优)的策略,来使全局的结果达到最优(较优),显然如果采用较优而非最优的策略,得到的全局结果也不一定是最优的。而要获得最优结果,必须保证中间的每步策略都是最优的,因此严谨使用贪心策略来求解最优化问题需要对策略进行证明。一般来说,证明比较繁琐情况下,如果在想到某个似乎可行的策略,并且自己也无法举出反例,可以...原创 2019-02-23 00:05:38 · 356 阅读 · 0 评论 -
二叉树三种遍历方式的非递归写法/构建二叉树
1 参考链接 这里2 利用原二叉树的扩展二叉树的前序遍历序列构建二叉树,并对该二叉树进行中序遍历(非递归)#include <cstdio>#include <stack>#include <iostream>using namespace std;//树节点表示typedef struct BiTNode{ int value;...原创 2019-01-12 17:10:07 · 177 阅读 · 0 评论