2017 408选择题错题
1
下列函数的时间复杂度是
int func(int n){
int i = 0,sum = 0;
while(sum < n)
sum += ++i;
return i;
}
sum += ++i;等于
sum = sum + ++i;
sum=0,i=0;sum=0+1=1;
sum=1+2=3;sum=3+3=6;sum=6+4=10;
sum=10+5=15;sum=15+6=21;
不是O(n),
当n为1时,执行1次;
当n为2时,sum执行两次;
当n为3时,sum执行两次;
当n为4时,sum执行三次;
当n为5时,sum执行三次;
当n为6时,sum执行三次;
当n为7时,sum执行四次;
8,4
9,4
经过以上分析可以知道:
进行到第k趟循环的时候
sum=0+1+2+3+4+5+。。。+k
=(1+k)*k/2
所以时间复杂度为O(n^1/2)
这种思路真的很巧妙,而且举例子的办法也失效了,需要记住
2
所谓邻接矩阵存储,是指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。
邻接矩阵空间复杂度为O(n^2),不适合存储稀疏矩阵。
结点数为n的图G=(V,E)的邻接矩阵A是n*n的,将G的顶点编号为v1,v2,v3,v4。若vi,j是图的一条边,则A [ i ] [ j ]=1,否则=0;
图的邻接矩阵表示法具有如下特点:
1:无向图的邻接矩阵一定是一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素。
2:对于无向图,邻接矩阵的第i行(或第i列)非零元素的个数正好是顶点i的度TD(vj)
3:对于有向图,邻接矩阵的第i行非零元素的个数正好是顶点i的出度,第i列非零元素的个数正好是顶点i的入度。
4:用邻接矩阵存储图,很容易确定图中任意两个顶点之间是否有边相连。但是,要确定图中有多少条边,则必须按行,按列对每个元素进行检测,所花费的时间代价很大。
5:稠密图适合使用邻接矩阵的存储表示
十字链表是有向图的一种链式存储结构。在十字链表中,对应于有向图中的每条弧有一个结点,对应于每个顶点也有一个结点。
弧结点
tailvex,headvex,hlink,tlink,info
尾域(tailvex)和头域(headvex)分别指示弧尾和弧头这两个顶点在图中的位置;
链域hlink指向弧头相同的下一条弧,链域tlink指向弧尾相同的下一条弧;
info域指向该弧的相关信息。
这样,弧头相同的弧就在同一个链表上;
弧尾相同的弧也在同一个链表上。
3折半查找判定树
折半查找判定树是折半查找过程中产生