黑龙江大学 计算机软件学院算法习题
计算机软件基础习题及参考答案

习题一1.什么是数据结构,数据的逻辑结构,数据的存储结构?数据结构对算法有什么影响?请举例说明。
2.数据结构的存储方式主要有哪两种?它们之间的本质区别是什么?3.设n为正整数, 分析下列各程序段中加下划线的语句的执行次数。
(1) for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++) {c[i][j] = 0.0;for (int k = 1; k <= n; k++)c[i][j] = c[i][j] + a[i][k] * b[k][j];}(2) x = 0; y = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= i; j++)for (int k = 1; k <= j; k++)x = x + y;(3) int i = 1, j = 1;while (i<=n && j<=n) {i = i + 1; j = j + i;}(4)*int i =1;do{for (int j = 1; j <= n; j++)i = i + j;}while(i<100 + n);4.试编写一个函数计算n!*2n的值,结果存放于数组A[arraySize]的第n个数组元素中,0 ≤n ≤arraySize。
若设计算机中允许的整数的最大值为maxInt,则当n>arraySize或者对于某一个k (0 ≤ k ≤ n),使得k!*2k > maxInt时,应按出错处理。
可有如下三种不同的出错处理方式:(1) 用printf显示错误信息及exit(1)语句来终止执行并报告错误;(2) 用返回整数函数值0, 1来实现算法,以区别是正常返回还是错误返回;(3) 在函数的参数表设置一个引用型的整型变量来区别是正常返回还是某种错误返回。
算法练习题及答案

算法练习题及答案算法练习题及答案随着计算机科学的发展,算法成为了计算机科学的核心内容之一。
算法是一种解决问题的方法和步骤,它可以将复杂的问题简化为一系列简单的操作。
为了提高算法设计和分析的能力,许多学生和程序员经常进行算法练习。
在这篇文章中,我将给出一些常见的算法练习题及其答案,希望能对读者有所帮助。
1. 反转字符串题目:给定一个字符串,将其反转并返回。
解答:可以使用两个指针,一个指向字符串的开头,一个指向字符串的末尾。
然后交换两个指针指向的字符,然后分别向中间靠拢,直到两个指针相遇。
2. 判断回文数题目:给定一个整数,判断它是否是回文数。
回文数是指正序和倒序读都一样的整数。
解答:可以将整数转换为字符串,然后使用反转字符串的方法判断是否相等。
另一种方法是将整数反转后与原来的整数进行比较。
3. 寻找两个有序数组的中位数题目:给定两个有序数组,找出这两个数组合并后的中位数。
要求时间复杂度为O(log(m+n))。
解答:可以使用二分查找的思想。
首先将两个数组合并成一个有序数组,然后找到中位数的位置。
如果数组长度为奇数,中位数就是中间的元素;如果数组长度为偶数,中位数就是中间两个元素的平均值。
4. 搜索旋转排序数组题目:给定一个按照升序排列的整数数组,经过旋转后的数组,搜索一个给定的目标值。
如果目标值存在于数组中,则返回它的索引,否则返回-1。
解答:可以使用二分查找的思想。
首先找到数组的中间元素,然后判断中间元素与目标值的关系。
如果中间元素等于目标值,直接返回索引;如果中间元素小于目标值,说明目标值在右半部分,继续在右半部分进行二分查找;如果中间元素大于目标值,说明目标值在左半部分,继续在左半部分进行二分查找。
5. 最长公共前缀题目:给定一个字符串数组,找到这些字符串的最长公共前缀。
解答:可以将第一个字符串作为初始的最长公共前缀,然后逐个比较后面的字符串与最长公共前缀的相同部分。
如果相同部分为空,则返回空;如果相同部分不为空,则更新最长公共前缀。
计算机科学编程与算法的练习题

