其他类常见错题

三、数组、链表、栈、队列、字符串


线性表是具有n个()的有限序列(n>0)
  • 表元素
  • 字符
  • 数据元素
  • 数据项
  • 信息项

下列叙述哪些是对的?
  • 线性表的逻辑顺序与物理顺序总是一致的。
  • 线性表的顺序存储表示优于链式存储表示。
  • 线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。
  • 二维数组是其数组元素为线性表的线性表。
  • 每种数据结构都应具备三种基本运算:插入、删除和搜索。
CE
A:顺序存储结构中,线性表的逻辑顺序和物理顺序总是一致的。但在链式存储结构中,线性表的逻辑顺序和物理顺序一般是不同的。
B:各种存储结构都有其优缺点,线性表的顺序存储表示在快速查找方面具有一定优势,但链式存储表示在数据元素的插入和删除方面具有明显优势。
D:线性表的数据元素是不可再分割的数据单元,因此数组不能作为线性表的结点


既希望较快的查找又便于线性表动态变化的查找方法是()
  • 顺序查找
  • 折半查找
  • 索引顺序查找    块查找
  • 哈希法查找

下列叙述哪些是对的?
  • 线性表的逻辑顺序与物理顺序总是一致的。
  • 线性表的顺序存储表示优于链式存储表示。
  • 线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。
  • 二维数组是其数组元素为线性表的线性表。
  • 每种数据结构都应具备三种基本运算:插入、删除和搜索。
CE
A:顺序存储结构中,线性表的逻辑顺序和物理顺序总是一致的。但在链式存储结构中,线性表的逻辑顺序和物理顺序一般是不同的。
B:各种存储结构都有其优缺点,线性表的顺序存储表示在快速查找方面具有一定优势,但链式存储表示在数据元素的插入和删除方面具有明显优势。
D:线性表的数据元素是不可再分割的数据单元,因此数组不能作为线性表的结点


线性表的顺序存储结构是一种()
  • 随机存取的存储结构
  • 顺序存储的存储结构
  • 索引存取的存储结构
  • Hash存取的存储结构


对n个记录的线性表进行快速排序为减少算法的递归深度,以下叙述正确的是()
  • 每次分区后,先处理较短的部分
  • 每次分区后,先处理较长的部分
  • 与算法每次分区后的处理顺序无关
  • 以上三者都不对



(3.1)数组

下面的说法那个正确
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define NUMA 10000000
#define NUMB 1000
int a[NUMA], b[NUMB];
  
void pa()
{
     int i, j;
     for (i = 0; i < NUMB; ++i)
         for (j = 0; j < NUMA; ++j)
             ++a[j];
}
void pb()
{
     int i, j;
     for (i = 0; i < NUMA; ++i)
         for (j = 0; j < NUMB; ++j)
             ++b[j];
}
  • pa 和 pb 运行的一样快
  • pa 比 pb 快
  • pb 比 pa 快
  • 无法判断
答案是B
   参考高质量C++编程在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的
循环放在最外层,以减少 CPU



有n个数存放在一维数组A[1,n]中,在进行顺序查找时,这n个数的排列有序或无序其平均查找长度不同()

对长度为无穷大的广义表,由于存储空间的限制,不能在计算机中实现()


稀疏矩阵压缩存储后,必会失去随机存取功能()

在程序设计中,要对两个16K×16K的多精度浮点数二维数组进行矩阵求和时,行优先读取和列优先读取的区别是()
  • 没区别
  • 行优先快
  • 列优先快
  • 2种读取方式速度为随机值,无法判断
如果数组很大的话应该是行优先快,因为数组在内存中是按行优先存储的,在虚存环境下,如果整个数组没有在内存中的话可以比列优先减少内存换进换出的次数。就算整个数组都在内存中,列优先访问a[i][j]还得计算一次乘法,行优先只需加一就可以了,这个可以忽略


有两个N*N的矩阵A和B,想要在PC上按矩阵乘法基本算法编程实现计算A*B。假设N较大,本机内存也很大,可以存下A、B和结果矩阵。那么,为了计算速度,A和B在内存中应该如何存储(按行存指先存储第一行,再第二行,直到最后一行;按列存指先存储第一列,再第二列,直到最后一列)?
  • A按行存,B按行存。
  • A按行存,B按列存。
  • A按列存,B按行存。
  • A按列存,B按列存。
最优方法为 Strassen矩阵相乘发,时间复杂度降低为O(n2.81),用分治的思想将矩阵分块计算,在这个算法中按行存储更有利。所以正确答案为A。


以下操作中,数组比线性表速度更快的是____
  • 原地逆序
  • 头部插入
  • 返回中间节点
  • 返回头部节点
  • 选择随机节点

有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是()
  • 60
  • 66
  • 18000
  • 33
每个元素要用行号,列号,元素值来表示,在用三元组表示稀疏矩阵,还要三个成员来记住,矩阵的行数列数,总的元素数,所以所需的字节数是10*(1+1+1)*2+3*2=66


A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是()
  • i(i+1)/2+j
  • j(j+1)/2+i
  • i(j+i)/2+1
  • j(i+1)/2+1
A对称矩阵,任意上三角元素a[i][j]对应的下三角元素为a[j][i]
即j行i列  1 + 2 +..(j -1) + i




(3.2)链表

若频繁删除某线性表的第1个元素,则不宜采用以下哪种存储方式
  • 单链表
  • 顺序表
  • 单向循环链表
  • 双链表

线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的()



用单链表表示的链式队列的队头在链表的()位置
  • 链头
  • 链尾
  • 链中

若线性表最常用的操作是存取第1个元素及其前驱和后继元素的值,为节省时间应采用的存储方式()
  • 单链表
  • 双向链表
  • 单循环链表
  • 顺序表

单链表中,增加一个头结点的目的是为了()
  • 使单链表至少有一个结点
  • 标识表结点中首结点的位置
  • 方便运算的实现
  • 说明单链表是线性表的链式存储

下面有关循环单向链表,说法正确的有?
  • 查找一个节点或者访问特定编号的节点则需要O(n)的时间
  • 每个节点有两个连接:一个指向前一个节点,而另一个指向后一个节点
  • 首节点和末节点被连接在一起
  • 判断链表结束的条件是pTail == NULL
