acm培训资料——树与等价问题

合集下载

信息技术奥赛辅导树与二叉树

信息技术奥赛辅导树与二叉树

D. (k+1)/2
18
满二叉树和完全二叉树 一般应用顺序存储结构 进行数据的存储。
对于非满二叉树,会有 某些编号没有对应的结 点(通常称为“虚结 点”),通常可以用特 殊标记符号(例如:#) 表示虚结点,将树转换 为满二叉树进行存储。
a
b
c
d ef g
hi
j
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 abcdef g###h##i j
现实世界中,能用树的结构表示的例子: 学校的行政关系(P31)、书的层次结构(P32)、人类的家 族血缘关系等。
2
例:下图是一个有13个结点的树,其中A是 根,其余结点为分三个互不相交的子集: T1={B,E,F,K,L} T2={F,G} T3={D,H,I,J,M} T1、T2和T3都是 根A的子树。
二叉树是一种很有用的非线性结构。
二叉树具有以下两个特点: (1)非空二叉树只有一个根结点; (2)每一个结点最多有两棵子树,且分别称
为该结点的左子树与右子树。
5
6 6
二叉树的性质:
性质1:在任意一棵二叉树中,度为0的结点(即
叶子结点)总是比度为2的结点多一个。
例子1:某二叉树中度为2的结点有18个,则该二 叉树中有 19 个叶子结点。
满二叉树是指除最后一层外,每一层上的所有结点都有
两个子结点。
完全二叉树是指这样的二叉树:除最后一层外,每一层
上的结点数均达到最大值;在最后一层上只缺少右边 的若干结点。 注意:满二叉树是完全二叉树,完全二叉树不一定是满 二叉树。
若一棵完全二叉树的结点数n为偶数,则叶子结点 数为结点数除以2(即:n/2),若结点数为奇数,则 叶子结点数为结点数加一再除以2(即:(n+1)/2) 10

数据结构树的知识点总结

数据结构树的知识点总结

数据结构树的知识点总结一、树的基本概念。

1. 树的定义。

- 树是n(n ≥ 0)个结点的有限集。

当n = 0时,称为空树。

在任意一棵非空树中:- 有且仅有一个特定的称为根(root)的结点。

- 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…、Tm,其中每个集合本身又是一棵树,并且称为根的子树(sub - tree)。

2. 结点的度、树的度。

- 结点的度:结点拥有的子树个数称为结点的度。

- 树的度:树内各结点的度的最大值称为树的度。

3. 叶子结点(终端结点)和分支结点(非终端结点)- 叶子结点:度为0的结点称为叶子结点或终端结点。

- 分支结点:度不为0的结点称为分支结点或非终端结点。

- 除根结点之外,分支结点也称为内部结点。

4. 树的深度(高度)- 树的层次从根开始定义起,根为第1层,根的子结点为第2层,以此类推。

树中结点的最大层次称为树的深度(或高度)。

二、二叉树。

1. 二叉树的定义。

- 二叉树是n(n ≥ 0)个结点的有限集合:- 或者为空二叉树,即n = 0。

- 或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

2. 二叉树的特点。

- 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。

- 二叉树的子树有左右之分,次序不能颠倒。

3. 特殊的二叉树。

- 满二叉树。

- 一棵深度为k且有2^k - 1个结点的二叉树称为满二叉树。

满二叉树的特点是每一层上的结点数都是最大结点数。

- 完全二叉树。

- 深度为k的、有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。

完全二叉树的叶子结点只可能在层次最大的两层上出现;对于最大层次中的叶子结点,都依次排列在该层最左边的位置上;如果有度为1的结点,只可能有一个,且该结点只有左孩子而无右孩子。

三、二叉树的存储结构。

1. 顺序存储结构。

- 二叉树的顺序存储结构就是用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。

acm知识点

acm知识点

acm知识点转一个搞ACM需要的掌握的算法.要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来.适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红,发挥自己的长处,这才是重要的.第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来.1.最短路(Floyd、Dijstra,BellmanFord)2.最小生成树(先写个prim,kruscal要用并查集,不好写)3.大数(高精度)加减乘除4.二分查找. (代码可在五行以内)5.叉乘、判线段相交、然后写个凸包.6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简)7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式.8. 调用系统的qsort, 技巧很多,慢慢掌握.9. 任意进制间的转换第二阶段:练习复杂一点,但也较常用的算法。

