初赛2018(1)(自用)

 

算法

5.现有一段文言文,要通过二进制哈夫曼编码进行压缩。简单起见,假设这段文言文只由4个汉字“之”、“乎”、“者”、“也”组成,它们出现的次数分别为700、600、300、400。那么,“也”字的编码长度可能是(  )。
A.1             B.2            C.3             D.4
答案:BC
解释网上有,就是如果有相同出现次数的要爆搜一下
哈夫曼树构造:对于一个序列(以频率为权值,比如700,600,300,400),初始有序列元素个数个节点(节点权值为序列元素值),每次找出权值最小的两节点,删去,这两个节点以一个新建节点为父亲,新建节点权值为这两个节点的权值和,然后将新建节点放回去
哈夫曼树的带权路径长度:就是找出初始序列每个元素在哈夫曼树中的深度(根节点深度为0),计算所有的(元素权值*深度)之和

2.定义一种字符串操作,一次可以将其中一个元素移到任意位置。举例说明,对于字符串“BCA”可以将A移到B之前,变字符串“ABC”。如果要将字符串“DACHEBGIF”变成“ABCDEFGHI”最少需要________次操作。
答案:4

方法:找出DACHEBGIF和ABCDEFGHI的LCS(最长公共子序列),保留这个LCS内字母位置不动,只有剩下字母需要动

如此题LCS是ACEGI,剩下4个字母要动,因此答案是4

另外:编辑距离资料(待看):https://www.cnblogs.com/BlackStorm/p/5400809.html

(以上对应程序填空待做)

6、给定一个正整数N=8934632178,现决定依次删除其中6个数位上的数字(每次删除一个数位上的数字),每次删除后按原来的次序组成一个新数M的值均是当前状态下的最小数,则第四次应该删除的数字是()。
A、6 B、8 C、7 D、4
答案:D

题意就是 函数f = x=>从x中取出一位并删掉,使得得到的数最小,返回这个最小数;每一步操作相当于令n=f(n)

7、下列形状的三角形中,字幕a-i分别表示数字1,2,3,…,9
a
b c
d e
f g h i
字母a-i同时满足下列条件:
(1) a<f<i
(2) b<d,g<h,c<e
(3) a+b+d+f=f+g+h+i=i+e+c+a=19
则满足条件的三角形个数为()。
A、2 B、3 C、4 D、5
答案:C
方法:直接爆搜?没什么好方法,题怕是废了

14、若已知一个栈的入栈顺序1,2,3,…,n,其输出序列为P1,P2,P3,…,Pn(它是输入序列的一个排序),则在输出序列中可能出现的情况是()。
A、Pj<Pk<Pi,其中i<j<k B、Pk<Pj<Pi,其中i<j<k
C、Pj<Pi<Pk,其中i<j<k D、Pi<Pk<Pj,其中i<j<k
答案:BCD
只能说注意仔细看题...

直接令三个P(按顺序排的)分别为1,2,3,验证即可;如A,令Pj=1,Pk=2,Pi=3,则出栈序为3,1,2,不合法

15、设有一个含有13个元素的Hash表(0-12),Hash函数是:H(key)=key%13,其中%是求余数运算。用二次探查法解决冲突,则对于序列(8,31,20,33,18,53,27),则下列说法正确的是()。
A、18在4号格子中 B、33在6号格子中
C、31在5号格子中 D、20在7号格子中
答案:ABCD

二次探查法大概是说,如果插入x,H(x)=i,那么依次尝试i,i+1^2,i-1^2,i+2^2,i-2^2,i+3^2,i-3^2,..直到没有冲突

2、在m*n的棋盘上,每个方格(单位正方形,即边长为1的正方形)的顶点称为格点。以格点为顶点的多边形称为格点多边形。若设格点凸八边形面积的最小值为9,格点凸八边形内部(非顶点的)格点的个数的最小值为___。
答案:6
(题面里面“设”是假的,无视即可,这个只是一个提示)

根据皮克定理:S=a+b/2-1(对于格点多边形,a表示边界内点个数,b表示边界上点个数)计算即可

