赋厘囱锰精霸扒袄看芍化多保
第一章 绪论 绪论测验
1、 下面( )术语与数据的存储结构无关
答案: 队列
2、 算法分析的目的是( )
答案: 分析算法的效率以求改进
3、 下面程序段的时间复杂度是( )for(i=0;i<n;i++) for(j=”0;j<m;j++)” a[i][j]=”0;” =”” a:=”” o(n*m)=”” b:o(n)=”” c:o(m)=”” d:o(n+m)=”” 答案:=”” <span=””> O(n*m)</n;i++)>
4、 下面程序段的时间复杂度是( )i=s=0;while(s<n){i++;s+=i;} =”” a:o(n)=”” b:o(s)=”” c:o(sqrt(n))=”” 注释:sqrt(n)表示对n开方=”” d:o(n^2)=”” 注释:n^2表示求n的平方=”” 答案:=”” <span=””>O(sqrt(n)) 注释:sqrt(n)表示对n开方</n){i++;s+=i;}>
5、 下面程序段的时间复杂度是( )i=1;while(i<=n) i=i3;
答案: O(logn) 注释:对数复杂度
6、 数据的关系有逻辑关系和存储关系。其中逻辑关系是进行算法分析和设计需要考虑与使用的,而存储关系是编程实现的时候需要考虑的,逻辑关系和存储关系之间并没有关系
答案: 错误
7、 下面的递归函数时间复杂度是O(1)int fact(int n){ if(n<=1)return 1; else return n*fact(n-1);}
答案: 错误
8、 算法和程序都不能无穷的,否则会进入死循环
答案: 错误
9、 数据包含数据对象,数据对象包含数据元素,数据元素包含数据项。
答案: 正确
10、 算法可以用不同的语言描述,比如C或者java,所以算法实际上就是程序。
答案: 错误
第二章2.1 线性表 (本章内容比较多,需要2周的学习时间) 线性表测验
1、 双向链表中有2个指针域pre和next,分别指向直接前驱和直接后继,假设有指针p指向链表中的一个结点,指针q指向一个待插入的结点,现在要求在p的前面插入q所指结点,则正确的插入语句为( )
答案: p->pre->next=q; q->next=p; q->pre=p->pre;p->pre=q;
2、 在一个具有n个链结点的线性链表中,按数据内容查找某一个结点,如果查找成功,需要平均比较( )个结点。
答案: (n+1)/2
3、 假设按照行优先存储整数数组A[9][8],第一个元素a11的首字节地址是100,每个整数占4个字节,则元素a32的存储地址是( )提示:数组大小是9行8列,第一个位置是1,不是0
答案: 168
4、 一个栈的入栈序列是a,b,c,d,e,则不可能的出栈输出序列是( )
答案: dceab
5、 当对一个线性表经常进行存取而很少进行插入及删除操作时,采用( )存储结构最节省时间;如果经常进行插入,删除操作时,则采用( )存储结构最节省时间。
答案: 顺序,链式
6、 设顺序表L是一个非递减的有序表,下面的哪个算法,能够将元素x插入L中,并使L仍然有序。
答案: //L是顺序存储结构void insert(list *L,elemtype x){ int i=L->length-1; while(i>=0) { if(xdata[i]){L->data[i+1]=L->data[i];–i;} } L->data[i]=x; L->length+=1;}
7、 已知数据3,4,-2,0,8存储在顺序存储结构中,编程实现删除x的操作为( )提示:数据从顺序存储结构的第0个位置开始存储
答案:=”” <span=””>void del(SqList L,elemtype x){ int i=0; while(i<l.length) {=”” if(l.data[i]!=”x){” i++;=”” }=”” else=”” break;=”” while(i<l.length-1)=”” l.data[i]=”L.data[i+1];” i++;}=”” l.length–;}<=”” span=””></l.length)></l.length-1)></l.length)>
8、 已知不带头结点的单链表L,下面用函数实现的在第一个元素前面插入值为x的元素结点的算法错误的是( )
答案: void insert(List L,elemtype x){ ptr p=L; node d=new node(x); ptr q=&d; p->next=q; L=&q;}
9、 下面程序段的输出结果是( )void main(){ Queue Q; InitQueue(Q); char x=’e’,y=’c’; EnQueue(Q,’h’); EnQueue(Q,’r’); EnQueue(Q,y); DeQueue(Q,x); EnQueue(Q,x); DeQueue(Q,x); EnQueue(Q,’a‘); while(!QueueEmpty(Q)){ DeQueue(Q,y); printf(y);} printf(x);
答案: char
10、 当在一个有序的顺序存储表上查找一个数据时,可用折半查找,也可用顺序查找,但前者比后者的查找速度( )
答案: 大部分情况下快
11、 已知有一系列输入数据为32,14,78,2,62,5,需要得到5,2,2,7,4,2,请问用什么数据结构支撑算法?
答案: 用栈将数据全部入栈,再出栈,出栈的数据取个位,就得到需要的输出序列。
12、 关键字越大,优先级越高。为了更好的为优先级高的顾客服务,银行应该采用什么存储结构支撑算法?
答案: 有序链表
第二章 2.2 查找 查找测验
1、 已知在长度为n的线性表中采用顺序查找,查找成功最好的比较次数是( ),查找成功的最坏比较次数是( ),查找失败的比较次数是( )
答案: 1,n,n
2、 长度为n的有序顺序表采用折半查找,查找成功的最少次数为( ),查找成功的最大次数为( ),查找失败的最大次数为( ),所以折半查找的最坏时间复杂度为( )
答案: 1,logn,logn,O(logn)
3、 查找表如下分组(3,7,1,8,15),(22,43,18,45),(60,58,82,77,62),(90,88,99,100),则索引表为( ),查找58需要比较( )次
答案: (15,1),(45,6),(82,10),(100,15),(NULL,19) 5
4、 查找表32,45,18,77,5,23,44,19,7,3,哈希函数为H(key)=key %5,采用链地址法解决冲突的ASL(成功)=( ),采用表长为11的线性探测再散列开放地址法的ASL(成功)=( ),
答案: 18/10,32/10
5、 哈希函数H(k)=k %11,采用开放地址法的平方探测再散列(di=1,4,9,16,……)解决冲突,输入关键字(9,31,26,19,1,13,2,11,27,16,21),表长为13,建立的哈希表为( ),ASL(成功)=( )
答案: 地址0123456789101112关键字1111322627161993121 查找次数11121121122 ASL(成功)=15/11
第二章 2.3 排序 排序测验
1、 请对下列数据13,24,7,1,8,9,11,56,34,51,2,77,5,进行简单插入排序,冒泡排序(每趟大数冒到后面)和选择排序,2趟后的排序结果为:( )
答案: 2趟后的简单插入排序序列为:7,13,24,1,8,9,11,56,34,51,2,77,52趟后的冒泡排序为:7,1,8,9,11,13,24,34,2,51,5,56,772趟后的选择排序为:1,2,7,13,8,9,11,56,34,51,24,77,5
2、 已知输入数据13,24,7,1,8,9,11,56,34,51,2,77,5,请采用2路归并递归排序算法进行排序,2趟排序后的结果为( )
答案: 1,7,13,24,8,9,11,34,51,56,2,5,77
3、 已知输入数据13,24,7,1,8,9,11,56,34,51,2,77,5,请采用快速归排序算法进行排序,其中枢纽采用3者取中法,2趟排序后的结果为( )注意:答案中的括号表示快排中的分组
答案: ((2,5,1),7,(8,9)),11,((13,34,24),51,(77,56))
4、 已知输入数据13,24,7,1,8,9,11,56,34,51,2,77,5,增量序列d=5,3,1,请采用希尔排序算法进行排序,2趟排序后的结果为( )
答案: 1,7,5,2,8,9,24,11,34,51,13,77,56
5、 已知输入数据1,2,8,5,9,11,34,56,51,77,请分析数据,采用( )排序算法效率最低
答案: 选择排序
第三章 递归与分治 递归与分治测验
1、 已知某递归算法的复杂度为:T(n)=2T(n/2)+4,则求解该递归式的解为:( )
答案: T(n)=O(n)
2、 分治法所能解决的问题一般具有以下几个特征:1.该问题的规模缩小到一定的程度就可以容易地解决;2. ______3. 利用该问题分解出的子问题的解可以合并为该问题的解;4. 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
答案: 最优子结构
3、 求一个数据序列的逆序数量不可以通过 ______排序中增加1个计数器实现。提示: 一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451 含有8个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。
答案: 堆排序;
树形选择排序
4、 下面( )说法是正确的
答案: 大部分递归程序可以转换为非递归程序,非递归程序运行速度更快。;
尾递归可以转换为循环
5、 已知求一组数据连续若干数和的最大值采用分治方法得到O(nlogn)的时间复杂度,请完成下面分治法求解的代码: /**********/ /* 分治法 最大和子数组有三种情况: 1)A[1…mid] 2)A[mid+1…N] 3)A[i..mid..j] /**********/ //find max crossing left and right int Find_Max_Crossing_Subarray(int arr[], int low, int mid, int high) { const int infinite = -9999; int left_sum = infinite; int right_sum = infinite; int max_left = -1, max_right = -1; int sum = 0; //from mid to left; for (int i = mid; i >= low; i –) { sum += arr[i]; if (sum > left_sum) { left_sum = sum; max_left = i; } } sum = 0; //from mid to right for (int j = mid + 1; j <= high; j ++) { sum += arr[j]; if (sum > right_sum) { right_sum = sum; max_right = j; } } return (left_sum + right_sum); } int Find_Maximum_Subarray(int arr[], int low, int high) { if (high == low) //only one element; return arr[low]; else { int mid = (low + high)/2; int leftSum = Find_Maximum_Subarray(arr, low, mid); int rightSum = Find_Maximum_Subarray(arr, mid+1, high); int crossSum = Find_Max_Crossing_Subarray(arr, low, mid, high); ——————————完成这里的代码—————————————————— } }
答案: int tmp=(leftSum>rightSum?leftSum:rightSum;return (tmp>crossSum?tmp:crossSum);
6、 已知求一组数据连续若干数和的最大值采用分治方法得到O(nlogn)的时间复杂度,请完成下面分治法求解的代码: /**********/ /* 分治法 最大和子数组有三种情况: 1)A[1…mid] 2)A[mid+1…N] 3)A[i..mid..j] /**********/ //find max crossing left and right int Find_Max_Crossing_Subarray(int arr[], int low, int mid, int high) { const int infinite = -9999; int left_sum = infinite; int right_sum = infinite; int max_left = -1, max_right = -1; int sum = 0; //from mid to left; for (int i = mid; i >= low; i –) { sum += arr[i]; if (sum > left_sum) { left_sum = sum; max_left = i; } } sum = 0; //from mid to right for (int j = mid + 1; j <= high; j ++) { sum += arr[j]; if (sum > right_sum) { right_sum = sum; max_right = j; } } return (left_sum + right_sum); } int Find_Maximum_Subarray(int arr[], int low, int high) { if (high == low) //only one element; return arr[low]; else { int mid = (low + high)/2; int leftSum = Find_Maximum_Subarray(arr, low, mid); int rightSum = Find_Maximum_Subarray(arr, mid+1, high); int crossSum = Find_Max_Crossing_Subarray(arr, low, mid, high); ——————————完成这里的代码—————————————————— } }注意为了尽量减少答案的多样性,本次编程代码请通过>而不是<符号进行数据的比较。按照leftSum,rightSum,crossSum的顺序进行比较。运算符和操作数之间需要一个空格(括号除外)。如果造成困惑请见谅!
答案: (以下答案任选其一都对)if (leftSum >= rightSum && leftSum >= crossSum)
return leftSum;
else if (rightSum >= leftSum && rightSum >= crossSum)
return rightSum;
else
return crossSum;;
if(leftSum > rightSum){if(leftsum > crossSum)return left sum;else return crossSum;}
else if(rightSum > crossSum)return rightSum;
else return crossSum;;
return ((leftSum > rightSum ? leftSum : rightSum) > crossSum ? (leftSum > rightSum ? leftSum : rightSum) : crossSum;;
return ((leftSum > corssSum ? leftSum : corssSum) > rightSum ? (leftSum > corssSum ? leftSum : corssSum) : rightSum;
7、 已知某递归算法的复杂度为:T(n)=2T(n/2)+4,则求解该递归式的解为:( )
答案: O(n)
8、 分治法所能解决的问题一般具有以下几个特征:1.该问题的规模缩小到一定的程度就可以容易地解决;2. ______3. 利用该问题分解出的子问题的解可以合并为该问题的解;4. 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
答案: 最优子结构
9、 求一个数据序列的逆序数量可以通过 ______排序中增加1个计数器实现。提示: 一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451 含有8个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。
答案: (以下答案任选其一都对)归并;
简单插入;
冒泡
10、 大部分递归程序可以转换为非递归程序,____程序运行速度更快。
答案: 非递归
上方为免费预览版答案,如需完整答案,请点击下方红字购买:
为了方便下次阅读,建议在浏览器添加书签收藏本网页
添加书签方法:
1.电脑按键盘的Ctrl键+D键即可收藏本网页
2.手机浏览器可以添加书签收藏本网页
墒泻锻氯块敛揪汗虱伯板鼓茬