如:1. 二分图匹配(匈牙利),最小路径覆盖2. 网络流,最小费用流。

3. 线段树.4. 并查集。

5. 熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp6.博弈类算法。

博弈树,二进制法等。

7.最大团,最大独立集。

8.判断点在多边形内。

9. 差分约束系统.10. 双向广度搜索、A*算法,最小耗散优先.相关的知识图论路径问题0/1边权最短路径BFS非负边权最短路径(Dijkstra)可以用Dijkstra解决问题的特征负边权最短路径Bellman-FordBellman-Ford的Yen-氏优化差分约束系统Floyd广义路径问题传递闭包极小极大距离 / 极大极小距离Euler Path / Tour圈套圈算法混合图的 Euler Path / Tour Hamilton Path / Tour特殊图的Hamilton Path / Tour 构造生成树问题最小生成树第k小生成树最优比率生成树0/1分数规划度限制生成树连通性问题强大的DFS算法无向图连通性割点割边二连通分支有向图连通性强连通分支2-SAT最小点基有向无环图拓扑排序有向无环图与动态规划的关系二分图匹配问题一般图问题与二分图问题的转换思路最大匹配有向图的最小路径覆盖0 / 1矩阵的最小覆盖完备匹配最优匹配稳定婚姻网络流问题网络流模型的简单特征和与线性规划的关系最大流最小割定理最大流问题有上下界的最大流问题循环流最小费用最大流 / 最大费用最大流弦图的性质和判定组合数学解决组合数学问题时常用的思想逼近递推 / 动态规划概率问题Polya定理计算几何 / 解析几何计算几何的核心:叉积 / 面积解析几何的主力:复数基本形点直线,线段多边形凸多边形 / 凸包凸包算法的引进,卷包裹法Graham扫描法水平序的引进,共线凸包的补丁完美凸包算法相关判定两直线相交两线段相交点在任意多边形内的判定点在凸多边形内的判定经典问题最小外接圆近似O(n)的最小外接圆算法点集直径旋转卡壳,对踵点多边形的三角剖分数学 / 数论最大公约数Euclid算法扩展的Euclid算法同余方程 / 二元一次不定方程同余方程组线性方程组高斯消元法解mod 2域上的线性方程组整系数方程组的精确解法矩阵行列式的计算利用矩阵乘法快速计算递推关系分数分数树连分数逼近数论计算求N的约数个数求phi(N)求约数和快速数论变换……素数问题概率判素算法概率因子分解数据结构组织结构二叉堆左偏树二项树胜者树跳跃表样式图标斜堆reap统计结构树状数组虚二叉树线段树矩形面积并圆形面积并关系结构Hash表并查集路径压缩思想的应用STL中的数据结构vectordequeset / map动态规划 / 记忆化搜索动态规划和记忆化搜索在思考方式上的区别最长子序列系列问题最长不下降子序列最长公共子序列最长公共不下降子序列一类NP问题的动态规划解法树型动态规划背包问题动态规划的优化四边形不等式函数的凸凹性状态设计规划方向线性规划常用思想二分最小表示法串KMP Trie结构后缀树/后缀数组 LCA/RMQ有限状态自动机理论排序选择/冒泡快速排序堆排序归并排序基数排序拓扑排序排序网络初期:一.基本算法:(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)组合数学:1.加法原理和乘法原理.2.排列组合.3.递推关系.(POJ3252,poj1850,poj1019,poj1942)(2)数论.1.素数与整除问题2.进制位.3.同余模运算.(poj2635, poj3292,poj1845,poj2115)(3)计算方法.1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)七.计算几何学.(1)几何公式.(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)(poj1408,poj1584)(4)凸包. (poj2187,poj1113)中级:一.基本算法:(1)C++的标准模版库的应用. (poj3096,poj3007)(2)较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)二.图算法:(1)差分约束系统的建立和求解. (poj1201,poj2983)(2)最小费用最大流(poj2516,poj2516,poj2195)(3)双连通分量(poj2942)(4)强连通分支及其缩点.(poj2186)(5)图的割边和割点(poj3352)(6)最小割模型、网络流规约(poj3308, )三.数据结构.(1)线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)(2)静态二叉检索树. (poj2482,poj2352)(3)树状树组(poj1195,poj3321)(4)RMQ. (poj3264,poj3368)(5)并查集的高级应用. (poj1703,2492)(6)KMP算法. (poj1961,poj2406)四.搜索(1)最优化剪枝和可行性剪枝(2)搜索的技巧和优化 (poj3411,poj1724)(3)记忆化搜索(poj3373,poj1691)五.动态规划(1)较为复杂的动态规划(如动态规划解特别的施行商问题等)(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj303 4)(2)记录状态的动态规划. (POJ3254,poj2411,poj1185)(3)树型动态规划(poj2057,poj1947,poj2486,poj3140)六.数学(1)组合数学:1.容斥原理.2.抽屉原理.3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).4.递推关系和母函数.(2)数学.1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)2.概率问题. (poj3071,poj3440)3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)(3)计算方法.1.0/1分数规划. (poj2976)2.三分法求解单峰(单谷)的极值.3.矩阵法(poj3150,poj3422,poj3070)4.迭代逼近(poj3301)(4)随机化算法(poj3318,poj2454)(5)杂题.(poj1870,poj3296,poj3286,poj1095)七.计算几何学.(1)坐标离散化.(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)(3)多边形的内核(半平面交)(poj3130,poj3335)(4)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)高级:一.基本算法要求:(1)代码快速写成,精简但不失风格(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)(2)保证正确性和高效性. poj3434二.图算法:(1)度限制最小生成树和第K最短路. (poj1639)(2)最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)(poj3155,poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446(3)最优比率生成树. (poj2728)(4)最小树形图(poj3164)(5)次小生成树.(6)无向图、有向图的最小环三.数据结构.(1)trie图的建立和应用. (poj2778)(2)LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和在线算法(RMQ+dfs)).(poj1330)(3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的目的). (poj2823)(4)左偏树(可合并堆).(5)后缀树(非常有用的数据结构,也是赛区考题的热点).(poj3415,poj3294)四.搜索(1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)(2)广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)(3)深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法. (poj3131,poj2870,poj2286)五.动态规划(1)需要用数据结构优化的动态规划.(poj2754,poj3378,poj3017)(2)四边形不等式理论.(3)较难的状态DP(poj3133)六.数学(1)组合数学.1.MoBius反演(poj2888,poj2154)2.偏序关系理论.(2)博奕论.1.极大极小过程(poj3317,poj1085)2.Nim问题.七.计算几何学.(1)半平面求交(poj3384,poj2540)(2)可视图的建立(poj2966)(3)点集最小圆覆盖.(4)对踵点(poj2079)八.综合题.(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj331 5,poj2148,poj1263)。