1、 Kathy函数是这样定义的:
f(1)=1
f(3)=3
f(2n)=f(n)
f(4n+1)=2f(2n+1)-f(n)
f(4n+3)=3f(2n+1)-2f(n)
对于一个给定的数m=55,求出所有满足f(n)=n,(n<=m)的自然数n的个数 。
答案:13
原题:hnoi2002kathy函数(并不会)

(180924后面待做)

19、下列关于图的说法正确的是():
A、欧拉图的每一个顶点都能作为某条欧拉闭迹的起点
B、 一个图有欧拉闭迹当且仅当该图有零个奇点。
C、 若一个无向图有奇数条边,则它必然不是二分图。
D、若G是汉密尔顿图,则对G上的汉密尔顿圈C,任意删去n个点,最多可将C划分为n段,反之亦然。
答案:A
注意:B不对,还要求连通

4、合唱演出在即,一名团员病倒了,不能参加。指挥排了一下队伍,如果10人一排,有一排少一人,如果12人一排,有一排还是少一人,如果15人一排,有一排仍少一人。请问这个未上百人的合唱团共有多少()人?
   A、59  B、60   C、61  D、62
答案:C
注意:脑筋急转弯题2333,仔细看题

13、在待排序的数据表已经为有序时,下列排序算法中花费时间反而多的是()。
A、堆排序 B、希尔排序  C、冒泡排序  D、快速排序
答案:D

根据上面所给的图,回答下面两个问题:
83、这个工程最早可能在什么时间结束(D)。
A. 18               B. 26            C. 31          D. 43
84、活动3->5的最早开始时间和最迟开始时间是(C)。
A. 15,19       B. 19,27        C. 15,27    D. 19,37

每个点的最早开始时间是源点到它的最长路,最迟开始时间是 汇点的最早开始时间 - 它到汇点的最长路,可以用dp求
每条边(每个活动)的最早开始时间是它的起点的最早开始时间,最早结束时间是最早开始时间+活动所用时间;最晚结束时间是它的终点的最迟开始时间,最晚开始时间是最晚结束时间-活动所用时间


排序:https://www.cnblogs.com/onepixel/articles/7674659.html

原地排序:https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E6%8E%92%E5%BA%8F


主定理:

https://en.wikipedia.org/wiki/Master_theorem_(analysis_of_algorithms)

设$T(n)=aT(frac{n}{b})+f(n)$,设$c_{crit}=log_ba$

1.当$f(n)=O(n^c)$,且$c<c_{crit}$时$T(n)=Θ(n^{c_{crit}})$

3.当$f(n)=Ω(n^c)$且$c>c_{crit}$时$T(n)=Θ(f(n))$(实际上还有一个要求才成立,不管了,具体见wiki)

2.若存在一个k>=0,使得$f(n)=Θ(n^{c_{crit}}log^kn)$,那么$T(n)=Θ(n^{c_{crit}}log^{k+1}n)$
2a.当$f(n)=n^{c_{crit}}log^kn$,k>-1时,$T(n)=Θ(n^{c_{crit}}log^{k+1}n)$
2b.当$f(n)=n^{c_{crit}}log^kn$,k=-1时,$T(n)=Θ(n^{c_{crit}}log{logn})$
2c.当$f(n)=n^{c_{crit}}log^kn$,k<-1时,$T(n)=Θ(n^{c_{crit}})$



结点的度:结点拥有的子树的数目。
叶子:度为零的结点。
树的度:树中结点的最大的度。

性质1:二叉树第i层上的结点数目最多为 2{i-1} (i≥1)。
性质2:深度为k的二叉树至多有2{k}-1个结点(k≥1)。
性质3:包含n个结点的二叉树的高度至少为log2 (n+1)。
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。

性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1
证明:
因为二叉树中所有结点的度数均不大于2,所以结点总数(记为n)="0度结点数(n0)"+"1度结点数(n1)"+"2度结点数(n2)"。得到n=n0+n1+n2
另一方面,0度结点没有孩子,1度结点有一个孩子,2度结点有两个孩子,故二叉树中孩子结点总数是:n1+2n2。此外,只有根不是任何结点的孩子。故二叉树中的结点总数又可表示为n=n1+2n2+1
相减得n0=n2+1

