复旦大学考研计算机961真题答案针对回忆版

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

17 18年两年答案

说一下:由于学校封题,所以只有回忆版,软工细节无法复现

所以我们只能尽量写出更多东西

2017年

第一部分数据结构

1.向量相对于数组有什么优缺点?

优点:

(1)可以动态增长长度

(2)数组在内存中分配的连续空间,多次分配释放后会有内存碎片,而vectors 是动态增长的,不是连续的,所以不会出现内存碎片,还有vector的迭代器能防止出现类似数组愈界等等。

(3)数组不允许拷贝和赋值,即不能将数组的内容拷贝到其他数组作为其初始值,但是vector可以。

缺点:

(1)在内部进行插入删除,效率较低。

(2)只能在末端进行pop和push。

(3) 当动态长度超过默认分配大小后,要整体重新分配、拷贝和施放。

2.二叉树计算叶子节点算法,时间复杂度。(可使用任一程序设计语言或伪代码,建议先用自然语言描述算法)。

答:主要思想:采用递归算法,先序遍历二叉树的每个结点,如果结点没有左子树和右子树,则叶子结点个数加1。

代码:

Int CountOfLeaf ( BiTree T) //求二叉树叶子结点个数

{

if(!T) return 0;

if (T->lchild==NULL&&T->rchild==NULL)

count++; //如果没有左右孩子,则为叶子结点

CountOfLeaf ( T->lchild); //遍历左子树

CountOfLeaf ( T->rchild);//遍历右子树

return count;

}

int main( BiTree T)

int count=0; //全局变量count表示叶子结点的个数

CountOfLeaf (T);//求二叉树叶子结点个数

return count;

}

时间复杂度为O(n)

2.几乎逆序的数组排序用什么排序算法?写出算法,时间复杂度。

答:前提条件:假定数组原始几乎从大到小排列,要将数组从小到大进行排列主要思想:先将数组先原地倒置,然后再将数组进行冒泡排序。

代码:

Void Reverse( int a[], n) //逆序函数,将数组中的元素原地倒置

{

for(i = 0; i < n/2 ;i++)

{

Swap(a[i],a[n - i - 1]);

}

}

void BubbleSort( int a[],int n) //冒泡排序

{

for(j=0;j

{

int flag=false; //初始化标志位

for(int i=n-1;i>j;i--)

{

if(a[i]

{

swap(a[i],a[i-1]);

flag=true;

}

}

if(flag==false)return; //如果标志为false,则一次循环没有移动元素,得出最终数组

}

}

}

int sort(int a[],int n)

{

Reverse( a, n); //先将原有数组进行原地逆序

BubbleSort(a,n); //再用冒泡排序得出最终结果

}

时间复杂度:原地逆序的时间复杂度为O(n),冒泡排序在基本有序的情况下时间复杂度也为O(n),因此总的时间复杂度为O(n)。

4.二叉排序树的2种优化方法,并且介绍这两种方法是怎样优化二叉排序树的。

①红黑树本质上是一种二叉查找树,但它在二叉查找树的基础上额外添加了一个标记(颜色),同时具有一定的规则。这些规则使红黑树保证了一种平衡,插入、删除、查找的最坏时间复杂度都为O(logn)。

②AVL是最先发明的自平衡二叉查找树算法。在AVL中任何节点的两个子树的高度最大差别为1,所以查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。

第二部分csapp

1.Amdahl性能分析定律,硬件优化趋势

a为并行计算部分所占比例

n为并行处理结点个数

S(N):程序在N个处理器(总核心数)相对在单个处理器(单核)中的速度提升比

当1-a=0时,(即没有串行,只有并行)最大加速比s=n;

当a=0时(即只有串行,没有并行),最小加速比s=1;

当n→∞时,极限加速比s→ 1/(1-a),这也就是加速比的上限。

这个公式说明:

1.增加处理器数、计算负载分布到更多处理器上,可以提高计算速度

2.程序中可并行代码的比例决定你增加处理器(总核心数)所能带来的速度提升的上限2.流水线是怎样提高性能的,会遇到什么问题,解决方法是什么。

(1)指令执行基本分为取指,译码,执行,访存,写回,根据寄存器的特性可以不断的将一个时序过程分解成若干个子过程。

(2)多条指令重叠进行操作,,每个过程都能有效的与其他子进程同时进行。这样可以提高处理器处理效率,争取在一个时钟周期中完成一条指令。







会遇到的问题:

包括数据冒险和控制冒险。

处理数据冒险时:

(1)使用暂停来避免冒险,也就是让指令停留在译码阶段,知道其源操作数的

相关文档
最新文档