随笔分类 -  数据结构与算法

摘要:【快排】 - 核心思想:本来的问题规模很大,不断缩小问题规模 - 算法 假定待排序的数组为 arr ,start = 0,end = arr.length -1 (1)在[ start , end ] 范围中 选择一个arr[ index ],以这个数为基准,遍历将数组分成两半 (2)将原问题 变成 阅读全文
posted @ 2019-03-21 09:44 chsobin 阅读(172) 评论(0) 推荐(0)
摘要:【原理】 (1)next数组原理 (2)特殊情况的处理(巧妙增设哨兵) (3)递推法构造next[]表 【实现代码】 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 阅读全文
posted @ 2018-05-05 20:49 chsobin 阅读(178) 评论(0) 推荐(0)
摘要:【知识点】 必败点和必胜点属性 (1) 所有终结点是必败点(P点); (2) 从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点); (3)无论如何操作, 从必败点(P点)都只能进入必胜点(N点). (一)巴什博奕(Bash Game) 问题:n个物品,2人轮流取,一次至少取1个最多取m个 阅读全文
posted @ 2018-03-23 17:24 chsobin 阅读(157) 评论(0) 推荐(0)
摘要:【快速幂】O(logn)时间复杂度 【矩阵快速幂】 该算法只适用于方阵 设 A 为方阵 , 快速求 A n 的算法 【应用】求递推式的第n项,例如 斐波那契 递推公式 f(n) = f(n-1) + f(n-2) 可以转换成以下矩阵运算: 由上述递推式我们可以求出矩阵 因此原本求 f(1000) 需 阅读全文
posted @ 2018-02-05 14:12 chsobin 阅读(5542) 评论(3) 推荐(1)
摘要:【前缀树】 用来保存一个映射(通常情况下 key 为字符串 value 为字符串所代表的信息) 例如:一个单词集合 words = { apple, cat, water } 其中 key 为单词 value 代表该单词是否存在 words[ 'apple' ] = 存在 而 word[ ' abc 阅读全文
posted @ 2018-01-28 20:39 chsobin 阅读(351) 评论(0) 推荐(0)
摘要:【线段树】 本质是二叉树,每个节点表示一个区间 [ L, R ],设 m = (R - L + 1) / 2 (该处结果向下取整) 左孩子区间为 [ L, m ] , 右孩子区间为 [ m+1 , R ] 同时每个节点(即每个区间)维护一个信息 (该信息能通过子节点区间结果合并得到父区间结果) 图解 阅读全文
posted @ 2018-01-26 16:26 chsobin 阅读(452) 评论(0) 推荐(0)
摘要:【RMQ】 Range Minimum/Maximum Query 范围最值问题 【ST算法】 解决RMQ问题的有效算法 预处理 经过预处理构造出d,预处理时间复杂度 O(nlogn) 运用动态规划的思想 d(i, j) 表示 范围 i ~ i + 2j-1 的最小值则有状态转移方程 d(i, j) 阅读全文
posted @ 2018-01-25 22:28 chsobin 阅读(260) 评论(0) 推荐(0)
摘要:【树状数组】 顾名思义:本质是数组,逻辑上是被构造出来的二叉树,方便求前缀和,以及更新元素值 关键:设原数组为A,设构造出来的树状数组为 C,令 C i = A i-lowbit(i) + 1 + A i-lowbit(i) + 2 + .......... + Ai , 其中lowbit(i) = 阅读全文
posted @ 2018-01-23 02:27 chsobin 阅读(147) 评论(0) 推荐(0)
摘要:【并查集】 为实现 在 不相交集合 上的操作 (1.合并两个集合 2.查询某个元素属于哪个集合)而定义的一种数据结构 其实现有两种方式:链表和有根树 【应用】 在图论中 一个联通分量的所有点 对应一个集合 对应的操作可以为 判断两个点是不是在同一个联通分量之中 添加一条边合并两个联通分量 【优化】 阅读全文
posted @ 2017-12-06 21:47 chsobin 阅读(191) 评论(0) 推荐(0)
摘要:【题目链接】 http://poj.org/problem?id=1222 【题目大意】 5*6的一个由灯组成的方阵 操作一个灯 周围的上下左右四个灯会发生相应变化 即由灭变亮 由亮变灭 问如何操作使灯全亮 【题解】 对于每个灯可以列出一个方程 Lk:表示第 k 个灯的初始终状态 ai:表示第 i 阅读全文
posted @ 2017-08-27 00:26 chsobin 阅读(182) 评论(0) 推荐(0)
摘要:递归版(在区间[x, y)中找v的位置) 1 //递归版二分查找 2 int bsearch(int * A, int x, int y, int v) 3 { 4 5 if(v<a[x] || v>a[y-1]) return -1; 6 int m = x + (y-x)/2; //此处能不能用 阅读全文
posted @ 2017-08-18 22:50 chsobin 阅读(119) 评论(0) 推荐(0)
摘要:运用分治法: 1.划分问题:把序列分成元素个数尽量相等的两半 2.递归求解:把两半元素分别排序 3.合并问题:把两个有序表合并成一个 时间复杂度:T(n) = 2T(n/2) + 2n > O(nlogn) 1 #include<bits/stdc++.h> 2 using namespace st 阅读全文
posted @ 2017-08-18 11:40 chsobin 阅读(151) 评论(0) 推荐(0)