若完全二叉树有n个结点,当n为奇数时,n1 = 0,n2 = int_DOWN(n/2),n0 = n2 + 1;
当n为偶数时,n1 = 1, n0 = n/2;n2 = n0 - 1。


由数字1,1,2,4,8,8所组成的不同的四位数的个数是___。
答案:102
容易算错


答案:B
查找第一个节点的代价是1...

运算符优先级:https://zh.cppreference.com/w/cpp/language/operator_precedence

在前的先运算
a++,a--,.,->
++a,--a,+a(正号),-a(负号),!,~,*(解引用),&(取地址),
*(乘),/,%
+,-
<<,>>
<,<=,>,>=
==,!=
&(按位与)
^
|
&&
||
a?b:c,=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|=

12、一个无法靠自身的控制终止的循环称为“死循环”,例如,在C语言程序中,语句“while(1) printf(“*”);”就是一个死循环,运行时它将无休止地打印*号。下面关于死循环的说法中,只有()是正确的。
A、不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,因而,任何编译系统都不做死循环检验。  
B、有些编译系统可以检测出死循环。  
C、死循环属于语法错误,既然编译系统能检查各种语法错误,当然也应该能检查出死循环。  
D、死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而,死循环也可以检测的。
答案:A(见停机问题,未看)

rmdir命令

三叉链表:表示树,指比二叉链表多记一个父节点指针

有向图顶点的度就是其出度和入度之和

关节点=割点,重连通图=点双联通图

有n (n≥1) 个顶点的有向强连通图最少有n条边。(错,1个点则只要0条)

具有欧拉回路的图称为欧拉图(Euler Graph),具有欧拉通路而无欧拉回路的图称为半欧拉图。

一张不连通的图一定不存在欧拉路径。对于这句话:错,可能是一个有欧拉路径的图外加一个孤立点

二分查找中,成功时的平均查找长度为二叉查找树中各个节点深度的平均值(根节点深度为1)(对于一个序列[l,r],其二叉查找树的根节点位置为(l+r)/2(下取整))。
查找失败时平均查找长度即为查找每个外结点(指某个节点的空的儿子)的比较次数之和除以外结点的个数。
(实现有很多种,但是如果这么问就这么答)

74、目前以比较为基础的内部排序方法中,其比较次数与待排序的记录的初始排列状态无关的是(二分插入排序)

希尔排序的最后一趟就是冒泡排序(对?)

如果输入序列已经排好序,则快速排序算法无需移动任何数据对象就可以完成排序。(错)

54、采用任何基于排序码比较的算法,对5个互异的整数进行排序,至少需要( C )次比较。
A. 5            B. 6            C. 7            D. 8
实际上的操作不清楚,但是如果这么问的话,排序n个数,答案应该是log2(n!)(上取整)(就是令n=n!,做操作n=(n%2==1)?(n/2+1):(n/2)使得n变成1的最少次数)(原因不清楚,大概是一开始有n!种方案,每一次比较最优能够使得方案数除以2(上取整))(正确性还不是很确定)

有时候说“一趟归并”,指用非递归实现归并排序,类似于倍增的后缀排序,每一趟把两个相邻且内部有序的长度为2^i的序列合并为一个长度为2^(i+1)的序列

34.下列排序算法中,()算法会出现下面情况:在最后一趟结束之前,所有元素不在其最终的位置上。
    A.堆排序            B.冒泡排序
    C.快速排序       D.插入排序
答案:D(只要最后一次插入的是最小元素(要求最小元素不重复出现)即可)

O(n)建堆:(例子为大根堆)首先有一个数组,把它当成一个完全二叉树(左右儿子下标的取法按照堆的方法),可以用dfs建堆(可以很容易改成自底向上)。dfs(i):先建左右子树,然后调整(i)。调整(i):如果当前节点权值大于等于两个子节点权值,那么已经完成,否则找出两个子节点中较大的,与当前节点权值交换,并且调整(交换的那个子节点)。
堆排序时,一般正序排序就建大根堆,这样堆中弹出的元素可以直接放在数组最后,就不需要辅助空间

