二维线段树

二维线段树
可以用树套树方式实现,即每个外层线 段树的节点对应于一棵内层线段树。如 果外层线段树根对应的区间是x方向的 [1,n],那么内层线段树根节点对应的区间 是y方向的[1,m],那么整个线段树可以存 在一个n行m列的二维数组里。
也可以用一个外层线段树节点里存一棵内层 线段树的方式来实现。

二维线段树
所有性质与线段树类似,插入、删除、查找 等时间复杂度为O(logn*logm)。

POJ 2155 Matrix N * N 的矩阵,每个元素要么是0,要么是1,开 始全0 不断进行两种操作: 1)C x1 y1 x2 y2 表示要将左上角为(x1,y1),右下 角为(x2,y2)的子矩阵里的全部元素都取反(0变 1,1变0) (1<=x1<=x2<=n,1<=y1<=y2<=n) 2)Q x y 查询(x,y)处元素的值

POJ 2155 Matrix 如果用二维树状数组,那么每次C操作(子矩阵取 反)的时间是O(n*n),太慢 所以要用二维线段树 X方向对应于外层线段树的节点,Y方向对应于内 层线段树的节点。每一个外层线段树的节点,都 对应一棵内层的线段树,所以空间复杂度是 O(n*n) 执行 C x1 y1 x2 y2 时先根据[x1,x2]访问一系列 被该区间覆盖的外层树节点,然后在被完整覆盖 的外层节点中,根据[y1,y2]再去访问内层线段树 。

ACM经典算法及配套练习题

POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,p oj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026) (4)拓扑排序(poj1094) (5)二分图的最大匹配(匈牙利算法) (poj3041,poj3020) (6)最大流的增广路算法(KM算法). (poj1459,poj3436) 三.数据结构. (1)串(poj1035,poj3080,poj1936) (2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299) (3)简单并查集的应用. (4)哈希表和二分查找等高效查找法(数的Hash,串的Hash) (poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503) (5)哈夫曼树(poj3253) (6)堆 (7)trie树(静态建树、动态建树) (poj2513) 四.简单搜索 (1)深度优先搜索(poj2488,poj3083,poj3009,poj1321,poj2251) (2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414) (3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129) 五.动态规划 (1)背包问题. (poj1837,poj1276) (2)型如下表的简单DP(可参考lrj的书page149): 1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533) 2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列) (poj3176,poj1080,poj1159) 3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题) 六.数学 (1)组合数学:

经典基本算法模块

复赛算法模块 信息学奥赛组 对于NOIP,基础是相当重要的,在3个小时之内做完4道题,那么就要求我们有相当快的速度。特别是对于一些简单的、常用的算法模块,一定要要熟练掌握并灵活运用。由于NOIP是一个比较基础的比赛,因此基本算法的掌握尤为重要,所以要求能够把这些基本的模块快速、准确的移植到不同的程序中,才能在稳中取胜 基本算法模块中最重要的是基本程序框架,也就是说,要养成适合于自己的程序风格,这样对于程序编写的速度与程序的准确度都有较大的提高。