计算机科学编程与算法的练习题计算机科学编程与算法的练习题对于学习者来说是非常重要的。
通过解决各种练习题,我们可以提升我们的编程技能、理解算法的应用,并增强我们解决问题的能力。
本文将介绍一些在计算机科学编程与算法练习中常见的题型,并通过实例和解析来展示如何高效地解决这些问题。
一、排序算法1. 冒泡排序冒泡排序是一种简单且常用的排序算法。
它通过比较相邻元素的大小来进行排序,并重复遍历整个数组,直到排序完成。
下面是一个冒泡排序的实例代码:```pythondef bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr# 测试sorted_arr = bubble_sort(arr)print("排序结果:", sorted_arr)```2. 快速排序快速排序是一种高效的排序算法,它通过选择一个基准元素,将数组分割成两个子数组,并将小于基准元素的数放在左边,大于基准元素的数放在右边,然后递归地对子数组进行排序。
下面是一个快速排序的实例代码:```pythondef quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr)//2]left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort(left) + middle + quick_sort(right)# 测试sorted_arr = quick_sort(arr)print("排序结果:", sorted_arr)```二、递归问题递归问题是计算机科学编程与算法中常见的问题类型。
计算机与软件学院《数据结构》笔试题及答案

计算机与软件学院考试试卷及参考答案 课程名称:数据结构 一、填空题(24分) 1. 为了能有效地应用HASH 查找技术,必须解决的两个问题是____________________和__________________________。
2. 下面程序段的功能实现数据x 进栈,要求在下划线处填上正确的语句。
typedef struct {int s[100]; int top;} sqstack; void push(sqstack &stack,int x){if (stack.top==m-1) printf(“overflow”);else {____________________;_________________;}}3. 中序遍历二叉排序树所得到的序列是___________序列(填有序或无序)。
4. 快速排序的最坏时间复杂度为___________,平均时间复杂度为__________。
5. 设某棵二叉树中度数为0的结点数为N 0,度数为1的结点数为N 1,则该二叉树中度数为2的结点数为_________;若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有_______个空指针域。
6. 设某无向图中顶点数和边数分别为n 和e ,所有顶点的度数之和为d ,则e=_______。
7. 设一组初始记录关键字序列为(55,63,44,38,75,80,31,56),则利用筛选法建立的初始堆为___________________________。
8. 已知一有向图的邻接表存储结构如下:从顶点1出发,DFS 遍历的输出序列是 ,BFS 遍历的输出序列是二、应用题(36分)1. 设一组初始记录关键字序列为(45,80,48,40,22,78),则分别给出第4趟简单选择排序和第4趟直接插入排序后的结果。
2. 设指针变量p 指向双向链表中结点A ,指针变量q 指向被插入结点B ,要求给出在结点A 的后面插入结点B 的操作序列(设双向链表中结点的两个指针域分别为llink 和rlink )。
黑龙江大学C语言程序设计试题库程序单选

单选题46、若输入ab,程序运行结果为()。
main(){ static char a[2];scanf("%s",a);printf("%c,%c",a[1],a[2]);}**C**A) a,bB) a,C) b,D) 程序出错47、若有说明: int a[3][4]={0};则下面正确的叙述是()。
**D**A) 只有元素a[0][0]可得到初值0B) 此说明语句不正确C) 数组a中各元素都可得到初值,但其值不一定为0D) 数组a中每个元素均可得到初值048、若有说明:int a[][3]={1,2,3,4,5,6,7};则a数组第一维的大小是()。
**B**A) 2B) 3C) 4D) 无确定值49、设有数组定义: char array [ ]="China"; 则数组 array所占的空间为()。
**C**A) 4个字节B) 5个字节C) 6个字节D) 7个字节50、C语言程序中,当调用函数时()。
**A**A) 实参和虚参各占一个独立的存储单元B) 实参和虚参可以共用存储单元C) 可以由用户指定是否共用存储单元D) 计算机系统自动确定是否共用存储单元51、C语言程序中,若对函数类型未加显式说明,则函数的隐含说明类型为()。
**C**A) voidB) doubleC) intD) char52、C语言程序中必须有的函数是()。
**B**A) #include "stdio.h"B) mainC) printfD) scanf53、C语言规定:简单变量做实参时,它和对应形参之间的数据传递方式是()。
**B**A) 地址传递B) 单向值传递C) 由实参传给形参,再由形参传回给实参D) 由用户指定的传递方式54、当调用函数时,实参是一个数组名,则向函数传送的是()。
**B**A) 数组的长度B) 数组的首地址C) 数组每一个元素的地址D) 数组每个元素中的值55、对于void类型函数,调用时不可作为()。
2013年哈工大软件学院算法设计与分析期末考试