链地址法就是拉链法。
装填因子:填入表中的元素个数/哈希表的长度
聚集效应:开放地址法,且探查的方法不够好(线性探查,当然也可能要看具体数据的分布)时,容易有聚集效应
具有相同哈希函数值的关键字对该散列函数来说称做同义词
直接定址法:比如h(k)=k或h(a,b)=(a-1)*m+b(1<=a<=n,1<=b<=m),完美哈希
数字分析法:只适合于所有关键字值已知的情况,取数据元素关键字中某些取值较均匀的数字位(指所有数据的该位的值没有集中在几个数字上)作为哈希地址
平方取中法:取关键字平方的中间几位
线性探查法到尾部也没找到空位可以回到头部

索引存储:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。索引表由若干索引项组成。如果每个节点在索引表中都有一个索引项,则该索引表就被称为稠密索引。若一组节点在索引表中只对应于一个索引项,则该索引表就成为稀疏索引。索引项的一般形式一般是关键字、地址。

内部排序:待排序记录存放在内存中。
外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需要对外存进行访问。

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(注意的确只有小于/大于)
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。

https://blog.csdn.net/flt_ustc/article/details/52761816
所有的顶点和边都属于图G的图称为G的子图。
含有G的所有顶点的子图称为G的生成子图。
设V1是V的一个非空子集,以V1为顶点集,以两端点均在V1中的边的全体为边集的子图称为G的导出子图,记作G[V1]。
导出子图G[V-V1]记为G-V1,它是从G中删去V1中的顶点以及与这些顶点相关的边所得到的子图。若V1={v},则把G-{v}简记为G-v, 称为主子图。

所有哈密顿图都是点双连通的
欧拉图不一定是哈密顿图,哈密顿图不一定是欧拉图

对于无向图:
线图:每个点代表原图的一条边,两个点之间有边当且仅当它们表示的(原图中的)边有一个端点相同
每个欧拉图的线图都是哈密顿图
每个哈密顿图的线图都是哈密顿图

对于一个有n个点(n>=3)的简单无向图,当每一对不相邻节点的度数之和都>=n-1时,它有哈密顿通路
对于一个有n个点(n>=3)的简单无向图,当每一对不相邻节点的度数之和都>=n时,它是一个哈密顿图
证明:https://wenku.baidu.com/view/5d3ed22dccbff121dd3683a4.html

 

对于一个有n个点的强连通的简单有向图,当每一对不相邻的节点的度数和>=2*n-1时,它是哈密顿图(证法应该类似?暂时不研究)(来自wikipedia)

一个竞赛图存在哈密顿回路的充要条件是该图强连通
任意一个竞赛图存在一条哈密顿路径
证明:https://blog.csdn.net/di4CoveRy/article/details/70230029

60、在一个带权连通图G中,权值最小的边一定包含在G的(      )生成树中。
A. 某个最小        B. 任何最小        C. 广度优先        D.深度优先
(答案:A;并不是B,反例是边长全部一样的图,不能脑抽)
(最小生成树的结论是:一个无向图所有的最小生成树中某种权值的边的数目均相同)

P,NP,NPC问题:http://www.matrix67.com/blog/archives/105
P问题指能在多项式时间内解决的问题;NP问题指能在多项式时间内验证一个解的问题;NPC问题首先是一个NP问题,其次所有的NP问题都可以归约到它;NP-Hard问题要求所有的NP问题都可以归约到它(不一定要是NP问题)

用直线/折线/Z形线划分平面:https://blog.csdn.net/destiny1507/article/details/81228610

基环树,基环内向树,基环外向树
https://blog.csdn.net/Q1410136042/article/details/81152191

组合公式
https://blog.csdn.net/litble/article/details/75913032
https://blog.csdn.net/acdreamers/article/details/31032763

11、T(n)为某个算法输入为n时的运算次数。如果T(i)(i<=1)为常数,且T(n)=3T(sqrt(n))+log2n,那么以下比T(n)复杂度低有(AC)
A、O(log(n)*sqrt(log(n))  B、O(sqrt(n))
C、O(log(n))                    D、O(log^2(n))
$T(n)=log_2n^{log_2​3}$。

原文地址:https://www.cnblogs.com/hehe54321/p/9678084.html