数据结构-C语言描述(第三版)(陈慧南)章 (6)

数据结构-C语言描述(第三版)(陈慧南)章 (6)

第6章 树 例如,设有序表为(21, 25, 28, 33, 36, 43),若要在表中 查找元素36,通常的做法是从表中第一个元素开始,将待查元素 与表中元素逐一比较进行查找,直到找到36为止。粗略地说,如 果表中每个元素的查找概率是相等的,则平均起来,成功查找一 个元素需要将该元素与表中一半元素作比较。如果将表中元素组 成图6-3所示的树形结构,情况就大为改观。我们可以从根结点 起,将各结点与待查元素比较,在查找成功的情况下,所需的最 多的比较次数是从根到待查元素的路径上遇到的结点数目。当表 的长度n很大时,使用图6-3所示的树形结构组织表中数据,可 以很大程度地减少查找所需的时间。为了查找36,我们可以让36 与根结点元素28比较,36比28大,接着查右子树,查找成功。显 然,采用树形结构能节省查找时间。
第6章 树
E
E
A
F
B
G
CD
LJ
M
N
T1
X
YZ
U T2
B
F
A
DC
G
JL
T3 N
M
(a)
(b)
图6-2 树的例子
(a) 树T1和T2组成森林;(b) 树T3
第6章 树
6.2 二 叉 树
二叉树是非常重要的树形数据结构。很多从实际问题中抽 象出来的数据都是二叉树形的,而且许多算法如果采用二叉树 形式解决则非常方便和高效。此外,以后我们将看到一般的树 或森林都可通过一个简单的转换得到与之相应的二叉树,从而 为树和森林的存储及运算的实现提供了有效方法。
第6章 树
图6-1描述了欧洲部分语言的谱系关系,它是一个后裔图, 图中使用的描述树形结构数据的形式为倒置的树形表示法。在 前几章中,我们学习了多种线性数据结构,但是一般来讲,这 些数据结构不适合表示如图6-1所示的层次结构的数据。为了 表示这类层次结构的数据,我们采用树形数据结构。在本章中 我们将学习多种不同特性的树形数据结构,如一般树、二叉树、 穿线二叉树、堆和哈夫曼树等。

