23考研408真题部分详解

1.下面程序的复杂度为:

int sum=0;
for(int i=1;i

【解析】本题的解题关键在于求循环执行次数与问题规模的关系。
(1)设k表示外层循环的执行次数,外层循环可表示为for(inti=1;i<n;i=2ᵏ),
for(inti=1;i<n;i=2ᵏ),
k的取值1,2,3,4,…,log₂n,因此外层循环执行log₂n次。
(2)内层循环的执行次数与语句sum++;无关,只需要考虑for(int j=0;j 当k=1时,i=1,内层循环条件为(j=0;j<1;j++),循环执行1次。
当k=2时,i=2,内层循环条件为(j=0;j<2;j++),循环执行2次。
当k=3时,i=4,内层循环条件为(j=0;j<4;j++),循环执行4次。
当k=4时,i=8,内层循环条件为(j=0;j<8;j++),循环执行8次。
………………
当 k=log₂n时,i=n,内层循环条件为( (j=0;j 利用等比数列求和,
1+2+4+8+⋯+n=20+21+22+23+⋯+2log2n⁡n=2an−a12−1=2×2log2⁡n−11=2n−1
因此,时间复杂度为O(2n-1)=O(n) 

2.已知初始为空的队列Q的一端仅能进行入队操作,另外一端既能进行入队操作又能进行出队操作。若Q的入队序列是1,2,3,4,5,则不能得到的出队序列是( D ) 。
A .5,4,3,1 ,2    B.5 ,3,1 ,2,4     C .4 ,2 ,1 ,3 ,5     D.4,1 ,3,2,5 


【解析】本题考查的是输出受限的双端队列,可以根据出队序列寻找对应的入队操作,若找不到与之对应的入队操作,则是不能得到的出队序列。假设只能入队的一端为左端,既能入队又能出队的为右端。选项A,1可以从任何一端入队,2在1之后出队,所以2从左端入队,3在1之前出队,所以3从右端入队,4、5同理均从右端入队,可得到选项A的出队序列。选项B,1可以从任何一端入队,2从左端入队,3从右端入队,4从左端入队,5从右端入队,可得到选项B的出队序列。选项C,1可以从任何一端入队,2从右端入队,3从左端入队,4从右端入队,5从左端入队,可得到选项C的出队序列。选项D,1可以从任何一端入队,2从左端入队,3从左端入队,此时队列中从右到左依次为1、2、3,出队顺序应为1、2、3,与选项D的出队序列不符,也找不到与该出队序列对应的入队操作,所以不能得到的出队序列是选项D。
 

3..设有两个集合A和B,设计生成集合C=A∩B的算法,其中集合A、B和C用数组存储表示。 [中国科学院大学2013年]
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C、C++或Java语言表述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度。

import java.util.ArrayList;

public class SetIntersection {
    public static ArrayList findIntersection(int[] A, int[] B) {
        ArrayList C = new ArrayList(); // 创建集合C,用于存储交集的元素
        
        for (int i = 0; i < A.length; i++) {
            for (int j = 0; j < B.length; j++) {
                if (A[i] == B[j]) { // 如果集合A中的元素与集合B中的元素相等
                    C.add(A[i]); // 将该元素添加到集合C中
                    break; // 跳出内层循环,继续处理下一个元素
                }
            }
        }
        
        return C; // 返回集合C作为交集结果
    }

    public static void main(String[] args) {
        int[] A = {1, 2, 3, 4, 5};
        int[] B = {4, 5, 6, 7, 8};
        
        ArrayList C = findIntersection(A, B);
        
        System.out.println("Intersection: " + C);
    }
}

该算法的时间复杂度为O(n^2),其中n是集合A和集合B的总元素数量之和。因为需要对集合A和集合B的每个元素进行比较,所以时间复杂度是二次方级别。

你可能感兴趣的:(java)