2013年哈⼯⼤软件学院算法设计与分析期末考试
1.判断题 20 = 10*2'
2.简答题 20 = 4*5'
3.算法设计题 60 = 4*15'
判断题:
忘了,很简单。
简答题:
1.T(n) = 2T(n/2)+n,求时间复杂度
2.图的最⼤匹配的定义
3.时间复杂度的定义
4.证明或者否证:O( (x+y)^2 ) = O( x^2 )+O(x*y)
⼤题:
1.字符串集合{this,that,there,their}利⽤2-gram构造的倒排表,编号分别是1,2,3,4
2.求最长连续和:给出数组A[],求 i<= k <=j,使得 sigma(A[k])最⼤:
1.设计O(n^2)的算法。
2.设计O(nlogn)的算法。
3.在2问设计对的情况下分析该算法的时间复杂度,如果2问不对,这题没分。
3.给出0,1以及符号组成的串: 1 op1 0 op2 1。
op代表符号,有两种:a(代表与),o(代表或)。
问如何添加括号使得串的最终值为1,求添加的⽅案数。
要求写出DP转移⽅程,伪代码书写,时间复杂度分析。
4.在[0,L]的长廊上,有n个展品,需要安排守卫去搜所有的展品,每个守卫所守的范围是1(包含),问最少安排多少个守卫去守。
1.设计⼀个贪⼼算法。
2.分析该算法的正确性。
3.该算法的时间复杂度。
2022年黑龙江大学网络工程专业《计算机系统结构》科目期末试卷A(有答案)