程序设计竞赛常用算法

程序设计竞赛常用算法

常用算法设计方法要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。

计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。

算法数据结构是程序的两个重要方面。

算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。

指令正确地描述了要完成的任务和它们被执行的顺序。

计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解。

通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。

其次是算法所需要的存储空间少和执行更快等。

算法设计是一件非常困难的工作,常用的算法设计方法主要有迭代法、穷举搜索法、递推法、递归法、贪婪法、回溯法、分治法、动态规划法等。

一、迭代法迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。

设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:(1)选一个方程的近似根,赋给变量x0;(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;(3)当x0与x1的差的绝对值还大于指定的精度要求时,重复步骤(2)的计算。

若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。

上述算法用C程序的形式表示为:【算法】迭代法求方程的根{ x0=初始近似根;do {x1=x0;x0=g(x1); /*按特定的方程计算新的近似根*/} while ( fabs(x0-x1)>Epsilon);prin tf(“方程的近似根是%f\n”,x0);}具体使用迭代法求根时应注意以下两种可能发生的情况:(1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;(2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。

acm竞赛知识点

acm竞赛知识点

ACM竞赛知识点简介ACM竞赛是指由国际大学生程序设计竞赛(ACM-ICPC)组织的一系列编程比赛。

ACM竞赛旨在培养学生的计算机科学和编程能力,提高解决实际问题的能力和团队合作精神。

本文将介绍ACM竞赛的基本知识点和技巧,帮助读者更好地了解和参与这一竞赛。

知识点1. 数据结构在ACM竞赛中,数据结构是解决问题的关键。

以下是一些常用的数据结构:•数组:用于存储一组相同类型的数据。

•链表:用于存储和操作具有相同数据类型的元素。

•栈:一种后进先出(LIFO)的数据结构。

•队列:一种先进先出(FIFO)的数据结构。

•树:一种非线性的数据结构,由节点和边组成。

•图:一种由节点和边组成的数据结构,用于表示各种关系。

2. 算法ACM竞赛中常用的算法包括:•排序算法:如快速排序、归并排序、堆排序等,用于将数据按照一定的规则进行排序。

•查找算法:如二分查找、哈希表等,用于在数据中查找指定的元素。

•图算法:如深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法等,用于解决图相关的问题。

•动态规划:一种将复杂问题分解为简单子问题的方法,用于解决多阶段决策问题。

•贪心算法:一种每一步都选择当前最优解的方法,用于解决优化问题。

3. 数学数学在ACM竞赛中扮演着重要的角色。

以下是一些常用的数学知识点:•组合数学:包括排列组合、二项式定理、卡特兰数等,用于计算对象的排列和组合方式。

•数论:包括素数、最大公约数、最小公倍数等,用于解决与整数相关的问题。

•概率与统计:包括概率分布、统计推断等,用于分析和预测事件发生的概率。

•矩阵与线性代数:用于解决与矩阵和线性方程组相关的问题。

4. 字符串处理在ACM竞赛中,字符串处理是常见的问题之一。

以下是一些常用的字符串处理技巧:•字符串匹配:如KMP算法、Boyer-Moore算法等,用于在一个字符串中查找另一个字符串。

•字符串排序:如字典序排序、后缀数组等,用于对字符串进行排序。

树习题解答

树习题解答

数据结构——树习题解答1、单词查找树(word.pas)【问题描述】在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表中。

为了提高查找和定位的速度,通常都画出与单词列表所对应的单词查找树,其特点如下:(1)根节点不包含字母,除根街店为每一个节点都包含一个大写英文字母;(2)从根节点到某一节点,路径上经过的字母依次连起来所构成的字母序列,称为该结点对应的单词。

单词列表中的每个单词,都是该单词查找树某个节点所对应的单词;(3)在满足上述条件下,该单词查找树的节点数最少。

要求:对一个确定的单词列表,请统计对应的单词查找树的结点数(包括根节点).输入:输入文件名为word.in,该文件为一个单词列表,每行仅包含一个单词和一个换行/回车符。

每个单词仅由大写字母组成,长度不超过63个字符。

文件总长度不超过32K,至少有一行数据。

输出:输出文件名为word.out,该文件仅包含一个整数,该整数为单词列表对应的单词查找树的结点数。

【样例输入】AANASPASASCASCIIBASBASIC【样例输出】13【题解】首先要对建树的过程有一个了解。

对于当前被处理的单词和当前树:在根节点的子节点中找单词的为第一位字母,若存在则进而在该节点的子节点中寻找第二位……,如此直到单词结束,既不需要在该书中添加节点;若单词的第n个字母不能找到,即将单词的第n个字母及其后的字母依次加入单词查找树中。

但本题只是问你结点总数,而非建树方案,且有32K大小的单词文件,所以应该考虑能不能通过不建树就直接算出结点数。

为了说明问题本质,我们定义单词相对于另一个单词的差:设单词1的长度为L,且与单词2从第N位开始不一致,则定义单词1相对于单词2的差为L-N+1,这是描述单词相似程度的量。

可见,将一个单词加入单词树的时候,须加入的节点数等于该单词树中已有的单词的差得最小值。

单词的字典顺序排列后的序列则具有类似的特性,即在一个字典顺序序列中,第m个单词相对于第m-1个单词的差必定是它对于前m-1个单词的差中最小的。

acm基础试题及答案

acm基础试题及答案

acm基础试题及答案1. 题目:给定一个整数数组,请找出数组中第二大的数。

答案:我们可以使用排序的方法,将数组从小到大排序,然后数组中的倒数第二个数就是第二大的数。

或者使用一次遍历的方法,首先初始化两个变量,一个用来存储最大值,一个用来存储第二大的值。

遍历数组,每次比较当前元素与最大值,如果当前元素大于最大值,则更新第二大的值为最大值,并将当前元素赋给最大值;如果当前元素小于最大值但大于第二大的值,则更新第二大的值。

2. 题目:实现一个函数,计算一个字符串中字符出现的次数。

答案:可以使用哈希表来实现,遍历字符串中的每个字符,将其作为键值对存储在哈希表中,键是字符,值是该字符出现的次数。

遍历结束后,哈希表中存储的就是每个字符出现的次数。

3. 题目:给定一个链表,删除链表的倒数第n个节点,并且返回新的链表头节点。

答案:可以使用双指针的方法,首先初始化两个指针,都指向链表的头节点。

然后移动第一个指针,移动n步,此时第一个指针指向倒数第n个节点的前一个节点。

接着同时移动两个指针,直到第一个指针到达链表的末尾,此时第二个指针指向的节点就是需要删除的节点的前一个节点。

然后更新第二个指针的next指针,使其指向第二个指针的next节点的next节点,最后返回链表的头节点。

4. 题目:编写一个函数,判断一个整数是否是回文数。

回文数是指正序和倒序读都一样的数。

答案:首先将整数转换为字符串,然后使用双指针的方法,一个指针从字符串的开始位置,一个指针从字符串的结束位置,向中间移动。

如果两个指针指向的字符不相等,则该整数不是回文数。

如果遍历结束后没有发现不相等的字符,则该整数是回文数。

5. 题目:给定一个字符串,找出其中不含有重复字符的最长子串的长度。

答案:可以使用滑动窗口的方法,维护一个哈希表记录窗口内字符的出现情况,以及一个变量记录不含有重复字符的最长子串的长度。

遍历字符串,每次移动窗口的右端点,如果当前字符不在窗口内,则更新最长子串的长度,并将字符添加到哈希表中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如P143图6.21
int fix_mfset( MFSet &S, int i){
if(i<1||i>S.n) return -1;
for(j=i;S.nodes[j].parent>0;j=S.nodes[j].parent);
for(k=i;k!=j;k=t){
t=S.nodes[k].parent;
当所有的m个关系处理完后,剩下的这些非空子 集即为S的R等价类。
6.5 树与等价问题
划分等价类需对集合进行的三个基本操作: 构造只含一个元素的集合 判定某个元素所在的子集 合并两个互不相交的集合
约定: 利用树型结构表示集合,每个节点表示集合的元
素 根节点的成员兼作子集的名称
6.5 树与等价问题
}
return OK; }// mix_mfset
深度不超过┗ log2n+1 ┛
6.5 树与等价问题
一个实例
假设集合S={x|1≤x ≤n是正整数},R是S上的 一个等价关系。
R={(1,2),(3,4),(5,6),(7,8),(1,3),(5,7),(1,5),…} 求S的等价类
1 2 3 4 5 6 7 8…n
if( S.nodes[i].parent>S.nodes[j].parent){
S.nodes[j].parent+=S.nodes[i].parent;
S.nodes[i].parent=j;
}else{
S.nodes[i].parent+=S.nodes[j].parent;
S.nodes[j].parent=i;
n
1 2 3 ... n
3
3
2
2 ... 2
1
1
16.5 树与等价问题改进“并”操作的算法,令成员少的子集树根节点指向成员多的子集的 根;修改存储结构—令根节点的parent与存储子集中所含成员数目的负
值St。atus mix_mfset( MFSet &S, int i, int j){
if(i<1||i>S.n||j<1||j>S.n) return ERROR;
-1 -1 -1 -1 -1 -1 -1 -1
-1
处理(1,2),(3,4),(5,6),(7,8)之后
1 2 3 4 5 6 7 8…n
-2 1 -2 3 -2 5 -2 7
-1
6.5 树与等价问题
一个实例
假设集合S={x|1≤x ≤n是正整数},R是S上的 一个等价关系。
R={(1,2),(3,4),(5,6),(7,8),(1,3),(5,7),(1,5),…} 求S的等价类
}// merge_mfset
O( 1)
6.5 树与等价问题
上述实现对于这样的例子:
假设n个集合S1,S2,…,Sn, 每个子集只有一个元素Si={i}, 用n棵只有一个根节点的树表示,做n-1次并操作后, 最后得到的集合的深度为n,加上每次进行查找成员 “1”所在子集的操作,全部操作时间是O(n2)。
(x,y ∈ S)的等价偶对确定了等价关系R,求S 的划分。
6.5 树与等价问题
确定等价类的算法:
令S中每个元素各自形成一个只含单个成员的子集, 记作S1,S2,…,Sn
重复读入m个关系(偶对),对每个读入的偶对 (x,y),判定x和y所属的子集,若这两个子集不相等, 则合并它们并取代这两个子集
6.5 树与等价问题
离散数学中的概念: 集合S上的关系R定义为SxS的一个子集。 等价关系是具有自反、传递、对称的关系。 若R是S上的等价关系,由R可以产生这个集合S的
一个唯一的划分S1,S2…,这些集合互不相交,其并 为S,分别属于不同的等价类。
6.5 树与等价问题
确定等价类的问题 假设集合S有n个元素,已知m个形如(x,y)
}// find_mfset
O( d) d—树的深度
Status merge_mfset( MFSet &s, int i, int j){ //集合的并 if( i<1||i>S.n||j<1||j>S.n) return ERROR; S.nodes[i].parent=j; return OK;
1 2 3 4 5 6 7 8…n
-4 1 1 3 -4 5 5 7
-1
处理(1,5)之后
1 2 3 4 5 6 7 8…n
-8 1 1 3 1 5 5 7
-1
6.5 树与等价问题
改进查找子集算法,增加“压缩路径”功能。当所查元素i不 在树的第二层时,在算法中增加一个“压缩路径”的功能, 即将所有从根到元素i路径上的元素都变成树根的孩子。
1 2 3 4 5 6 7 8…n
-2 1 -2 3 -2 5 -2 7
-1
处理(1,3),(5,7)之后
1 2 3 4 5 6 7 8…n
-4 1 1 3 -4 5 5 7
-1
6.5 树与等价问题
一个实例
假设集合S={x|1≤x ≤n是正整数},R是S上的 一个等价关系。
R={(1,2),(3,4),(5,6),(7,8),(1,3),(5,7),(1,5),…} 求S的等价类
集合的表示 用代树表Ti表每示个每元个素子,集每S棵i,树森的林根F节表点示同集时合S用,来每表个示节子点
集Si
两种关键的基本操作:查找某个元素是否属于某个 集合,合并两个集合。采用何种树、森林的存储 方式可以有效地实现这些基本操作?
集合的并:将一子树的根指向另一子树的根即可 是否属于集合:从该节点出发,逐级查找父节点到
S.nodes[k].parent=j; 经过这些改进后,划分等价类的时间
}
复杂度为O(nα(n)),其中α(n)≤4
return j;
}// fix_mfset
根节点为止。
6.5 树与等价问题
typedef PTree MFSet;
int find_mfset( MFSet S, int i){ //查找i所属子集 if( i<1 || i>S.n) return -1; for( j=i; S.nodes[j].parent>0; j=S.nodes[j].parent); return j;
相关文档
最新文档