AC .
A.查找一个结点需要遍历循环单链表,但是要做判断,否则如果没有这个结点,会一直循环下去
B.说的是双向链表
D.没有末结点


循环链表H的尾结点P的特点是()
  • P->NEXT:=H
  • P->NEXT:=H->NEXT
  • P:=H
  • P:=H->NEXT

下面关于二分查找的叙述中正确的是:
  • 表必须有序,表可以顺序方式存储,也可以链表方式存储
  • 表必须有序且表中数据必须是整型,实型或字符型
  • 表必须有序,而且只能从小到大排列
  • 表必须有序,且表只能以顺序方式存储


(3.3)栈  链尾操作

设栈采用顺序存储结构,若已有i-1个元素入栈,则将第i个元素入栈时,入栈算法的时间复杂性为O(i)()
  • 错  O(1)


以下与数据的存储结构无关的术语是()
  • 循环队列
  • 链表
  • 哈希表


()的遍历仍需要栈的支持
  • 前序线索树
  • 中序线索树
  • 后序线索树
C
后序遍历要稍微复杂一点点,在前序和中序遍历的程序中,当我们准备进入根结点的右子树时,根结点就被扔出栈外了。但在后序遍历时,我们仍需保留它,直到右子树处理完毕。

4个圆盘的Hanoi塔,总的移动次数为()
  • 7
  • 8
  • 15
  • 16
答案为C。 设f(n)为n个圆盘的hanoi塔总的移动次数,其递推方程为f(n)=f(n-1)+1+ f(n-1)=2*f(n-1)+1。理解就是先把上面n-1个圆盘移到第二个柱子上(共f(n-1)步),再把最后一个圆盘移到第三个柱子(共1步),再把第二柱子上的圆盘移动到第三个柱子上( 共f(n-1)步)。而f(1)=1;于是f(2)=3,f(3)=7,f(4)=15。故答案为C。进一步,根据递推方程其实可以得出f(n) = 2^n - 1。

(3.4)队列  队头在链头

循环队列也存在空间溢出问题()
  • 对   循环队列解决的是“假溢出”问题,但是仍然会出现真正的溢出问题

设尾指针的循环链表表示队列,则入队和出队算法的时间复杂度均为O(1)()

循环队列存储在数组A[0..m]中,则入队时的操作为()
  • rear=rear+1
  • rear=(rear+1)mod(m-1)
  • rear=(rear+1)mod m
  • rear=(rear+1)mod(m+1)

队列的"先进先出"特性是指()
  • 最后插入队列中的元素总是最后被删除
  • 当同时进行插入、删除操作时,总是插入操作优先
  • 每当有删除操作时,总要先做一次插入操作
  • 每次从队中删除的总是最早插入的元素

若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?()
  • 1和5
  • 2和4
  • 4和2
  • 5和1

(3.5)字符串

在下列表述中,()是错误的
  • 含有一个或多个空格字符的串称为空串
  • 对n(n>0)个顶点的网,求出权最小的n-1条边便可构成其最小生成树
  • 选择排序算法是不稳定的
  • 平衡二叉树的左右子树的结点数之差的绝对值不超过1
A、空格串的定义是由空格组成的非空串,其长度为串中空格字符的个数。含有一个或多个空格字符但却不一定是非空的所以错误 
B、对于一个n个顶点的网,取出权值最小的n-1条边若其中任意几条边构成了环,就不能构成最小生成树了
C、悬着排序确实不稳定
D、平衡二叉树的定义是任意节点的左子树和右子树都是平衡二叉树,且左子树和右子树高度之差的绝对值不超过1.但是如果树的深度比较深的话,经常会出现左子树和右子树的结点数之差超过1



下面关于串的叙述中,哪一个是不正确的?()
  • 串是字符的有限序列
  • 空串是由空格构成的串
  • 模式匹配是串的一种重要运算
  • 串既可以采用顺序存储,也可以采用链式存储



以下程序段的输出结果是
1
2
char s[]= "\\123456\123456\t" ;
printf( "%d\n" ,strlen(s));
  • 12
  • 13
  • 16
  • 以上都不对
