![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
每一个文章讲一个算法
楚仙子
我只是想学算法
展开
-
哈希算法
哈希表 百度百科: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 特点: s ...原创 2020-11-30 22:24:30 · 229 阅读 · 0 评论 -
建图
建图 链式前向星 struct node{ int next,to,w; node(){} node(int a,int b,int c):next(a),to(b),w(c){} }G[mx]; int head[mx]; int tot; void init()//初始化 { tot=0; memeset(head,-1,sizeof(head)); } void add(int u,int v, int w)//加边,这里是单向边 { G[tot]=node(head原创 2020-12-06 14:47:18 · 114 阅读 · 0 评论 -
素数筛
质数筛原创 2020-12-06 13:48:10 · 78 阅读 · 0 评论 -
进制哈希
进制哈希 针对字符串类型,将其转化为整型,就可以实现O(1)的查询。 思想 和二进制思想是类似的。 把每一个字符串转换成数字,这个值是base进制的。 可以处理很多问题(十分方便) 实现 typedef unsigned long long ull; //对于字符串s,进行哈希处理 base = 131;//进制 h[0]=0;//hash数组 p[0]=1;//pow数组 //实现进制哈希 for(int i=1;i<=n;i++) { h[i]=(h[i-1]*base + s[i]-'原创 2020-12-01 00:15:25 · 323 阅读 · 0 评论 -
二叉树的遍历
二叉树的遍历前序遍历中序遍历后序遍历深度优先搜索广度优先搜索Morris前序遍历Morris中序遍历Morris后序遍历 为了便于理解各种遍历顺序,以下面二叉树为例进行遍历 C/C++二叉树: struct node { int val; node *left; node *right; node(int x):val(x),left(NULL),right(NULL){} }; Python二叉树: class node: def __init__(slef, x):原创 2020-10-24 10:59:38 · 115 阅读 · 0 评论 -
位运算
位运算 用了很都次,但每次都要网上查,所以记录一下(以后翻自己博客 ) 基本用法 符号 描述 运算规则 & 与 两个位数值都为1时取1,否则为0 | 或 两个位数值都为0时取0,否则为1 ^ 异或 两个位数值不相等时取1,否则为0 ~ 取反 0变成1,1变成0 << 左移 二进制数向左移一位,低位补0,高位超范围则去掉 >> 右移 二进制数向右移一位,低位去掉 巧妙用法 做题遇到就记录… ...原创 2020-10-17 10:59:01 · 82 阅读 · 0 评论 -
状态压缩
状态压缩 概念: 当状态维数很多,但总量很少时,可以将状态压缩为一个数来记录 方法: 大部分时间需要将数字转化为2进制数,用数组来保存。 常用操作 判断一个数字x二进制下第i位是不是等于1。 方法:if(((1<<(i−1))&x)>0) 将1左移i-1位,相当于制造了一个只有第i位上是1,其他位上都是0的二进制数。然后与x做与运算,如果结果>0,说明x第i位上是1,反之则是0。 将一个数字x二进制下第i位更改成1。 方法:x=x|(1<<(i−1)) 证明原创 2020-11-30 14:40:09 · 395 阅读 · 0 评论 -
堆排序
堆排序 以最大堆为例 思想(关键点) 最大堆中的最大元素值出现在根结点(堆顶) 堆中每个父节点的元素值都大于等于其孩子结点 建堆:从最下面的父亲节点开始建堆,直至根节点 新来一个节点:将其放在叶子节点,并且按照它这边父亲节点一路向上判断交换 堆排序过程:把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个结束 代码 建堆 void heapify(int *arr,int n, int k) { int largest = k;原创 2020-11-25 13:31:48 · 108 阅读 · 0 评论 -
归并排序算法
归并排序算法原创 2020-11-22 00:17:28 · 109 阅读 · 0 评论 -
快速排序算法
快速排序算法 思想 选择数组中一个数xxx进行比较,小于等于xxx的放在前面,大于xxx的放在后面 这样可以形成 “小于等于xxx的”+xxx +“大于xxx的” 的数组 再对两端进行递归该操作,直到数组长度为1 不同于归并排序,这个是从上到下,进行分解排序 过程可看这个快速排序过程 代码 void quickSort(int *arr, int begin, int end) { if(begin >= end) return; int temp = arr[原创 2020-11-21 00:00:49 · 64 阅读 · 0 评论 -
KMP算法
KMP算法 主要说明两个思路点 1.next数组的引入 "字符串匹配的时候,不想一直从头开始" 比如对于字符串: ababacdefababacdefababacdef 下标:012345原创 2020-11-19 22:59:10 · 82 阅读 · 1 评论