2022年黑龙江大学网络工程专业《计算机系统结构》科目期末试卷A(有答案)一、选择题1、最能确保提高虚拟存贮器访主存的命中率的改进途径是( )A.增大辅存容量B.采用FIFO替换算法并增大页面C.改用LRU替换算法并增大页面D.改用LRU替换算法并增大页面数2、IBM360/91对指令中断的处理方法是()A.不精确断点法B.精确断点法C.指令复执法D.对流水线重新调度3、以下说法中,不正确的是,软硬件功能是等效的,提高硬件功能的比例会:( )A.提高解题速度B.提高硬件利用率C.提高硬件成本D.减少所需要的存贮器用量4、对系统程序员不透明的应当是( )。
A.Cache存贮器XB.系列机各档不同的数据通路宽度C.指令缓冲寄存器D.虚拟存贮器5、计算机系统的层次结构按照由高到低的顺序分别为()。
A.高级语言机器级,汇编语言机器级,传统机器语言机器级,微程序机器级B.高级语言机器级,应用语言机器级,汇编语言机器级,微程序机器级C.应用语言机器级,传统机器语言机器级,汇编语言机器级,操作系统机器级D.应用语言机器级,操作系统机器级,微程序机器级,传统机器语言机器级6、除了分布处理、MPP和机群系统外,并行处理计算机按其基本结构特征可分为流水线计算机,阵列处理机,多处理机和()四种不同的结构。
A.计算机网络B.控制流计算机C.机群系统D.数据流计算机7、“启动I/O”指令是主要的输入输出指令,是属于()。
A.目态指令B.管态指令C.目态、管态都能用的指令D.编译程序只能用的指令8、直接执行微指令的是( )A.汇编程序B.编译程序C.硬件D.微指令程序9、"一次重叠"中消除"指令相关"最好的方法是( )。
A.不准修改指令B.设相关专用通路C.推后分析下条指令D.推后执行下条指令10、不同系列的机器之间,实现软件移植的途径不包括()。
A.用统一的高级语言B.用统一的汇编语言C.模拟D.仿真二、判断题11、分布系统以分布为特征,用真实处理机替代虚拟处理机,其并行性是属于并发性。
《计算机软件基础》复习题库(带答案)[1]
![《计算机软件基础》复习题库(带答案)[1]](https://img.taocdn.com/s3/m/1c92fd51ba1aa8114431d9a0.png)
《计算机软件基础》复习题库(带答案)1.线性表的链式存储结构与顺序存储结构相比优点是 CD 。
A. 所有的操作算法实现简单B. 便于随机存取C. 便于插入和删除D. 便于利用零散的存储器空间2.线性表是具有n 个 C 的有限序列。
A. 表元素B. 字符C. 数据元素D. 数据项E. 信息项3.若长度为n 的线性表采用顺序存储结构,在其第I 个位置插入一个新元素的算法的时间复杂度为 C 。
(1≤I ≤n+1) A. O(0) B. O(1)C. O(n)D. O(n 2)4.设A 是一个线性表(a 1,a 2,…,a n ),采用顺序存储结构,则在等概率的前提下,平均每插入平均每删除一个元素需要移动的元素个数为若元素插在a i 与a i+1之间(0≤I ≤n-1)的概率为)1()(2+-n ni n ,则平均每插入一 ; A. 21-n B. 2n C. 312+n D. 413+n 5.下列函数中,按它们在∞→n 时的无穷大阶数,最大的是 D 。
A. logn B. nlognC. 2n/2D. n!6.A. s->next=p+1; p->next=s;B. (*p).next=s; (*s).next=(*p).next;C. s->next=p->next; p->next=s->next;D. s->next=p->next; p->next=s;7.将两个各有n 个元素的有序表归并为一个有序表时,其最少的比较次数是 A 。
A. nB. 2n-1C. n-1D. 2n8.下面的程序段是合并两个无头结点链表(ha 和 hb)为一个无头结点链表ha 的过程,作为参数的两个链表都是按结点的data域由大到小链接的。
合并后新链表的结点仍按此方式链接。
请填写下述空框,使程序能正确运行。
#define NULL 0typedef struct node{int data;struct node *next;}node, linklisttype;void combine(linklisttype *ha, linklisttype *hb){linklisttype *h, *p;h = (linklisttype *)malloc(sizeof(linklisttype));h->next = NULL;p = h;while(ha != NULL && hb != NULL)if(ha->data>=hb->data){ /*较大的元素先插入*/p->next = (1) ;p = (2) ;(3) ;}else{p->next = (4) ;p = (5) ;(6) ;}if(ha==NULL) (7) ;if(hb==NULL) (8) ;ha = h->next;free(h);}参考答案:(1) ha (2) p->next (3) ha=ha->next(4) hb (5) p->next (6) hb=hb->next(7) p->next=hb (8) p->next=ha9.如果表A中所有元素(a1,a2,…,a n)与表B的一个顺序子表(b k,b k+1,…b k+n-1)完全相同(即a1=b k,a2=b k+1,…a n=b k+n-1),则称表A包含在表B中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Coursework 1
1. Exercise 1.3 (P5)
2. Exercise 1.6 (P5)
3. Please verify
(1)
)(32/2
2n n n θ=-.
(2)
)(62
3
n n θ≠.
(3) )(22
n o n =. (4)
)(22
2
n o n ≠
4. (1)Write out the recurrence for quick sort.
(2) Use a recursion tree to give an asymptotically tight solution to the recurrence you have given. (3) Verify your bound by the substitution method. 5. Use the master method to give tight asymptotic bounds for the following recurrences. a) T(n)=4T(n/2)+n. b) T(n)=4T(n/2)+n 2. c) T(n)=4T(n/2)+n 3.
Coursework 2
1.求一个非空集合中的最大的数。
要求用分治策略设计算法并进行时间复杂度分析。
2.用分治策略设计一个算法,求二叉树中叶结点的个数。
3. 设计算法并证明:
给定一个由n 个实数构成的集合S 和另一个实数x,请设计一个在最坏情况下执行时间为O(n log n )的算法,使之能判断出S 中是否存在两个和等于x 的元素。
4. 根据slides 演示的过程设计一个PARTITION 算法。
(不用做)
5.根据slides演示的过程设计一个计数排序(Counting Sort)算法。
(不用做)Coursework 3
1
(1)矩阵连乘积A1A2A3A4的一个计算次序,使得依此次序计算矩阵连乘积所需
要的乘法次数最少。
(2)计算矩阵连乘积A1A2A3A4所需要的最少乘法次数是多少?(10分)
2.给定两个序列X=<A,B,B,D,A>,Y=<B,D,A,B>。
请采用动态规划策略求出其最长公共子序列。
3.采用动态规划策略,计算{3,-2,-1,8,-3,8,-1,9,-8,6,-2,7,-3,8}的最大子段和,并给出这个最大子段和的起始下标索引和终止下标索引。
4.采用动态规划策略实现求解0-1背包问题的算法。
0-1背包问题:给定n种物品和一个背包。
物品i的重量是w i,其价值为v i,背包的容量为W。
问应如何选择物品装入背包,使得装入背包中的物品的总价值最大?在选择物品装入背包时,对每种物品i只有两种选择,要么装入,要么不装入,不能将物品i装入背包多次,也不能只装入物品i的一部分。
因此,该问题称为0-1背包问题。
Coursework 4
1.用贪心策略设计一个算法,求解背包问题。
[背包问题:给定n种物品和一个背包,物品i的重量是w[i], 其价值是p[i], 背包的容量为c。
设物品已按单位重量价值递减的次序排序。
每种物品不可以装入背包多次,但可以装入部分的物品i。
问应如何选择装入背包中的物品,使得背包的总价值最大?]
2.设有无数多个硬币,面值分别为1角、五分、二分和一分。
请设计一个贪心算法,使得对于任意给定的面值为n分钱的纸币(n>18分钱),能够将该纸币换为等值的最少个数的硬币,并输出每种面值硬币个数。
要求:
(1)说明所用的数据结构及其含义;
(2)用C/C++程序设计语言或伪代码写出算法;
(3)简要分析算法的时间复杂性。
3.设计算法实现优先队列(堆)的删除操作。
4.设计算法实现优先队列(堆)的插入操作。
5.设有一个活动的集合S={1,2,…,11}如下表所示。
其中[s j,f j]是活动j的起
止时间,且f1≤f2≤…≤f11。
l i是S i ={j∈S| s j≥f l
i-1}中具有最小结束时间f l
i
的活动(设l 0=0,f 0=0)。
设A 是S 的包含活动1的优化解。
请写出每个l i ,并据此构造出S 的包含活动1的优化解A 。
最后针对此例子说明贪心选择性。
活动集合S 中活动的起止时间表
6. 有一批集装箱要装上一艘载重量为c 的轮船,其中集装箱i 的重量为W i 。
现要将尽可能多的集装箱装到轮船上。
设集装箱已依其重量从小到大排序,(x 1,x 2,…,x n )是最优装载问题的一个最优解,其中,x i ∈{0,1},1≤i ≤n(n 是集装箱总数),且x 1=1。
请证明(x 2, x 3,…, x n )是轮船装载重量为c-w 1
,且待装船集装箱为{2,3,…,n}时相应最优装载问题的一个最优解。
Coursework 5
1.给出下图所示的四个顶点图所有3-着色法,要求画出可行解空间树。
2.考虑n=3时0-1背包问题的实例:W={30,20,20},P={100,60,60},C=40。
当x[1]=1且x[2]=0时,计算Bound(3)。
3. 考虑n=3的批处理作业调度实例:
要求(1(2)写出该问题的剪枝策略(限界条件);
(3)按回溯法搜索解空间树,并利用剪枝策略对应该剪掉的子树打⨯,最
终给出该问题的解。
4. 所谓子集和问题是:给定由n 个不同正数组成的集合W={w i | w i >0,i=1,2,…,n }和正数M ,要求找出N={1,2,…,n}的所有使得M w S
i i =∑∈的子集S 。
(例如:给定n=4, W={11,13,24,7}和M=31,则相应的子集和问题的解是{3,4},{1,2,4}。
) 请设计一个求解子集和问题的算法。
Coursework 6
1.考虑n=3的批处理作业调度实例:
要求(1
(2)写出该问题的剪枝策略(限界条件);
(3)请分别按队列式分支限界法和优先队列式分支限界法搜索解空间树,并利用剪枝策略对应该剪掉的子树(在相应结点上)打 。
(4)给出该问题的最优值和最优解。