答案:A
这里考查转义字符,注意 \\ 表示字符 \
\123表示字符 {
\t 表示制表符
这些都是一个字符。


字符串′ababaabab′的nextval为()
  • (0,1,0,1,0,4,1,0,1)
  • (0,1,0,1,0,2,1,0,1)
  • (0,1,0,1,0,0,0,1,1)
  • (0,1,0,1,0,1,0,1,1)
nextval 如果某位(字符)与它 next 值指向的位(字符)相同,则该位的 nextval 值就是指向位的 nextval 值(nextval[i] = nextval[ next[i] ]);如果不同,则该位的 nextval 值就是它自己的 next 值(nextvalue[i] = next[i])。


KMP算法的特点是在模式匹配时指示主串的指针不会变小()




    四、树和堆

    (4.1)树


    一棵有n个结点的二叉树,从上到下,从左到右从1依次给予编号,则编号为i的结点的左儿子的编号为2i(2i<n),右儿子是2i+1(2i+1<n)()
    • 错   如果该二叉树非完全二叉树则有可能不满足题目条件


    二叉树以后序遍历序列与前序遍历序列反映同样的信息(它们反映的信息不独立)()

    若在一棵(分类)平衡树T中先删除某结点N,然后再插入该结点N,得到的新的平衡树T,则T和T1不一定相同。但是如果在T上先插入结点M,然后再删除M结点,那么得到的新的平衡树T2一定与T完全相同()
    • 对     我觉得应该是对的

    二叉排序树删除一个结点后,仍是二叉排序树()
    • 错 删除一个非叶节点, 需要调整其子节点的位置。所以并不能简单地直接进行删除。

    B+树是()
    • 一种AVL树
    • 索引表的一种组织形式
    • 一种高度不小于1的树
    • 一种与二进制Binary有关的树
    A,AVL树本质上还是一棵二叉搜索树,B+树不是二叉树
    B,B+ 树是B-树的一种变形,通常用于数据库和操作系统的文件系统中
    C,B+树可以为空树,也就是高度可以小于1
    D,B+树的字母B就是Binary的简写,跟Binary是必须滴


    若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用()遍历方法最合适
    • 前序
    • 中序
    • 后序
    • 按层次

    线索二叉树是一种()结构
    • 逻辑
    • 逻辑和存储
    • 物理
    • 线性


    二叉树在线索化后,仍不能有效求解的问题是()
    • 前序线索二叉树中求前序后继
    • 中序线索二叉树中求中序后继
    • 中序线索二叉树中求中序前驱
    • 后序线索二叉树中求后序后继

    下述结论中,正确的是()①只有一个结点的二叉树的度为0;②二叉树的度为2;③二叉树的左右子树可任意交换;④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树
    • ①②③
    • ②③④
    • ②④
    • ①④


    下面关于m阶B树说法正确的是()
    ①每个结点至少有两棵非空子树
    ②树中每个结点至多有m-1个关键字
    ③所有叶子在同一层上
    ④当插入一个数据项引起B树结点分裂后,树长高一层
    • ①②③
    • ②③
    • ②③④
    A:举个反例:B树可以只包含一个根节点,所以A错误
    D:B树高度h <= log T((n+1)/2) (T:结点度数, n:总关键字个数


    Asume you have an object to describe customer data:{ ID(7 digit numeric) Family Name(string) Account Balance(currency) } If you have 500,000 Chinese customers records represented by instances of this object type , what set of data structures is best to get fast retrieval of customers (1) get IDs from Name and (2) get Name from ID?
    • (1) Tree with Hash(100 bucket) at leaves(2) Tree with linked list at leaves.
    • (1) Tree with linked list at leaves(2) Array.
    • (1) Tree with linked list at leaves(2) Hash(10,000 buckets)
    • (1) Sort linked list(2) Array.

    (4.2)堆

    堆肯定是一棵平衡二叉树()
    • 错   没有规定必须是平衡的

    下列哪一个关键码序列不符合堆的定义?
    • A、C、D、G、H、M、P、Q、R、X
    • A、C、M、D、H、P、X 、G、0、R
    • A、D、P、R、C、Q、X 、M、H、G
    • A、D、C、M、P、G、H、X 、R、Q


    五、图

    在图采用邻接表存储时,求最小生成树的Prim算法的时间复杂度为()
    • O(n)
    • O(n+e)
    • O(n2)
    • O(n3)
    邻接表是O(n+e),邻接矩阵存储是O(n 2

    在AOE图中,关键路径上活动的时间延长多少,整个工程的时间也就随之延长多少()
    如果有两条关键路径或者两个关键活动并行,单独缩短一个没有用的 不过反过来倒是对的,延期某个关键活动,整个工程的时间必定延期

    下列关于AOE网的叙述中,不正确的是()
    • 关键活动不按期完成就会影响整个工程的完成时间
    • 任何一个关键活动提前完成,那么整个工程将会提前完成
    • 所有的关键活动提前完成,那么整个工程将会提前完成
    • 某些关键活动若提前完成,那么整个工程将会提前完成
    关键活动组成了关键路径关键路径是图中的最长路径,关键路径长度代表整个工期的最短完成时间,关键活动延期完成,必将导致关键路径长度增加,即整个工期的最短完成时间增加,因此A正确。关键路径并不唯一,当有多条关键路径存在时,其中一条关键路径上的关键活动时间缩短,只能导致本条关键路径变成非关键路径,而无法缩短整个工期,因为其他关键路径没有变化,因此B项不正确。对于A,B两项要搞懂的是,任何一条关键路径上的关键活动变长了,都会使这条关键路径变成更长的关键路径,并且导致其他关键路径变成非关键路径(如果关键路径不唯一),因此整个工期延长。而某些关键活动缩短则不一定缩短整个工期。



    在用Floyd算法求解各顶点间的最短路径时,每个表示两点间路径的path(k-1)[I,J]一定是path(k)[I,J]的子集(k=1,2,3,…,n)()
    path(k-1)[I,J]不一定是path(k)[I,J]的子集

    在用邻接表表示图时,拓扑排序算法时间复杂度为()
    • O(n)
    • O(n+e)
    • O(n*n)
    • O(n*n*n)

    图中有关路径的定义是()
    • 由顶点和相邻顶点序偶构成的边所形成的序列
    • 由不同顶点所形成的序列
    • 由不同边所形成的序列
    • 上述定义都不是

    关键路径是AOE网中从源点到终点的最长路径()
      下面关于求关键路径的说法不正确的是()
      • 求关键路径是以拓扑排序为基础的
      • 一个事件的最早开始时间同以该事件为尾的弧的活动最早开始时间相同
      • 个事件的最迟开始时间为以该事件为尾的弧的活动最迟开始时间与该活动的持续时间的差
      • 关键活动一定位于关键路径上

      在AOE图中,关键路径上某个活动的时间缩短,整个工程的时间也就必定缩短()

      AOE网一定是有向无环图()
      答案:A
      AOE网(Activity On Edge)即边表示活动的网,是一个带权的有向无环图,其中顶点表示事件(Event),每个事件表示在它之前的活动已经完成,在它之后的活动可以开始,弧表示活动,权表示活动持续的时间。



      (1)求从指定源点到其余各顶点的迪杰斯特拉(Dijkstra)最短路径算法中弧上权不能为负的原因是在实际应用中无意义;(2)利用Dijkstra求每-对不同顶点之间的最短路径的算法时间是O(n 3 )(图用邻接矩阵表示);(3)Floyed求每对不同顶点对的算法中允许弧上的权为负,但不能有权和为负的回路。上面不正确的是()
      • (1)(2)(3)
      • (1)
      • (1)(3)
      • (2)(3)
      (1)最短路径算法要求网中弧的权值必须为正数,但是在Dijsktra算法中,权值 不能为负的,并不是因为在实际应用中无意义,而是算法本身的适应条件不允许权值为负数。  所以(1)错误。
      (2)重复利用Dijsktra算法n次即可求得每一对不同顶点间的最短路径,Dijsktra  算法的时  间复杂度为O(n  2  ),那么对此算法执行n次的时间复杂度为O(n  3  )所  以是正确。
      (3)由对(1)的分析可知,(3)错误。

      图G是n个顶点的无向完全图,则下列说法正确的有:()
      • G的邻接多重表需要n(n-1)个边结点和n个顶点结点
      • G的连通分量个数最少
      • G为连通图
      • G所有顶点的度的总和为n(n-1)
      A,边的条数为C(n,2)=n(n-1)/2
      B,G是完全图,必定是连通图。所以连通分量只有其自身
      C,G是完全图,必定是连通图
      D,每个顶点都与其余n-1个顶点相连,则n个顶点度的和为n(n-1)

      n个顶点的无向图的邻接表最多有()个表结点
      • n2
      • n(n-1)
      • n(n+1)
      • n(n-1)/2
      有n个顶点的无向图最多有n*(n-1)/2条边,此时为完全无向图,而在邻接表中每条边存储两次,所以有n*(n-1)个结点


      连通图上各边权值均不相同,则该图的最小生成树是唯一的()
      个人亲测,由于权值不同,必定唯一

      若一个有向图的邻接矩阵中,主对角线以下的元素均为零,则该图的拓扑有序序列()
      • 存在   都向后,而且最后没有向前
      • 不存在

      要连通具有n个顶点的有向图,至少需要()条边
      • n-1
      • n
      • n+1
      • 2n

      邻接矩阵一定为对称矩阵的图是?
      • 有向图
      • 带权有向图
      • 有向图或无向图
      • 无向图
      注意是一定是



      在下图的多边形ABCDE中从哪一点出发,可以遍历图上的每条边一次,而且仅遍历一次。

      • A点
      • B点
      • C点
      • D点

      无向图:  图连通,所有点都是偶数度,或者只有两个点是奇数度。当所有点是偶数度时欧拉路起点可以是任意

                         点;当有两个奇数度点时起点必须是奇数度点。

      有向图:  图连通,所有点出度=入度,或者有一个点入度-出度=1,有一个点出度-入度=1。同样,当所有点

                        出度=入度时任意点可作为起点;而后者必须以出度-入度=1的点做起点,入度-出度=1的点做终点。



      下面哪一方法可以判断出一个有向图是否有环(回路)()
      • 深度优先遍历
      • 拓扑排序
      • 求最短路径
      • 求关键路径

      六、哈希

      现有一完全的P2P共享协议,每次两个节点通讯后都能获取对方已经获取的全部信息,现在使得系统中每个节点都知道所有节点的文件信息,共17个节点,假设只能通过多次两个对等节点之间通讯的方式,则最少需要()次通讯
      • 32
      • 31
      • 30
      • 29
      答案:c
      如上图1所示,假设有5个节点,按连线1、2、3、4通讯之后,节点4和5就掌握了所有节点的信息,之后,1、2、3节点只需跟4或5任一节点通讯一次即连线5、6、7就可保证每个节点都知道所有节点的信息,总的通讯次数是(n-1)+(n-2)=2n-3次。
      如果将所有节点分成两组,如图2所示,两组中的节点分别按连线1-8顺序通讯之后,节点4和5就掌握了1-5所有节点的信息,节点9和0就掌握了6-0所有节点的信息,再按连线9、10通讯之后,节点4、5、9、0就掌握了1-0所有节点的信息,剩下的节点只需跟4、5、9、0任一节点通讯一次就可保证每个节点知道所有节点信息,和图1相比,多了9和10两次通讯,总的通讯次数是(2n1-3)+(2n2-3)+2=2n-4次(n1和n2分别表示分组中元素个数)。
      分3组的情况是(2n1-3)+(2n2-3)+(2n3-3)+6=2n-3次
      分4组的情况是(2n1-3)+(2n2-3)+(2n3-3)+(2n4-3)+8=2n-4次


      以下哪个不属于单向哈希表的特征()
      • 它把任意长度的信息转换成固定的长度输出
      • 它把固定的信息转换成任意长度信息输出
      • 根据特定的哈希值,它可以找到对应的原信息值
      • 不同的信息很难产生一样的哈希值


      下列关于线性表,二叉平衡树,哈希表存储数据的优劣描述错误的是?
      • 哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度为O(1);
      • 线性表实现相对比较简单
      • 平衡二叉树的各项操作的时间复杂度为O(logn)
      • 平衡二叉树的插入节点比较快


      基于哈希的索引和基于树的索引有什么区别?
      • hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询
      • hash索引无法被用来进行数据的排序操作
      • 对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用
      • Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高
      ABCD

      1、hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询

      因为hash索引比较的是经常hash运算之后的hash值,因此只能进行等值的过滤,不能基于范围的查找,因为经过hash算法处理后的hash值的大小关系,并不能保证与处理前的hash大小关系对应。

      2、hash索引无法被用来进行数据的排序操作

      由于hash索引中存放的都是经过hash计算之后的值,而hash值的大小关系不一定与hash计算之前的值一样,所以数据库无法利用hash索引中的值进行排序操作。

      3、对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

      4、Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

      对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。



      (6.1)构造、散列函数

      哈希法的平均查找长度不随表中结点数目的增加而增加,而是随负载因子的增大而增大()

      假设把整数关键码K散列到有N个槽的散列表,以下那些散列函数是好的散列函数?
      • h(k)=k/n
      • h(k)=1
      • h(k)=k mod N
      • h(k)=(k + Random(N )) mod N;Random(N)返回一个0到N-1的整数

      采用哈希表组织100万条记录,以支持字段A快速查找,则()
      • 理论上可以在常数时间内找到特定记录
      • 所有记录必须存在内存中
      • 拉链式哈希曼最坏查找时间复杂度是O(n)
      • 哈希函数的选择跟A无关
      答案:C
      A,记录共有100万条,一般的哈希表长度不可能做这么长,因此要解决散列冲突问题,因此一般不能再常数时间内找到记录
      B,哈希查找可以在外存中查找,可以用哈希表映射到文件,分级查找
      C,最坏情况是所有记录的散列值都冲突,这样就退化为线性查找,时间复杂度为O(n)
      D,哈希函数的选择跟A关系密切,跟A的字段类型有关,哈希函数设计的好坏也影响着查找的速度

      (6.2)冲突解决

      解决hash冲突的方法描述错误的有?
      • 开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止。
      • 拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中
      • 拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短
      • 当结点规模较大时,开放定址法较为节省空间
      与开放定址法相比,拉链法有如下几个优点: 
      (1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短; 
      (2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况; 
      (3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间; 
      (4)在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。 

      设有n个关键字具有相同的Hash函数值,则用线性探测法把这n个关键字映射到Hash表中需要做几次线性探测?
      • n2
      • n*(n+1)
      • n*(n+1)/2
      • n*(n-1)/2
      第一个关键字直接插入,第二个关键字要做1次探测,所以类推n个关键词要做0+1+2+...+(n-1) = n*(n-1) / 2 答案是D









      六、并发

      (6.1)程序类

      有两个线程,最初 n=0,一个线程执行 n++; n++; 另一个执行 n+=2; 问,最后可能的 n 值?
      • 1
      • 2
      • 3
      • 4

      大家要知道 C语言中的 ++ 和 += 并不是原子操作,而是通过多条微程序组成的,因此 ++ 和 += 在执行过程中可能被中断的

      • 第一种可能情况:现在假设两个线程没有并行顺序执行的那么结果显然是 4。
      • 第二种可能情况:再假设现在第一个n++ 已经执行完了  但是结果还没有写回内存 这个时候 n+=2 已经全部执行完 2 写进了内存 结束 然后回到n++的写回操作 这个时候内存就从2被改回1了,后面再来一次n++  结果就为2。
      • 第三种可能情况: 第n+=2 先读取n的值到寄存器 即0入寄存器 这个时候被中断   第一个n++开始执行 并直到结束 内存被改成了1 ,然后 n+=2 继续执行 结束后内存变为2  第二个n++再执行 结果就是3了

      对于A、B两种排队方式,说法正确的是
      • 方式A效率更高
      • 方式B效率更高
      • 当排队的任务中有长耗时任务且比例较低时,方式B更具优势
      • 都不正确
      因为当方式A中出现了长耗时任务,会降低那条任务队列的效率,相反B则能避免这个问题,当B中某个任务耗时是,其他任务会被分配到另一个上面


      在win32平台下,以下哪种方式无法实现进程同步?
      • Critical Section
      • Event
      • Mutex
      • Semaphore
      A:临界区(只能实现线程同步)
      B:事件
      C:互斥
      D:信号量
      进程同步:管道,共享内存,信号量


      以下哪些对象可用于Windows进程间通信?
      • 事件
      • 临界区
      • 互斥量
      • 共享内存



      以下说法正确的是:
      • 在并行程度中,当两个并行的线程,在没有任何约束的情况下,访问一个共享变量或者共享对象的一个域,而且至少要有一个操作是写操作,就可能发生数据竞争错误。
      • 原语Compare-and-swap(CAS)是实现无锁数据结构的通用原语。
      • 获得内部锁的唯一途径是:进入这个内部锁保护的同步块或方法。
      • volatile变量具有synchronized的可见性特性,但是不具备原子特性。
      • 减小竞争发生可能性的有效方式是尽可能缩短把持锁的时间


      下列哪种操作可能带来死锁?
      • lock(m1) lock(m2) unlock(m1) unlock(m2)
      • lock(m1) lock(m2) unlock(m2) lock(m2) unlock(m1) unlock(m2)
      • lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
      • lock(m1) lock(m2) unlock(m1) unlock(m2) lock(m1) unlock(m1)
      C
      lock(m1) lock(m2) unlock(m1) 后如果m1被另一个进程申请到lock(m1),现在第一个进程申请m1,第二个申请m2,就会进入死锁


      (6.1)操作系统、数据库并发类

      产生系统死锁的原因是由于()
      • 进程释放资源
      • 一个进程进入死循环
      • 多个进程竞争,资源出现循环等待
      • 多个进程竞争共享型设备

      数据库以及线程发生死锁的原理是什么?
      • 资源分配不当
      • 进程运行推进的顺序不合适
      • 系统资源不足
      • 进程过多

      产生死锁的原因主要是: 
      (1) 因为系统资源不足。 
      (2) 进程运行推进的顺序不合适。 
      (3) 资源分配不当等。 
      产生死锁的四个必要条件: 
      (1)互斥条件:一个资源每次只能被一个进程使用。 
      (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 
      (3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 
      (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

      避免死锁: 
      死锁的预防是通过破坏产生条件来阻止死锁的产生,但这种方法破坏了系统的并行性和并发性。 
      死锁产生的前三个条件是死锁产生的必要条件,也就是说要产生死锁必须具备的条件,而不是存在这3个条件就一定产生死锁,那么只要在逻辑上回避了第四个条件就可以避免死锁。 
      避免死锁采用的是允许前三个条件存在,但通过合理的资源分配算法来确保永远不会形成环形等待的封闭进程链,从而避免死锁。该方法支持多个进程的并行执行,为了避免死锁,系统动态的确定是否分配一个资源给请求的进程。 
      预防死锁:具体的做法是破坏产生死锁的四个必要条件之一。



      操作系统死锁的必要条件(多选题):()
      • 互斥条件
      • 系统资源有限
      • 进程调度不合理
      • 环路等待条件

      实时操作系统的基本特性有?
      • 提供高可靠性
      • 提供及时响应性
      • 提供多路性:即众多联机用户可以同时使用同一台计算机
      • 提供独占性:各终端用户感觉到自己独占了计算机


      轮询任务调度与抢占式任务调度的区别?
      • 抢占式调度优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度
      • 轮询调度优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度
      • 轮询调度实现相对较复杂
      • 抢占式调度实现相对较复杂
      轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。
      抢占式任务调度允许调度程序根据某种原则去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。抢占方式的优点是,可以防止一个长进程长时间占用处理机,能为大多数进程提供更公平的服务,特别是能满足对响应时间有着较严格要求的实时任务的需求。
      因为抢占式调度可能会暂停一些进程,需要记录进程的运行状态,较为复杂。轮询式只需要轮流分配资源,调度简单。

      下面哪些方式可以用于线程之间的同步?
      • 临界区
      • 互斥区
      • 事件
      • 信号量

      (1) 进程间通信方法有:文件映射、共享内存、匿名管道、命名管道、邮件槽、剪切板、动态数据交换、对象连接与嵌入、动态连接库、远程过程调用等

      (2) 事件、临界区、互斥量、信号量可以实现线程同步



      七、android

      Android中可以使用System.out.println(“”);在控制台中显示你想要显示的字符吗?
      • 不能
      会显示想要的字符,但是不是在控制台中,是在logcat中,选B

      下列关于IntentService与Service的关系描述错误的是
      • IntentService是Service的子类
      • IntentService在运行时会启动新的线程来执行任务
      • 启动方式不同
      • 没有区别
      IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。

      下面关于Android中定义style和theme的描述正确的是?
      • 都可以减少重复属性设置
      • style可以作用在Activity上    作用于xml,可以继承theme,style
      • theme可以继承         系统自带,不可继承,作用于acticvity
      • 一个TextView的style中定义了textColor属性,TextView本身也设置textColor属性,那么TextView本身定义的优先级较高

      下面哪一项不属于android的动画类型?
      • Tween
      • Alpha
      • Frame
      • Animation

      在创建AVD时,下面哪些是不能配置的选项( ).
      • 蓝牙支持   android模拟器还不支持蓝牙设置
      • 屏幕分辨率
      • 缓存区大小
      • SD卡支持

      Android 2.2 所对应的API level是多少?
      • 6
      • 7
      • 8
      • 9



      在一个ListView中,显示的行布局有多种不同形式,例如某些行只有ImageView,而另外一些行只有TextView,需要重写哪几个方法?
      • getCount()
      • getItemId()
      • getItemViewType()
      • getViewTypeCount()
      这题属于描述不清,AB是必须要重写的,跟这问题不沾边。

      下面是属于GLSurFaceView特性的是?
      • 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
      • 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
      • 让渲染器在独立的线程里运作,和UI线程分离。
      • 可以直接从内存或者DMA等硬件接口取得图像数据


      Android中的R.java可以手动修改吗?
      • 可以
      • 不可以


      使用SimpleAdapter作为 ListView的适配器,行布局中支持下列哪些组件?
      • TextView
      • ProgressBar
      • CompoundButton
      • ImageView
      使用SimpleAdapter作为适配器时,支持三种类型的 View,而且是按照如下顺序进行匹配:
      1. 继承Checkable接口
      2.  TextView
      3.  ImageView
      CompoundButton 声明如下:
      public abstract class CompoundButton extends Button implements Checkable
      可见他是继承了Checkable接口的按钮,因此也在入选范围内。

      public interface Checkable   可以检验选中状态

          间接子类

             CheckBoxCheckedTextView, CompoundButton, RadioButtonToggleButton



      下列哪些情况下,系统可能会弹出ANR对话框
      • 在Activity中,Main线程消息队列中的消息在5秒内没有得到响应
      • 在Service中,onStartCommand()方法执行超过5秒
      • 在BroadcastReceiver中,onReceive()方法执行时间超过10秒
      • 在启动的新线程中,run()方法执行时间超过5秒
      A:显然是的
      B:有可能是的,应为这个service还是在UI线程中
      C:有可能

      下列哪些情况下系统会弹出Froce Close对话框
      • 应用运行时,Main线程进行了耗时操作
      • 应用运行时抛出了OutOfMemoryError
      • 应用运行时抛出了RuntimeException
      • 应用运行时,用户操作过于频繁
      AD:产生ANR,程序没有响应,有可能程序会再次响应
      BC:程序抛出异常,会强制退出
      导致出现Force Close的原因有很多,常见的有比如空指针啦,类没有找到啦,资源没找到,就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)



      使用Toast提示时,关于提示时长,下面说法正确的是( ).
      • 显示时长只有2种设置
      • 可以自定义显示时长
      • 传入30时,提示会显示30秒钟
      • 当自定义显示时长时,比如传入30,程序会抛出异常


      关于AlertDialog描述错误的是( ).
      • show()方法只显示对话框
      • AlertDialog.Builder的create() 和show()方法都返回AlertDialog对象
      • AlertDialog不能直接用new关键字构建对象,而必须使用其内部类Builder
      • create()方法创建并显示对话框
      AlertDialog的构造方法被声明为protected, 不能直接使用new关键字来创建AlertDialog类的对象实例。要想创建AlertDialog对话框,需要使用Builder类,该类是AlertDialog类中定义的一个内嵌类。因此必须创建AlertDialog.Builder类的对象实例,然后再调用show()来显示对话框。

          例如:    AlertDialog.Builder db= new Builder(this);

                          db..create().show();


      阅读代码回答运行结果
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      public classMainActivity  extends Activity  implements OnClickListener
      {
          private Button mBtnLogin = (Button) findViewById(R.id.btn_login);
          private TextView mTextViewUser;
        
          @Override
          protected void onCreate(BundlesavedInstanceState)
          {
               super .onCreate(savedInstanceState);
               setContentView(R.layout.activity_main);
               mTextViewUser = (TextView) findViewById(R.id.textview_user);
               mBtnLogin.setOnClickListener( this );
               new Thread()
               {
                   @Override
                   public void run()
                   {
                       mTextViewUser.setText( 10 );
                   }
               }.start();
          }
        
          @Override
          public void onClick(View v)
          {
               mTextViewUser.setText( 20 );
          }
      }
      • Resources$NotFoundException
      • ViewRootImpl$CalledFromWrongThreadException
      • NullPointerException
      • 运行正常,mTextViewUser组件上显示内容为10
      选C。Button的初始化时找不到对应的id的。id绑定应该在setContentView后执行。

      遇到下列哪种情况时需要把进程移到前台?
      • 进程正在运行一个与用户交互的Activity ,它的onResume()方法被调用
      • 进程有一正在运行的BroadcastReceiver,它的onReceive()方法正在执行
      • 进程有一个Service,并且在Service的某个回调函数(onCreate()、onStart()、或onDestroy())内有正在执行的代码
      • 所有选项均正确
      • 进程有一个Service,该Service对应的Activity正在与用户交互


      Android 默认使用__作为字号单位
      • dip
      • px
      • sp    sp=1/72pt
      • pt


      Android系统对下列哪些对象提供了资源池
      • Message
      • Thread
      • AsyncTask
      • Looper
      A.Message提供了消息池,有静态方法Obtain从消息池中取对象;
      B.Thread默认不提供资源池,除非使用线程池ThreadPool管理;
      C.AsynTask是线程池改造的,默认提供最多5个线程进行并发操作;
      D.Looper,每个Looper创建时创建一个消息队列和线程对象,也不是资源池;


      有关Activity生命周期描述正确的是
      • 设置Activity的android:screenOrientation="portrait"属性时,切换屏幕横纵方向时不会重新调用各个生命周期,只会执行onConfigurationChanged方法
      • 未设置Activity的android:configChanges属性,切换屏幕横纵方向时会重新调用onCreate()方法
      • 当再次启动某个launchMode设置为singletask的Activity,它的onNewIntent()方法会被触发
      • 用户正在操作某个Activity,这时如果其他应用程序需要内存,系统会将用户当前操作的Activity强制关闭
      (BC)
      A 设置Activity的android:screenOrientation="portrait"属性时,无法切换横竖屏,因此不但不会重新调用各个生命周期方法,而且onConfigurationChanged()方法也不会执行。
      B 未设置Activity的android:configChanges属性,API上这样说"the activity will be restarted if any of these configuration changes happen in the system.";如何配置有改变,就会重启activity
      C launchMode为singleTask的时候,通过Intent启到一个Activity, 如果系统已经存在一个实例,系统就会将请求发送到这个实例上, 但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法
      D 用户正在操作某个Activity,这时如果其他应用程序需要内存。 此时的Activity是Foreground process,应该按照Empty process,Background process,Service process,Visible process顺序kill,最后才是前台进程。


      八、软件工程和测试

      (8.1)软件工程

      下面属于模型驱动开发技术的有?
      过程建模
      数据建模
      对象建模

      业务建模



      代码评审是检查源代码是否达到模块设计的要求。请判断这句话的正确与否。
      T
      F  代码评审不只是检查模块设计



      下列有关软件工程的标准,属于行业标准的是()
      • GB
      • DIN
      • ISO
      • IEEE




      下列关于关联、聚合(Aggregation)以及组合(Composition)的区别描述正确的是?
      • 关联是表示两个类的一般性联系
      • 组合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系
      • 聚合是关联关系的一种特例,他体现的是一种contains-a的关系
      • 以上都不正确

      关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:

      从实现的角度讲,聚合可以表示为:

      class A {...} class B { A* a; .....}

      而组合表示contains-a的关系,关联性强于聚合:组合类与被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系:

      实现的形式是:

      class A{...} class B{ A a; ...}




      在关于用例(use case)的描述中,错误的是?
      • 用例将系统的功能范围分解成许多小的系统功能陈述
      • 一个用例代表了系统的一个单一的目标
      • 用例是一个行为上相关的步骤序列
      • 用例描述了系统与用户的交互



      快速原型是利用原型辅助软件开发的一种新思想,是在研究( )的方法和技术中产生的。
      • 需求阶段
      • 设计阶段
      • 测试阶段
      • 软件开发的各个阶段
      这些模型什么的,都是在需求分析阶段考虑的东西。



      下面不能作为结构化方法软件需求分析工具的是
      • 系统结构图
      • 数据字典(DD)
      • 数据流程图(DFD图)
      • 判定表
      【解析】选a,结构化方法软件需求分析工具主要有数据流图、数据字典、判定树和判定表。


      下面不属于软件设计阶段任务的是
      • 软件总体设计
      • 算法设计
      • 制定软件确认测试计划
      • 数据库设计
      软件设计一般分为总体设计和详细设计两个阶段,总体设计的任务是确定软件的总体结构,子系统和模块的划分,并确定模块间的接口和评价模块划分质量,以及进行数据分析。详细设计的任务是确定每一模块实现的定义,包括数据结构、算法和接口。制定软件确认测试计划是测试阶段的任务。

      下面有关值对象模式的描述,说法错误的是?
      • 值对象模式用来把一组数据封装成一个对象的模式
      • 解决的问题是在远程方法的调用次数增加的时候,相关的应用程序性能将会有很大的下降
      • 使用值对象的时候,可以通过仅仅一次方法调用来取得整个对象,而不是使用多次方法调用以得到对象中每个域的数值
      • 它的本质是分层
      本质应该是封装数据

      设计模式中,属于结构型模式的有哪些?
      • 状态模式
      • 装饰模式
      • 代理模式
      • 观察者模式

      采用瀑布模型进行系统开发的过程中,每个阶段都会产生不同的文档。以下关于产生这些文档的描述中,正确的是哪一个?
      • 外部设计评审报告在概要设计阶段产生
      • 集成测评计划在程序设计阶段产生
      • 系统计划和需求说明在详细设计阶段产生
      • 在进行编码的同时,独立的设计单元测试计划

      软件实施活动的进入准则是哪些?
      • 需求工件已经被基线化
      • 详细设计工件已经被基线化
      • 构架工件已经被基线化
      • 项目阶段成果已经被基线化


      确定模块的功能和模块的接口是在软件设计的那个阶段完成的?
      • 需求分析
      • 概要设计
      • 详细设计
      • 编码


      在概念设计阶段,最常使用的数据模型是?
      • 对象模型
      • 物理模型
      • 逻辑模型
      • 实体联系模型


      在选择开发方法时,有些情况不适合使用原型法,以下选项中不能使用快速原型法的情况是哪个?
      • 系统的使用范围变化很大
      • 系统的设计方案难以确定
      • 用户的需求模糊不清
      • 用户数据资源缺乏组织和管理

      (8.2)软件测试


      软件测试计划评审会需要哪些人员参加?
      • 项目经理
      • SQA 负责人
      • 配置负责人
      • 测试组


      代码评审员一般由测试员担任。请判断这句话的正确与否。
      • T
      • F  应该是由程序员担任的

        测试设计员的职责有哪些?
        • 制定测试计划
        • 设计测试用例
        • 设计测试过程、脚本
        • 评估测试活动



        对手机软件的压力测试通常可以包括【多选】( )
        • 存储压力
        • 响应能力压力
        • 网络流量压力
        • 并发压力

        下面关于软件测试,描述正确的是?
        • 软件测试是使用人工操作或者软件自动运行的方式来检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别的过程。
        • 软件测试的测试目标是发现一些可以通过测试避免的开发风险。
        • 软件测试的原则之一是测试应该尽早进行,最好在需求阶段就开始介入。
        • 软件测试主要工作内容是验证(verification)和确认(validation)


        软件验收测试包括哪些?
        • 正式验收测试
        • 白盒测试
        • alpha测试
        • beta测试

        软件验收测试分为三类:

        正式验收测试;

        非正式验收测试其中包括α测试(由用户、测试人员、开发人员共同参与的内部测试。)

                                          和β测试(内测后的公测,即完全交给最终用户测试。)




        既可以用于黑盒测试,也可以用于白盒测试的方法的是()
        • 逻辑覆盖法
        • 边界值法
        • 基本路径法
        • 正交试验设计法


        测试方法可以分成哪几种?
        • 个人复查
        • 抽查和会审
        • 黑盒测试
        • 白盒测试
        人工测试分为:个人复查、抽查和会审
        按照测试实现,是否关心软件设计代码实现分为白盒和黑盒


        判断对错。系统测试计划属于项目阶段性关键文档,因此需要同行评审。
        • 正确
        • 错误


        下列关于alpha 测试的描述中正确的是哪些?
        • alpha 测试需要用户代表参加
        • alpha 测试不需要用户代表参加
        • alpha 测试是系统测试的一种
        • alpha 测试是验收测试的一种



        设计系统测试计划需要参考的项目文挡有哪些?
        • 软件测试计划
        • 可行性研究报告
        • 软件需求规范
        • 迭代计划


        在下面说列举的逻辑测试覆盖中,测试覆盖最强的是?
        • 条件覆盖
        • 条件组合覆盖
        • 语句覆盖
        • 判定/条件覆盖

        十五、智力类



        一个5*4的矩阵,有多少个长方形?
        • 120
        • 150
        • 100
        • 80
        长任取两个点C(6,2)*宽任取两个点C(5,2) = 15* 10 = 150


        现有一完全的P2P共享协议,每次两个节点通讯后都能获取对方已经获取的全部信息,现在使得系统中每个节点都知道所有节点的文件信息,共17个节点,假设只能通过多次两个对等节点之间通讯的方式,则最少需要()次通讯
        • 32
        • 31
        • 30
        • 29
        答案:c
        如上图1所示,假设有5个节点,按连线1、2、3、4通讯之后,节点4和5就掌握了所有节点的信息,之后,1、2、3节点只需跟4或5任一节点通讯一次即连线5、6、7就可保证每个节点都知道所有节点的信息,总的通讯次数是(n-1)+(n-2)=2n-3次。
        如果将所有节点分成两组,如图2所示,两组中的节点分别按连线1-8顺序通讯之后,节点4和5就掌握了1-5所有节点的信息,节点9和0就掌握了6-0所有节点的信息,再按连线9、10通讯之后,节点4、5、9、0就掌握了1-0所有节点的信息,剩下的节点只需跟4、5、9、0任一节点通讯一次就可保证每个节点知道所有节点信息,和图1相比,多了9和10两次通讯,总的通讯次数是(2n1-3)+(2n2-3)+2=2n-4次(n1和n2分别表示分组中元素个数)。
        分3组的情况是(2n1-3)+(2n2-3)+(2n3-3)+6=2n-3次
        分4组的情况是(2n1-3)+(2n2-3)+(2n3-3)+(2n4-3)+8=2n-4次


        4个圆盘的Hanoi塔,总的移动次数为()
        • 7
        • 8
        • 15
        • 16
        答案为C。 设f(n)为n个圆盘的hanoi塔总的移动次数,其递推方程为f(n)=f(n-1)+1+ f(n-1)=2*f(n-1)+1。理解就是先把上面n-1个圆盘移到第二个柱子上(共f(n-1)步),再把最后一个圆盘移到第三个柱子(共1步),再把第二柱子上的圆盘移动到第三个柱子上( 共f(n-1)步)。而f(1)=1;于是f(2)=3,f(3)=7,f(4)=15。故答案为C。进一步,根据递推方程其实可以得出f(n) = 2^n - 1。

        一个有序数列,序列中的每一个值都能够被2或者3或者5所整除,这个序列的初始值从1开始,但是1并不在这个数列中。求第1500个值是多少?
        • 2040
        • 2042
        • 2045
        • 2050
        2、3、5的最小公倍数是30。[ 1, 30]内符合条件的数有22个。如果能看出[ 31, 60]内也有22个符合条件的数,那问题就容易解决了。也就是说,这些数具有周期性,且周期为30.
               第1500个数是:1500/22=68   1500%68=4。也就是说:第1500个数相当于经过了68个周期,然后再取下一个周期内的第4个数。一个周期内的前4个数:2,3,4,5。
        故,结果为68*30=2040+5=2045




        在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行()次比较:

        • 8
        • 9
        • 10
        • 11
        答案是 B
            比如 A B C D E F G H,通过8进4的方式,A与B比较, C与D比较.....然后再4进2,A与C比较(假设A,C比B,D大),E与G比较。再2进1,比如A与E比较(假设A,E比C,G大)选出最大的A,总共7次。
           然后次大的数一定是被最大数PK下去的,所以再选B C E三个比较2次得到次大的数
                                                             A
                                     A                                              E
                       A                          C                    E                   G    (7次)
               A             B            C           D       E          F      G           H
         
        再选 BCE中最大的(2次),共9次,不过可以这个方法比较次数是少一点,但是所需要的空间大,要记下与沿途的最大值比较的数。


        • 1
          点赞
        • 20
          收藏
          觉得还不错? 一键收藏
        • 1
          评论

        “相关推荐”对你有帮助么?

        • 非常没帮助
        • 没帮助
        • 一般
        • 有帮助
        • 非常有帮助
        提交
        评论 1
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值