小议竞赛的准备和考试技巧 1、良好的心态。无论竞赛多么重要,都不要在考试的时候考虑考试之前或以后的事,这很重要…… 2、充足的睡眠和营养。竞赛之前睡好觉,吃好饭,多吃甜食(据我们老师说在吃甜食后15分钟和2小时会各出现一次血糖高峰,会有比较好的竞技状态)。还有,宁可撒尿也不要口渴……口渴会严重影响思路……而尿素有兴奋作用,有利无害…… 3、正确的时间安排。一般来说应该先想完所有的题再开始做,但有的题想不出来的时候一定要给想出来的题留出时间。 4、算法的学习。一般的DFS/BFS、贪心、各种DP、二分法、排序、lr论文中的各种奇特算法、最短路、最长路、图的DFS/BFS、最大匹配,最大最小匹配、最佳匹配、差分限制系统、最长不xx子序列、高斯消元、数论算法…… 5、数据结构的学习。Hash、并查集、邻接表、边表、堆、树状数组和线段树及它们的多维形式、链表、单词查找树…… 6、关于混分:超时的搜索/DP往往能比错误的贪心得到更多的分。 7、数学很重要。比如母函数…… 8、专用的方法胜于通用的方法。 9、好的题目往往不能直接用经典算法解决。 10、真正难题的标程往往很短。 11、如果n很大,用汇编写的O(n^2)的程序绝对不如用QB写的O(n)的程序快。 12、如果n很小,利用压缩存储提高速度的O(n^2)的算法有可能比一般的O(n)算法快。 13、如果一个数学问题很复杂,那么看结果找规律有可能比数学推导快。 14、不要总把logn忽略掉。 15、即使是多项式算法,有时也可以加入很有效的剪枝。 16、做一道好题胜过做n道烂题,但如果不做烂题,可能会影响做好题的速度。

树状数组

树状数组 武钢三中 吴豪【引言】 在解题过程中,我们有时需要维护一个数组的前缀和S[i]=A[1]+A[2]+...+A[i]。但是不难发现,如果我们修改了任意一个A[i],S[i]、S[i+1]...S[n]都会发生变化。可以说,每次修改A[i]后,调整前缀和S[]在最坏情况下会需要O(n)的时间。当n非常大时,程序会运行得非常缓慢。因此,这里我们引入“树状数组”,它的修改与求和都是O(logn)的,效率非常高。 【理论】 为了对树状数组有个形 象的认识,我们先看下面这张图。 如图所示,红色矩形表示的数组C[]就是树状数组。 这里,C[i]表示A[i-2^k+1]到A[i]的和,而k则是i在二进制时末尾0的个数,或者说是i用 2的幂方和表示时的最小指数。( 当然,利用位运算,我们可以直接计算出2^k=i&(i^(i-1)) )同时,我们也不难发现,这个k就是该节点在树中的高度,因而这个树的高度不会超过logn。所以,当我们修 改A[i]的值时,可以从C[i]往根节点一路上溯,调整这条路上的所有C[]即可,这个操作的复杂度在最坏情况下就是树的高度即O(logn)。另外,对于求数列的前n项和,只需找到n以前的所有最大子树,把其根节点的C加起来即可。不难发现,这些子树的数目是n在二进制时1的个数,或者说是把n展开 成2的幂方和时的项数,因此,求和操作的复杂度也是O(logn)。 接着,我们考察这两种操作下标变化的规律: 首先看修改操作: 已知下标i,求其父节点的下标。我们可以考虑对树从逻辑上转化:

如图,我们将子树向右对称翻折,虚拟出一些空白结点(图中白色),将原树转化成完全二叉树。 有图可知,对于节点i,其父节点的下标与翻折出的空白节点下标相同。 因而父节点下标 p=i+2^k (2^k是i用2的幂方和展开式中的最小幂,即i为根节点子树的规模)即 p = i + i&(i^(i-1)) 。 接着对于求和操作: 因为每棵子树覆盖的范围都是2的幂,所以我们要求子树i的前一棵树,只需让i减去2的最小幂即可。即 p = i - i&(i^(i-1)) 。 至此,我们已经比较详细的分析了树状数组的复杂度和原理。 在最后,我们将给出一些树状数组的实现代码,希望读者能够仔细体会其中的细节。 【代码】 求最小幂2^k: in t L o wb i t(in t t) { retur n t & ( t ^ ( t - 1 ) ); } 求前n项和: in t S um(in t e n d) { in t sum = 0; wh il e(e n d> 0) {

几何问题c++算法

计算几何入门题(转) 原来在文章里转的,现在放到计算几何专题中来: 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠。 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板。如果代码一片混乱,那么会严重影响做题正确率。 4.注意精度控制。 5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍,或扩大sqrt2)。因为整数不用考虑浮点误差,而且运算比浮点快。 一。点,线,面,形基本关系,点积叉积的理解 POJ 2318 TOYS(推荐) https://www.360docs.net/doc/c813822840.html,/JudgeOnline/problem?id=2318 POJ 2398 Toy Storage(推荐) https://www.360docs.net/doc/c813822840.html,/JudgeOnline/problem?id=2398 一个矩形,有被若干直线分成N个格子,给出一个点的坐标,问你该点位于哪个点中。

知识点:其实就是点在凸四边形内的判断,若利用叉积的性质,可以二分求解。POJ 3304 Segments https://www.360docs.net/doc/c813822840.html,/JudgeOnline/problem?id=3304 知识点:线段与直线相交,注意枚举时重合点的处理 POJ 1269 Intersecting Lines https://www.360docs.net/doc/c813822840.html,/JudgeOnline/problem?id=1269 知识点:直线相交判断,求相交交点 POJ 1556 The Doors (推荐) https://www.360docs.net/doc/c813822840.html,/JudgeOnline/problem?id=1556 知识点:简单图论+简单计算几何,先求线段相交,然后再用Dij求最短路。POJ 2653 Pick-up sticks https://www.360docs.net/doc/c813822840.html,/JudgeOnline/problem?id=2653 知识点:还是线段相交判断 POJ 1066 Treasure Hunt https://www.360docs.net/doc/c813822840.html,/JudgeOnline/problem?id=1066

线段树完全版 ~by NotOnlySuccess

线段树完全版 ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku 打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了,很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格,实在是过意不去,正好过几天又要给集训队讲解线段树,所以决定把这些题目重新写一遍,顺便把近年我接触到的一些新题更新上去~;并且学习了splay 等更高级的数据结构后对线段树的体会有更深了一层,线段树的写法也就比以前飘逸,简洁且方便多了. 在代码前先介绍一些我的线段树风格: ? maxn 是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn 的最小2x 的两倍 ? lson 和rson 分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定于比较方便的表示 ? 以前的写法是另外开两个个数组记录每个结点所表示的区间,其实这个区间不必保存,一边算一边传下去就行,只需要写函数的时候多两个参数,结合lson 和rson 的预定义可以很方便 ? PushUP(int rt)是把当前结点的信息更新到父结点 ? PushDown(int rt)是把当前结点的信息更新给儿子结点 ? rt 表示当前子树的根(root),也就是当前所在的结点 整理这些题目后我觉得线段树的题目整体上可以分成以下四个部分: ? 单点更新:最最基础的线段树,只更新叶子节点,然后把信息用PushUP(int r)这个函数更新上来 o hdu1166 敌兵布阵 题意:O(-1) 思路:O(-1) 线段树功能:update:单点增减 query:区间求和 ?View Code CPP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 const int maxn = 55555; int sum [maxn <<2]; void PushUP (int rt ) { sum [rt ] = sum [rt <<1] + sum [rt <<1|1]; } void build (int l,int r,int rt ) { if (l == r ) { scanf ("%d",&sum [rt ]); return ; } int m = (l + r ) >> 1; build (lson );

JAVA英语单词(带音标)

Java基础常见英语词汇(共70个) ['?bd?ekt]['?:rientid]导向的['pr??ɡr?m??]编程 OO: object-oriented ,面向对象OOP: object-oriented programming,面向对象编程[d?'vel?pm?nt][k?t]工具箱['v??tj??l]虚拟的 JDK:Java development kit, java开发工具包JVM:java virtual machine ,java虚拟机 ['d?ɑ?v?][m?'?i?n]机器 [k?m'pa?l] Compile:编绎Run:运行 ['ve?r??b(?)l] [?p?'re??(?)n] [p?'r?m?t?] variable:变量operation:操作,运算parameter:参数 ['f??(k)?(?)n] function:函数member-variable:成员变量member-function:成员函数 [d?'f??lt] ['?kses] ['p?k?d?] [?m'p??t] ['st?t?k] default:默认access:访问package:包import:导入static:静态的 [v?id] ['pe?r(?)nt] [be?s] ['sju?p?] void:无(返回类型) parent class:父类base class:基类super class:超类 [t?a?ld] [di'raivd] [??v?'ra?d] [??v?'l??d] child class:子类derived class:派生类override:重写,覆盖overload:重载['fa?n(?)l] ['?mpl?m(?)nts] final:最终的,不能改变的implements:实现 [r?n'taim] [?riθ'metik][ik'sep??n] Runtime:运行时ArithmeticException:算术异常 [?'rei]['indeks] [baundz][ik'sep??n] [n?l] ['p?int?]指针ArrayIndexOutOfBoundsException:数组下标越界异常Null Pointer Exception:空引用异常ClassNotFoundException:类没有发现异常 ['n?mb?]['f?:m?t] NumberFormatException:数字格式异常(字符串不能转化为数字) [θr?uz] Throws: (投掷)表示强制异常处理Throwable:(可抛出的)表示所有异常类的祖先类 [l??]['l??ɡwid?][ju'til] [,dis'plei] [?'rei] [list] Lang:language,语言Util:工具Display:显示ArrayList:(数组列表)表示动态数组[h??][m?p] HashMap: 散列表,哈希表 [swi?] ['?bstr?kt] ['wind?u] ['tu:lkit] Swing:轻巧的Awt:abstract window toolkit:抽象窗口工具包 [freim] ['p?nl] ['leiaut] [skr?ul] ['v?:tik?l] Frame:窗体Panel:面板Layout:布局Scroll:滚动Vertical:垂直 ['h?ri'z?nt?l] ['leibl] [tekst] ['fi:ld] Horizontal:水平Label:标签TextField:文本框 ['ε?ri?] ['b?t?n] [t?ek] [b?ks] TextArea:文本域Button:按钮Checkbox:复选框

计算机科学中的树

·AVL树·红黑树·伸展树·树堆·节点大小平衡树 ·B+树·B*树·B x树·UB树·2-3树·2-3-4·(a,b)-树·Dancing tree ·H树 ·基数树 ·八叉树·k-d树·vp-树·R树·R*树·R+树·X ·线段树·希尔伯特R树·优先R树

并且左右两个子树都是一棵平衡二叉树。构造与调整方法平衡二叉树的常用算法有红黑树、AVL、Treap、伸展树等。 堆(二叉堆) ---------------------------------------------------------------------------------------------------------- ----- 堆是一种完全二叉树,效率很高,常用的排序算法、Dijkstra算法、Prim算法等都要用堆(优先级队列)优化。一般的二叉堆不能进行有效查找和堆之间的合并。 (插入,获得及删除最小值) 可并堆 可以在O(logN)时间内完成两个堆的合并操作的二叉堆。如左偏堆,二项堆,斐波那契堆。 最优二叉树(哈夫曼树) ---------------------------------------------------------------------------------------------------------- -------

给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。 字典树 ---------------------------------------------------------------------------------------------------------- ------ 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 AVL树 ---------------------------------------------------------------------------------------------------------- --------- 是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。 伸展树

杭电acm

杭电acm 1001这个就不用说了吧 1002简单的大数 1003DP经典问题,最大连续子段和 1004简单题 1005找规律(循环点) 1006感觉有点BT的题,我到现在还没过 1007经典问题,最近点对问题,用分治 1008简单题 1009贪心 1010搜索题,剪枝很关键 1011 1012简单题 1013简单题(有个小陷阱) 1014简单题 1015可以看作搜索题吧 1016经典的搜索 1017简单数学题 1018简单数学题 1019简单数学题 1020简单的字符串处理 1021找规律的数学题 1022数据结构的题(栈的应用) 1023特殊的数(CatalanNumber) 1024经典DP,最大M子段和 1025经典DP,最长递增子序列(要用NLogN的方法过)1026搜索 1027数学题(或用STL) 1028经典问题,整数拆分,用母函数做 1029简单题(一般方法容易超时) 1030简单题,可用模拟过 1031简单题 1032简单题 1033模拟题 1034CandySharingGame 1035模拟题 1036简单题 1037简单题,不是一般的简单 1038简单题 1039字符串处理 1040简单题,排序 1041简单题,用大数 1042大数 1043经典搜索题,八数码问题

1044稍微有点麻烦的搜索题 1045搜索题,可用匹配做 1046简单题 1047简单的大数 1048简单字符串处理 1049简单题 1050贪心 1051经典贪心,也可以用DP 1052贪心 1053贪心,关于Huffman编码 1054二分匹配 1055二分匹配 1056简单题 1057模拟题 1058经典问题,丑数,DP 1059经典问题,可以用母函数或DP(不针对题目优化都会超时)1060数学题 1061数学题 1062简单字符串处理 1063模拟大数 1064简单题 1065简单题 1066数学题,找规律 1067 1068经典二分匹配 1069经典DP 1070简单题 1071简单数学题 1072搜索 1073字符串处理 1074DP 1075字典树 1076简单题 1077 1078DP 1079博弈(DP) 1080DP 1081经典DP 1082简单题 1083二分匹配 1084简单题 1085母函数 1086简单几何题 1087简单DP

程序员常用词汇

(计算机编程英语词汇) 算法常用术语中英对照 Data Structures 基本数据结构 Dictionaries 字典 Priority Queues 堆 Graph Data Structures 图 Set Data Structures 集合 Kd-Trees 线段树 Numerical Problems 数值问题 Solving Linear Equations 线性方程组 Bandwidth Reduction 带宽压缩 Matrix Multiplication 矩阵乘法 Determinants and Permanents 行列式 Constrained and Unconstrained Optimization 最值问题Linear Programming 线性规划 Random Number Generation 随机数生成 Factoring and Primality Testing 因子分解/质数判定Arbitrary Precision Arithmetic 高精度计算Knapsack Problem 背包问题 Discrete Fourier Transform 离散Fourier 变换Combinatorial Problems 组合问题 Sorting 排序 Searching 查找 Median and Selection 中位数 Generating Permutations 排列生成 Generating Subsets 子集生成 Generating Partitions 划分生成 Generating Graphs 图的生成 Calendrical Calculations 日期 Job Scheduling 工程安排 Satisfiability 可满足性 Graph Problems -- polynomial 图论-多项式算法Connected Components 连通分支 Topological Sorting 拓扑排序 Minimum Spanning Tree 最小生成树 Shortest Path 最短路径 Transitive Closure and Reduction 传递闭包Matching 匹配 Eulerian Cycle / Chinese Postman Euler 回路/中国邮路Edge and Vertex Connectivity 割边/割点 Network Flow 网络流 Drawing Graphs Nicely 图的描绘 Drawing Trees 树的描绘

STL、线段树代码库

STL | 全排列函数next_permutation STL 中专门用于排列的函数(可以处理存在重复数据集的排列问题) 头文件:#include using namespace std; 调用: next_permutation(start, end); 注意:函数要求输入的是一个升序排列的序列的头指针和尾指针. 用法: // 数组 int a[N]; sort(a, a + N); next_permutation(a, a + N); // 向量 vector ivec; sort(ivec.begin(), ivec.end()); next_permutation(ivec.begin(), ivec.end( )); 例子: vector myVec; // 初始化代码 sort(myVec.begin(), myVec.end()); do { for (i = 0 ; i < size; i ++ ) cout < < myVec[i] << " \t " ; cout << endl; } while (next_permutation(myVec.begin(), m yVec.end())); ACM / ICPC 竞赛之STL 简介 一、关于STL STL(Standard Template Library,标准模板库)是C++ 语言标准中的重 要组成部分。STL 以模板类和模板函数的形式为程序员提供了各种数据结构和 算法的精巧实现,程序员如果能够充分地利用STL ,可以在代码空间、执行时 间和编码效率上获得极大的好处。 STL 大致可以分为三大类:算法(algorithm) 、容器 (container) 、迭代器 (iterator)。

杭州电子科技大学acm题目分类

杭州电子科技大学acm题目分类 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最近点对问题,用分治 1008 简单题 1009 贪心 1010 搜索题,剪枝很关键 1011 1012 简单题 1013 简单题(有个小陷阱) 1014 简单题 1015 可以看作搜索题吧 1016 经典的搜索 1017 简单数学题 1018 简单数学题 1019 简单数学题 1020 简单的字符串处理 1021 找规律的数学题 1022 数据结构的题(栈的应用) 1023 特殊的数(Catalan Number) 1024 经典DP,最大M子段和 1025 经典DP,最长递增子序列(要用NLogN的方法过)1026 搜索 1027 数学题(或用STL) 1028 经典问题,整数拆分,用母函数做1029 简单题(一般方法容易超时)1030 简单题,可用模拟过 1031 简单题 1032 简单题 1033 模拟题 1034 Candy Sharing Game 1035 模拟题 1036 简单题 1037 简单题,不是一般的简单 1038 简单题 1039 字符串处理 1040 简单题,排序 1041 简单题,用大数 1042 大数 1043 经典搜索题,八数码问题 1044 稍微有点麻烦的搜索题 1045 搜索题,可用匹配做 1046 简单题 1047 简单的大数 1048 简单字符串处理 1049 简单题

1050 贪心 1051 经典贪心,也可以用DP 1052 贪心 1053 贪心,关于Huffman编码 1054 二分匹配 1055 二分匹配 1056 简单题 1057 模拟题 1058 经典问题,丑数,DP 1059 经典问题,可以用母函数或DP(不针对题目优化都会超时)1060 数学题 1061 数学题 1062 简单字符串处理 1063 模拟大数 1064 简单题 1065 简单题 1066 数学题,找规律 1067 1068 经典二分匹配 1069 经典DP 1070 简单题 1071 简单数学题 1072 搜索 1073 字符串处理 1074 DP 1075 字典树1076 简单题 1077 1078 DP 1079 博弈(DP) 1080 DP 1081 经典DP 1082 简单题 1083 二分匹配 1084 简单题 1085 母函数 1086 简单几何题 1087 简单DP 1088 字符串处理 1089~1096 (练习输入输出的8个题目) 1097 简单数学题 1098 数学题,注意找规律 1099 数学题 模拟题, 枚举 1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 1049 1050 1057 1062 1063 1064 1070 1073 1075 1082 1083 1084 1088 1106 1107 1113 1117 1119 1128 1129 1144 1148 1157 1161 1170 1172 1177 1197 1200 1201 1202 1205 1209 1212(大数取模) 1216(链表)1218 1219 1225 1228 1229 1230 1234 1235 1236 1237 1239 1250 1256 1259 1262 1263 1265 1266 1276 1279 1282 1283 1287 1296 1302

计算机常用术语

第一部分、计算机算法常用术语中英对照 Data Structures 基本数据结构 Dictionaries 字典 Priority Queues 堆 Graph Data Structures 图 Set Data Structures 集合 Kd-Trees 线段树 Numerical Problems 数值问题 Solving Linear Equations 线性方程组 Bandwidth Reduction 带宽压缩 Matrix Multiplication 矩阵乘法 Determinants and Permanents 行列式 Constrained and Unconstrained Optimization 最值问题Linear Programming 线性规划 Random Number Generation 随机数生成 Factoring and Primality Testing 因子分解/质数判定Arbitrary Precision Arithmetic 高精度计算 Knapsack Problem 背包问题 Discrete Fourier Transform 离散Fourier变换Combinatorial Problems 组合问题 Sorting 排序 Searching 查找 Median and Selection 中位数 Generating Permutations 排列生成 Generating Subsets 子集生成 Generating Partitions 划分生成 Generating Graphs 图的生成 Calendrical Calculations 日期 Job Scheduling 工程安排 Satisfiability 可满足性 Graph Problems -- polynomial 图论-多项式算法Connected Components 连通分支 Topological Sorting 拓扑排序 Minimum Spanning Tree 最小生成树 Shortest Path 最短路径 Transitive Closure and Reduction 传递闭包 Matching 匹配 Eulerian Cycle / Chinese Postman Euler回路/中国邮路Edge and Vertex Connectivity 割边/割点 Network Flow 网络流 Drawing Graphs Nicely 图的描绘 Drawing Trees 树的描绘 Planarity Detection and Embedding 平面性检测和嵌入Graph Problems -- hard 图论-NP问题 Clique 最大团 Independent Set 独立集 Vertex Cover 点覆盖 Traveling Salesman Problem 旅行商问题 Hamiltonian Cycle Hamilton回路 Graph Partition 图的划分 Vertex Coloring 点染色 Edge Coloring 边染色 Graph Isomorphism 同构

算法分析报告

Problem C: Cinderella 在官龙山之巅传来动人的歌声“你的眼睛是一弯深邃的湖水…”。涛涛问室友“怎么不唱《背包》了”。室友笑道:“下周我女友Ella 生日,老班建议我自弹自唱这首歌,并叮嘱我不能改歌词里的人名。对象都不对真是超级不搭。”说完继续唱“为何你Cinderella 留给我一望无际的思念…”涛涛疑惑地寻思:“老班虽然平时不羁,但是在儿女情长这方面是很严肃的,不会犯搞错对象这种低级错误!”百思不得其解后,涛涛打电话咨询薇薇女神。薇薇听完哽咽着说:“好感动啊!Ella就是Cinderella的后缀,也是灰姑娘的小名。这神构思,那女生肯定会被感动哭的…好羡慕!”涛涛想统计一下某英语词库中某单词是另一单词后缀的次数。说明:单词A称为单词B的后缀当且仅当B=CA,C不为空。 输入格式:输入包含多组数据,每组数据第一行数据是一个正整数 N(2≤N≤10 5 )代表单词的个数,第二行开始是N个相异的单词(由英文字母组成, 不包含其他字符),每个单词占一行。N=0时表示输入的结束。 输出格式:按照输入顺序,计算出每组数据中某单词是另一单词后缀的次数 输入示例: 3 ella Arcella

la 输出示例: 3 算法复杂度、核心方法及其解释 算法复杂度 T(n)=O(n) 关键问题处理 首先为了去掉这些字符串(单词)先后插入顺序的问题,我们将这些字符串(单词)倒序后再进行插入到要存放的数据结构中。这里StringBuffer类里有已经定义好的reserve()方法可以进行倒序处理。但是考虑到就算是这样子也是会使用下标的方式来获取字符串(单词)里的单个字符,所以我采用的是直接使用String类型的charAt()方法,结合一个position的下标。这里用到了字典树(用于快速检索的多叉树结构)。 实现原理 有了数据的导入方式和存储的数据结构,我们就可以定义需要存储到树节点中的单个节点内部结构。这里说到字典树是多叉树的结构,并且我们在插入的时候需要判断这个字母是否已经存在在树的下个节点中,所以我们使用HashMap作为节点以及存储每个字母的方式。 这里为了不想多写那个new,我采用了直接将Node类继承HashMap的方式,也就是当每次创建这个对象(Node)的时候就相当于创建了一个HashMap的对象。 需要注意的是,这样创建节点,是没有将单个字符单独的放在一个变量中存储,而是直接作为HashMap的Key值。如此,原本如果树中已经存在传进来的字符,就需要对count 进行自增的操作,这里的自增就需要放到当前节点的下一个count里进行(root.get(position).count++),isEnd也是一样的。isEnd默认值为false,当且仅的传入的字符是这个字符串(单词)的结尾时,才将其传化为true。

相关主题
相关文档
最新文档