admin 管理员组

文章数量: 887053

数据结构

数据三要素----数据的:逻辑结构,存储结构,运算
时间复杂度–将算法中基本运算的执行次数的数量级作为时间复杂度。

顺序表有哪些缺点?(逻辑上相邻的元素,在物理位置上也相邻)
优点:顺序表支持随机存取,存储密度大
缺点:插入和删除元素需要移动大量的元素(近一半)
注意:动态分配内存并不是链式存储结构,依然属于顺序存储结构,支持随机存取方式,只是分配的空间大小在运行时动态决定。

链表有哪些缺点?(逻辑上相邻的元素,在物理位置上不一定相邻)
优点:便于插入删除等操作,只要改变指针就行。不用考虑溢出问题。
缺点:不支持随机存取,查找第i个元素只能从链表的第一个结点出发。

静态链表的数据结构?
答:静态链表是连续存储在一段主存空间上的,它的每个节点除了数据域外,还有一个指针域用来指向下个节点在这个数组的位置。

循环链表的特点
单循环链表:最后一个结点的next指针指向头结点;
双循环链表:最后一个结点的rear指针指向头结点,头结点的front指针指向最后一个结点。
如何逆置一个链表
答:定义一个只含有头结点的链表,依次取下要逆置的链表的各个元素,每次按照头插法插入刚定义的链表中,直到待逆置链表中所有关键字都被插入。最后将待逆置链表的头指针指向新定义的链表的头结点,并将头指针的地址返回出去。

对链表设置头节点的好处是什么?
(1)无论链表是否为空,其头指针是指向头结点的非空指针,故空表与非空表的操作也就统一了。
(2)在链表第一个位置的插入与删除操作与其他位置的操作一致,无需特殊处理。

我们几个人围成一圈,从某个人开始数数,数到3的人OUT,说一下这个算法?
答:这个可以用循环链表实现。
两个有序的链表A,B。如何把B的节点插入A链表,使之仍是有序的表?
答:依次取B链表的节点,与A链表的节点的关键字比较,找到合适的位置插入即可。
你是说每次都从A链表第一个位置开始比较?
答:可以设置一个指针,指向A链表中刚插入元素的位置,以后直接从刚插入位置从前往后查找合适的位置插入即,直到B链所有元素插入到A链中。

两个有序数组拼接为有序数组最少和最多比较几次?
当某个数组的最大元素比另一个数组最小元素小(某个数组的最小元素比另一个数组的最大元素大)时只需要比较一次,即最少比较一次。最多比较两个数组长度中较小值次。min(len a,len b)。

什么是堆?什么是栈?什么是队列?有何区别?举一个队列的例子
队列:只允许在队头删除,在队尾插入的顺序表,队列先进先出eg:排队买饭
栈:只允许在栈顶插入和删除的顺序表,栈后进先出。
堆:堆分为小根堆和大根堆。(1)每个结点都小于它的左右孩子的值—小根堆;(2)每个结点都大于它的左右孩子的值—大根堆;堆又称为优先队列。
循环队列–可以解决假溢出
循环队列:牺牲一个存储单元来区分队空和队满,队空:front指针等于rear指针时;队满:(队尾指针+1)余队列长度等于队头指针;

双端队列–指两端都可以进行入队和出队操作的队列。
受限双端队列–输入受限的双端队列,输出受限的双端队列
输入受限的双端队列:允许在一段进行入队出队,另一端只允许出队操作。
数出受限的双端队列:允许在一段进行入队出队,另一端只允许入队操作。

栈的用法
答:栈的应用有:括号匹配、表达式求值、递归调用、数值转换
括号匹配:
(1)若为左括号则入栈,若为右括号则检查与栈顶元素是否匹配,匹配则将栈顶元素出栈,栈顶指针下移一位。
(2)按照这个规则,一直检查到字符串尾部。
(3)检查栈是否为空,栈空,则这个括号串匹配成功,否则匹配失败。

表达式求值:
(1)中缀—>后缀
(2)从左到右扫描表达式:遇到数字就进栈,遇到符号则将栈顶的两个元素出栈并运算,将结果压回栈中,直到最后得到表达式的结果。

递归函数? 递归调用:
(1)如果一个函数运行过程中又运用到自身,那么这个函数称为是递归定义的。—递归函数中有:递归式,递归边界。可以用栈来实现递归。
(2)递归思想就是把大问题分解成小问题,直到每个小问题都得到解决为止。(1)递归次数有限;(2)有结束条件终止递归;
(3)规模为n的问题可划分为若干结构相同,规模较小的子问题。
队列的应用–树的层次遍历,图的广度优先搜索,基数排序,OS里的缓冲区,就绪队列,阻塞队列等。

矩阵压缩:对多个相同的值,只分配一个存储空间;对零元素不分配空间。压缩存储可将二维矩阵存到一维数组中,对二维数组有行优先、列优先两种存储方式。对特殊矩阵只存储一部分元素。—对称矩阵,上下三角,对角矩阵。

稀疏矩阵
答:如果在矩阵中,多数的元素为0,通常认为:非零元素 / 矩阵所有元素<=0.05,则称此矩阵为稀疏矩阵(sparse matrix)。

树的性质
(1)除根结点外,每个结点都有一条边指向,一条边对应一个度,故结点总数等于总度数加1。
(2)度为m的树中,第i层最多有m^(i-1)个结点。

特殊的二叉树—满二叉树,完全二叉树
满二叉树:即每一层的结点都达到最大值,高度为h的树,有2^h -1个结点。
完全二叉树:高度为h的完全二叉树中,每个结点都与高度为h的满二叉树的编号一一对应。

完全二叉树的性质:
(1)叶子结点只可能出现在层数最大的两层上;
(2)如果有度为1的结点,则该结点只有左孩子,而无右孩子;
(3)一旦出现某个结点为叶子结点,或只有左孩子,则编号大于该结点的均为叶子结点。

知道一棵树的先序和后序能不能确定它?要证明.
答:不能,必须知道中序。这是因为前序遍历和后序遍历序列,可能对应不同的二叉树。 可确定一棵树:(先中、中后、中层)

在后序遍历的线索二叉树中,如何找结点直接前驱?
先把二叉树遍历一遍:即设置两个标记Ltag,Rtag,如果左孩子指针为空,Ltag=1,如果右孩子指针为空,Rtag=1。
建一个队列,按照后序遍历方式将各个结点进行入队,如果Ltag=1(Rtag=1),此时把左(右)孩子指针指回队列里的前(后)一个元素,这个元素就是前驱(后继)节点,然后往队尾依次进行线索化。

在中序线索二叉树中,如何找节点的直接前驱?
建一个队列,按照中序遍历方式将各个结点进行入队,如果Ltag=1,此时把左孩子指针回指队列里的前一个元素,这个元素就是前驱节点,然后往队尾依次进行线索化。

如何在计算机上实现线索二叉树的遍历? 遍历的总体思路:
先找到最左边的节点,然后判断其右子树是否为线索,如果是线索,那么就遍历它,如果右子树是右孩子,那么就进入到右孩子最左边的节点,进行同样的判断,知道遍历完了整棵树为止。
线索二叉树
在二叉树中希望很快找到某一节点的前驱或后继,但不希望每次都要对二叉树遍历一遍,因此在创建二叉树的过程中,需要将每个结点的前驱和后继记录下来。
为了区分:左指针指向的是左孩子结点还是前驱结点,右指针指向的是右孩子结点还是后继结点,所以增加了两个线索标志位来区分这两种情况:
ltag = 0;指向结点的左孩子
ltag = 1;指向结点的前驱
Rtag = 0;指向结点的右孩子
Rtag = 1;指向结点的后继
结点中指向前驱和后继结点的指针称为线索,加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式使其变为线索二叉树的过程称为线索化。

树是否可以用顺序存储? 是否可以链式存储?
顺序存储:树的双亲表示法。采用一组连续空间来存储各个结点,同时在每个节点中增设一个指针域,用来指示其双亲结点在数组中的位置。
链式存储:
1.孩子表示法:即邻接表存储结构
2.孩子兄弟表示法:数据结构: (1)指向结点第一个孩子的指针 (2)结点值
(3)指向结点下一个兄弟结点的指针

树的遍历种类,确定一棵树的方法?
树的遍历种类:先序遍历和后序遍历
树的先序对应二叉树的先序,树的后序对应二叉树的中序。
确定一棵二叉树:(先中)、(中后)、(中层)

树转二叉树(孩子兄弟表示法):
每个结点的左指针指向它的第一个孩子,右指针指向它在树中的相邻兄弟结点。
二叉树转森林:依次断开二叉树的右孩树,直到产生一棵没有右子树的二叉树为止,就得到了原森林。

二叉排序树:
(1)若左子树非空,则左子树上所有结点的关键字值均小于根节点关键字值;
(2)若右子树非空,则右子树上所有结点的关键字值均大于根节点关键字值;
(3)左右子树本身也是一棵二叉排序树。
二叉排序树的查找—与折半查找类似----折半查找判定树为一棵二叉排序树
(1)从根节点出发,将给定值与根节点比较,若相等则查找成功。
(2)待查找的关键字大于根节点,在右子树查找;
(3)待查找的关键字小于根节点,在左子树查找;
平衡二叉树(左右子树高度差 ≤ 1,平衡因子的绝对值 ≤ 1)
插入结点失衡:LL(右单旋),RR(左单旋).LR(左右双旋),RL(右左双旋)
说一说哈夫曼树?
哈夫曼树是带权路径长度之和最小的树,权值较大的结点离根较近,权值越小的离根节点越远。
哈夫曼树的构造过程:将N个结点看成N棵仅含一个结点的树,构成森林F,构造一个新的结点,结点的左右子树为森林F中权值最小的两棵树,结点的权值为左右子树的权值之和。在森林F中将刚选出的两棵树删除,同时将新构造的树插入。依次进行这个步骤,直到最后只剩下一棵树为止。
哈夫曼树的特点?
(1)权值较大的结点离根较近,权值越小的离根节点越远。
(2)哈夫曼树的带权路径长度之和最小。
(3)哈夫曼树不存在度为1的结点。
(4)哈夫曼树形态不唯一,但带权路径长度唯一。

哈夫曼树的优表现在哪?
带权路径长度之和最小,权值越大的结点离根越近,权值越小的结点离根节点越远。哈夫曼编码是前缀编码,利用哈夫曼树可以设计出总长度最短的二进制前缀编码。

大概的编码过程?
编码是信息从一种形式转换为另一种形式的过程。用预先规定的方法将文字、数字或其它数据编成数码。解码,是编码的逆过程。将代码译为原数据形式。
例如哈夫曼编码的大概过程,首先是将要编码的信息调整为一棵哈夫曼树,在哈夫曼树左子树编码为0或1,右子树编码为1或0。某个元素的编码就是从根结点到自身所经过的路径上的01代码串。
m阶B树:
根节点至少有两颗子树(一个关键字)
除根结点外的非叶结点至少有m/2向上取整棵子树,最多有m棵子树
B树中n个结点有n+1个分支。叶结点在同一层且不带信息。
m阶B+树:
根节点至少有两棵子树,其他分支结点至少有m/2向上取整棵子树
每个分支结点最多有m棵子树
B+树中,n个结点有n个分支,每个非叶结点仅起到索引的作用,B+树的叶子结点包含全部关键字,B+树有一个指向最小关键字的指针。

有向图和无向图的联系,试各举一例说明?
无向图可以看作每条边都有两个方向的有向图,无向图的邻接矩阵一定是对称阵,而有向图的邻接矩阵不一定对称。(强连通图才对称:i到j有路径,j到i有路径)
实际应用的区别是有向图可以描述非对称的关系,但无向图不能。比如我认识奥巴马,但是他不认识我,用图来表示这个关系时就将我和奥巴马之间连一条线,并且弧头指向他。
无向图能解决的问题都能用有向图表示,但无向图在对称的问题上往往更容易,因为用有向图去表示无向图时需要用两倍的边数。

稀疏图:E<V logV时为稀疏图

连通、连通图、连通分量:----无向图
(1)从顶点i到j有路径存在,则称i和j是连通的。
(2)若图中任意两个顶点都是连通的,则称该图为连通图,否则为非连通图。(3)无向图的极大连通子图称为连通分量。

强连通、强连通图、强连通分量:—有向图
(1)有向图中,从顶点i到j,顶点j到i都有路径存在,则称i和j是强连通的。
(2)图中任意一对顶点都是强连通的,则称该图是强连通图。
(3)有向图的极大连通子图称为强连通分量。

完全图
无向完全图:任意两个顶点间都有边存在,n个顶点,有n(n-1)/2条边。
有向完全图:任意两个顶点间都有方向相反的两条弧存在,n个顶点,有n(n-1)条有向边

数据结构中图的存储, ---------邻接矩阵、邻接表

什么情况下用邻接表,什么情况下用邻接矩阵。为什么?
答:稠密图一般用邻接矩阵,因为图稠密的话,用邻接矩阵,编程简单还相对省空间。稀疏图一般用邻接表。
时间复杂度:邻接矩阵o(n^2),邻接表o(边+顶点)

邻接矩阵和邻接表的优缺点?
答:邻接矩阵优缺点:很容易确定图中任意两个顶点之间是否有边相连,但要确定图中有多少条边必须按行、按列对每个元素进行遍历,代价很大。
邻接表优缺点:很容易找到任一顶点的所有边,但要确定任意两个顶点i和j之间是否有边或弧,则需要遍历第i或第j个链表,代价很大。
有向图中邻接矩阵中入度和出度的定义
邻接矩阵中顶点i所在行(列)中1的个数为出度(入度)。
生成树
连通图的生成树是包含图中全部顶点的极小连通子图。若有n个顶点则有n-1条边。如果在生成树上减去一条边会变为非连通图,添加一条边,会形成一个环。
生成森林:
在非连通图中,各个连通分量的生成树,构成了非连通它的生成森林。
什么是最小连通图?-----生成树
答:首先,子图是连通的,用边把极小连通子图中所有结点连接起来,连接时要求不能出现环。若有n个结点,则有n-1条边。“极小”是指边尽量少的连通子图,去掉任何一个边都会使其变为不连通。
如何产生最小连通图?
可以通过广度优先搜索或深度优先搜索遍历图,调用BFS或DFS的次数就是连通分量数也即有几个连通图。在每个连通分量中依次将顶点加入,并以边连接,边的连接过程要求不能出现环。在每个连通分量中,若有m个顶点,则有m-1条边。当然,也可以考虑使用prim或克鲁斯卡尔算法。
什么是最大连通图? 极大连通子图:
设G(v,e)是连通图,G’(v’,e’)是连通图,如果对于v’等于v,e’包含于e,那么G’叫G的极大连通子图。
(1)连通图只有一个极大连通子图,就是它本身。
(2)非连通图有多个极大连通子图。每个连通分量都是一个连通图。
(3)极大是指,如果加入任何一个不在图的顶点都会导致它不再连通。
图的遍历: BFS,DFS
BFS:-(队列)–类似于二叉树的层次遍历+访问数组标记技术
(1)访问起始顶点V1,并标记数组;
(2)依次访问与V1相邻且未被访问的顶点w1,w2…wi,并标记数组;
(3)再从w1,w2…wi出发,选择与之相邻但未被访问的顶点,并被标记数组;直到所有与V1有路径相通的顶点都被访问到。
(4)选择另外一个未被访问过的顶点V2作为起始顶点,访问并标记,重复这个步骤,直到所有顶点都被访问。

DFS:-栈–类似于二叉树的先序+访问数组标记技术
(1)访问起始顶点V1,并标记数组;
(2)从V1出发,选择与V1相邻且未被访问过的任一顶点V2,并标记数组;
(3)再从V2出发,选择与V2相邻且未被访问过的顶点V3,并标记数组。重复这个步骤;
(4)当不能继续向下访问时,依次回退到最近访问的顶点,若它还有顶点未被访问,则访问该顶点,并标记。重复这个过程,直到图中所有顶点都被访问。
怎么能够判断判断一个图是连通还是非连通的? (可通过图的遍历)
答:采用图的深度遍历法,从其中一个结点v出发,直至所有与v有路径相通的结点都被访问到。若此时图中所有点都被访问过,则该图是连通图,反之,说明还有其他连通分量,该图不是一个连通图。
求最小生成树的算法
答:主要有两种:克鲁斯卡尔(Kruskal)算法和普里姆(Prim)算法。
普里姆
从任意一个顶点出发,选择与该顶点相连且代价最小的边加入边集,同时将该边对应的顶点加入顶点集,从顶点集出发,选择与该顶点集中的顶点相连,代价最小,并且加入该边后不构成回路的边—加入边集,同时将该边对应的顶点加入顶点集,重复这个过程,直到所有的顶点都被加入。就构成了一棵最小生成树。
克鲁斯卡尔
不断选取当前未被选取的权值最小的边,如果加入该边后不构成回路,则将该边加入,同时将该边对应的顶点加入生成树。重复这个过程,直到n个结点选出n-1条边。就构成了一棵最小生成树。

单源最短路径? //迪杰斯特拉算法
单源最短路径:从给定源点到其他各顶点的最短路径。
思想:加入顶点k之后,若有新的路径使得源点到顶点j的路径变短,就将源点到顶点j的路径长度修改为较小的那个值。

任意两个节点的最短路径?//弗洛伊德算法
答:对于任意两个顶点i和j,逐步尝试在原路径中加入顶点k作为中间节点,加入中间节点后,得到的路径长度变小了,则以此作为顶点i和j之间的新路径。

拓扑排序
从AOV中,选择一个入度为0的顶点输出,然后删去此顶点,并删除与此顶点相连的所有边,重复这个过程,直到找不到入度为0的顶点为止。
二叉树与离散数学中关系紧密,把偏序全序化,就是二叉树线索化,知道什么是偏序吗?
偏序:对于关系R只有部分元素成立
全序:对集合中任意两个元素都满足关系R。
例如:
集合的包含关系就是偏序,因为两个集合可以互不包含;
实数中的大小关系是全序,因为两个实数必有一个大于等于另一个。
偏序关系转化为全序关系的算法是什么 ----拓扑排序

AOV中怎么判断是否有回路
在AOV网中,可以通过拓扑排序的方法判断是否有回路。经拓扑排序,全部顶点被输出,则无回路。否则说明有回路。

有向无环图在实际生活中的应用例子?(AOV网
完成一个工程时,各个活动完成的先后顺序。可以看成是有向无环图的一个例子。

AOE网的始点和终点是什么?正常的AOE网只有一个始点和终点吗?
分别是源点和汇点,正常的AOE网只能有一个始点和一个终点。在AOE网中有向带权图中若以边表示活动,顶点表示事件,边上的权值表示该活动的持续时间。

关键路径:在无环的AOE网中从源点到汇点,具有最大路径长度的路径称为关键路径。关键路径上的活动为关键活动。关键活动的最早发生时间和最晚发生时间是一样的。
关键路径为什么不能出现回路?

树和图之间的区别?
答:树是一对多关系,图是多对多的关系
树是图的子集
树有一个根节点,图没有
树可以递归遍历,图要看情况
树是一种“层次”关系,图是“网状”关系。

二分查找? 折半查找
设置一个low指针,和high指针,mid指向(low+high)/2,待查找元素大于mid所指的值,则在后半部分查找,即low=mid+1;
待查找元素小于mid所指的值,则在前半部分查找,即high=mid-1;
优点:是比较次数少,查找速度快,平均性能好;
缺点:是要求待查找表为有序表,且插入删除困难。
因此,折半查找适用于不经常变动而查找频繁的有序列表。

什么是哈希表?如何构建哈希表?在构建哈希表过程中,会遇到什么问题,如何解决?
(1)哈希表(散列表),是将关键字通过哈希函数映射到内存中的某个地址。这样得到的表称为哈希表。
(2)哈希表的构建,把关键字通过一个哈希函数转换成一个地址,并将关键字值存入数组的相应位置。(除留取余法,平法取中法,数字分析法,分段叠加法)。
(3)在构建哈希表的过程中可能遇到冲突,解决冲突的方法有—开放定址法,再散列法,链地址法(将同义词存储到同一个链表中)。
串:字符串简称串,在计算机上非数值对象的处理基本都当字符串数据。串是由零个或多个字符组成的有限序列。
串的模式匹配:
子串的定位就叫做串的模式匹配,它是求子串在主串中的位置。串的模式匹配的算法有KMP算法。
插入排序:每次将一个待排序的关键字,按其关键字的大小插入到已排好序的子序列中。
希尔排序:按照增量d,将待排序列分割成若干子表,分别对子表直接插入排序,且缩小增量d,直到整个表基本有序时,再对全体记录进行一次直接插入排序。
冒泡排序:从前往后(从后往前)两两比较相邻的元素,若为逆序则交换,直到序列比较完,称一趟冒泡排序。最多进行n-1趟冒泡排序即可完成排序。
----每次至少确定一个元素在最终位置;
快速排序:选取任意一个元素作为枢轴,一趟排序后,将表划分为比枢轴小的左子表和比枢轴大的右子表,之后按这个排序方法,分别递归调用左右子表。
----每次至少确定一个元素在最终位置;
简单选择排序:每趟排序,都选择关键字最小的元素,加入到已有序的序列中,直到完成排序为止。----每次确定一个元素在最终位置;
堆排序:建堆o(n),调堆o(logn),输出根节点,将最后一个关键字换到根节点位置,之后调堆,输出根节点,依次进行下去,直到排序完成。
----每次确定一个元素在最终位置;
归并排序:将待排序列,看成n个有序子表,然后两两归并,在两两归并,依次进行下去,直到完成排序。
基数排序(多关键字排序思想):基于关键字各数值位的大小进行排序–借助,分配与回收两种操作。
计数排序的基本思想
(1)对于数组中的任意元素x,只要知道在这个数组中比x小的元素的个数i,那么我们就可以直接把x放到(i+1)的位置上。这就是计数排序的基本思想。
(2)计数排序的一个重要性质就是稳定性。

桶排序的基本思想
桶排序将[0,1)区间划分为n个同样大小的子区间,这些子区间被称为桶。将n个输入元素分别放入各自的桶中。然后对各个桶中的数据进行排序,最后遍历每个桶,依次把各个桶中的元素输出即可。

堆排序的思想是什么?
答:在堆中根节点为最大或最小元素,每次将根结点输出后以最后一个结点来取代根节点位置,调堆。依次进行下去,直到输出所有元素。
小根堆:每个结点的值都小于它左右孩子的值;
大根堆:每个结点的值都大于它左右孩子的值。
调堆:从第一个可能需要调堆的非叶结点—N/2向下取整—的左右孩子开始检查,依次对非叶结点进行调堆。
堆排序、快速排序和归并排序,哪个辅助存储空间最少,哪个平均速度最快,哪个稳定?
答:稳定性:快些选堆美女聊聊—快排,希尔,选择,堆排序–不稳定
复杂度:快些以nlogn的速度归队–快排,希尔,归并,堆排序–nlogn
直接插得冒泡n^2 ----直接插入,冒泡----n^2
辅助空间:快速logn ,归并 n 堆 1
答:辅助空间最小的是堆排序,平均速度最快的是快速排序,快排和堆排序不稳定,归并排序稳定。
给你一个很长的数组,怎么找出最大最小,效率要高,还有比较次数,
(1)可以考虑使用堆排序,找最大则建立大根堆,找最小则建立小根堆。建堆的时间复杂度为o(n),调堆为o(logn),故找到最大最小的时间复杂度为o(nlogn),比较的次数为树的高度log(n+1)向上取整。
(2)也可以考虑使用快速排序,但由于数组的长度很长,虽然快排找最大最小的时间复杂度也为o(nlogn),但比较次数可能比堆排序的次数多。
分治法
将一个规模为N得问题,分解为若干个子问题,这些子问题相对独立且与原问题的形式相同。递归的解决这些子问题,最后将各个子问题的解合并就得到原问题的解。
eg:数据结构(折半排序,归并排序,希尔排序)
二路归并的实质是什么?
答:分治法思想,将一个规模较大的问题,划分为若干个规模为2的子问题,将各个子问题排序后,完成一趟归并。再将子问题两两归并,依次进行下去。直到完成排序。
贪心算法? 背包问题
答:贪心算法,总是做出在当前看来是最好的选择。也就是说,不从整体最优上来考虑,他所做出的是局部最优解。即求解第i个元素时,只与第i-1个元素有关。
-贪心算法的列子:os(短进程优先、最短寻道时间优先)
数据结构(最短路径(djstl)、最小生成树(prim、kruskal)、哈夫曼编码)
动态规划算法,典型运用? 0 1背包问题
答:多阶马尔科夫模型:对于第i个元素,需要考虑从1到n-1个元素才能完成推理。
基本思想与分治法类似,也是将待求解的问题分解为若干个子问题,按顺序求解子问题,前一子问题的解,为后一子问题的求解提供依据。
求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

分治法与动态规划的区别?
动态规划与分治法最大的差别是:动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上的)。

数组、广义表和线性表有什么联系和区别?
(1)数组是编译语言自带的一种复合数据类型。
(2)广义表和线性表都被定义为一个有限的序列(a1,a2,a3,…,an)。只不过线性表中ai被限定为单个元素,而广义表中ai可以是单个元素,也可以是一个子广义表。
(3)线性表可以用数组这种顺序存储结构来表示,也可以用链表来表示。而广义表一般只能用链表来表示。

广义表深度的计算:
(1)广义表长度:表中最上层元素的个数
(2)广义表深度:表中括号的最大层数。(需要展开子表)

怎样防止出现环?
答:RIP水平分割,OSPF算法可避免路由环路。

计算机组成原理

冯诺依曼计算机
(1)存储程序的思想,将编写好的程序存放到计算机主存中,按其在主存中的首地址执行程序的第一条指令,以后就顺序执行其他指令,直到程序执行结束。
(2)计算机分为:运算器,控制器,存储器,输入,输出设备五大部件。
(3)指令由操作码和地址码组成。
(4)冯诺依曼机器以运算器为中心。

计算机三个级别的语言
(1)机器语言:计算机唯一可以直接识别和执行的语言。
(2)汇编语言:助记符-用英文单词来代替二进制的指令代码。
(3)高级语言:需经过编译程序编译成汇编语言,然后经过汇编得到机器语言。

编译和解释? 编译器和解释器的区别?
(1)编译:把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;------eg:C语言代码被编译成二进制代码(exe程序),然后在windows上执行。
(2)解释:在执行程序时,解释一条代码为机器语言,随后执行一条解释好的机器语言,即解释一条,执行一条。所以运行速度是没有编译后的程序运行得快。
-------eg:PHP,JavaScript就是典型的解释性语言。
编译程序的结构?
编译程序也称为编译器,指把高级语言的源程序,翻译成等价的机器语言的格式。编译过程分为分析和综合两个部分,并进一步划分为—语法分析、语义分析、词法分析、代码优化、内存分配和代码生成等步骤。
(1)高级语言----(编译)—汇编语言—(汇编)—机器语言
(2)高级语言----(编译)—机器语言

海明码:
(1) 为了纠正一位错误,在n位有效信息中,要用k位校验位。应满足:2^k>=n+k+1;
(2) 为了校验两位错,就需要再增加一位校验位,即k+1位。
数据的存储方式------大端、小端
(1)大端方式:先存放高位字节,在存放低位字节。
(2)小端方式:先存放低位字节,在存放高位字节。
C语言中结构体存储的边界对齐方式应满足
(1)存储成员的起始地址%成员的长度=0;
(2)结构体的长度为最大成员长度的整数倍。

说说计算机编码那些
答:原码,补码,反码,移码
原码:将十进制数转为二进制数,最高位存放符号(0为正,1为负)。这就是机器数的原码。
反码:正数的反码与原码相同,负数的反码符号位不变,数值部分按位取反。
补码:正数的补码与原码相同,负数的补码符号位不变,数值位按位取反,末位加1。----计算机中的定点整数一般用补码表示。
移码:[X]移=X+偏置值

补码和反码什么区别,什么情况用。
区别:负数时,符号位不变,数值位按位取反,为反码,而补码要在末位加1。
反码:解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则;
补码:解决负数加法运算正负零问题,弥补了反码的不足。

移码什么时候用的,有什么好处或作用。IEEE 754中阶码为移码,尾数为原码
移码常用于浮点数的运算中,在IEEE 754标准中,用移码表示一个浮点数的阶码。 真值=(-1)^s * 1.m * 2^E-127;
作用:(1)可较直观的判断两个二进制数的大小,(2)可用于简化浮点数的运算。(3)一般用做浮点数的阶码,能保证浮点数的机器码为全0。
加法器怎么实现减法和加法-------直接用补码就行了
补码减法的原理
原理:减法运算要化为加法来做。
[x-y]补=[x]补+[-y]补;
[-y]补:在y的原码基础上。连同符号位一起按位取反,末位加1。
原码转补码时要注意什么,如B和-B转补码时要注意什么。
答:要注意B有可能是负数-B就成正数了,由正数的补码与原码相同,那么-B的补码就和-B的原码一致。

计算机的乘法运算是怎么做的?除法运算呢?
答:通过加减法和移位来实现的;把除法转成乘法,乘法转成加法,减法也转成加法。在计算机中左移一位表示乘2,右移一位表除2。
除转乘:除2相对于乘二分之一。

计算机组成原理关于溢出?
单符号位法:参加运算的两个数的符号相同,结果又与原操作数的符号不同,则表示结果溢出。
双符号位法:运算结果的两个符号位相同则表示未溢出,两个符号位不同表示溢出。10表示下溢(当机器0),01表示上溢(中断);00,11未溢出。
符号位和进位法:符号位的进位与最高数位的进位相同,表示没有溢出。否则溢出。

机器数算术移位
正数:原码、反码、补码添0即可。
负数:原码添0,反码添1;补码,左移添0,右移添1。
逻辑移位:将操作数视为无符号数:不管左移、右移都添0.

浮点数的运算过程
(1)对阶:小阶向大阶看齐,–阶小的尾数右移一位,阶码加一,直到两个数阶码相等为止。
(2)尾数求和:将尾数相加减。
(3)规格化: 尾数大于0,需左规:尾数左移一位,阶码减一;
尾数小于0,需右规:尾数右移一位,阶码加一。—最多一次
(4)舍入: 0舍一入法:移去最高数值位为0,则舍弃,否则末位加一。
恒置1法:不论舍弃的最高数值位为0或1,尾数末位恒置为1。
(5)溢出判断。

存储器
(1)按存储器的使用类型可分为(ROM)和(RAM),它们都属于半导体存储器,都采用随机存取存储方式访问数据,ROM是只读类型的。RAM又分为SRAM(静态随机存取存储器)和DRAM(动态随机存取存储器)。
(2)ROM属于非易失性,RAM为易失性。
(3)SRAM:速度快,非破坏性读出,不需要刷新,常用作Cache;DRAM:速度较SRAM慢,破坏性读出,需要刷新,常作为主存。

什么是存储元,什么是存储单元,什么是存储单元地址区别和联系?
(1)存储元:是存储器的最小存储单元,用来存放一位二进制代码0或1。
(2)存储单元:由若干存储元组成,可存放一个独立的二进制代码。存储单元具有存储或读写数据的功能。
(3)储单元地址:计算机中的存储器往往有成千上万个存储单元,为了存取数据不发生混淆,必须给每个存储单元一个唯一的编号。这个编号就是存储单元地址。
MMU Memory Management Unit是什么及作用?
MMU(Memory Management Unit)内存管理单元,它是CPU中用来管理虚拟存储器、物理存储器的控制线路,同时也负责将虚地址映射为实地址。

机器字长、存储字长、指令字长?
(1)机器字长:处理器一次能处理的二进制代码位数—一般等于CPU寄存器的位数。
(2)存储字长:一个存储单元能存储二进制代码的位数,即MAR,MDR,PC的位数。
(3)指令字长:计算机机器指令所占的位数。
内存的扩展方式?
字扩展:增加存储字长。
位扩展:增加存储单元的数量。
字位扩展:既增加存储字长,又增加存储单元的数量。

低位交叉存储器:
(1)低位地址为体号,高位地址为体内地址;
(2)每个模块都有相同的容量和存取速度;
(3)程序被连续的存放在相邻的体中。
(4)采用低位交叉存储后,可以采用流水线技术,提高存储器的带宽。

说一说Cache, Cache的原理—局部性原理
(1)Cache是介于CPU和主存之间的高速缓冲存储器。CPU在访问数据时,首先判断所要访问的内容是否在Cache中。如果cache命中,此时CPU直接从Cache中调用该内容;否则,CPU从内存中调用所需的数据。
(2)CPU可以直接从Cache中读数据,也可以直接往Cache中写数据。CPU和Cache之间通常一次传送一个字块,字块的长度是一个主存周期能存取信息的长度。
(3)高速缓存的出现就是为了缓解CPU和主存之间的速度矛盾,提高CPU的利用率,进而使整个系统的性能得以提升。

内存和cache有什么区别? cache与主存的关系怎样?
(1)内存,是存储器,用于暂存CPU中的运算数据,及与硬盘等外部设备交换数据;Cache,是一种特殊的内存。内存主要由DRAM和只读存储器ROM组成,Cache主要由SRAM组成。
(2)CPU主频很高,运算速度很快;主存速度相较于CPU很慢,如果直接把主存与CPU连接,会造成CPU花很大一部分时间来等待主存存取数据,导致CPU的效率降低,所以需要高速的Cache来缓解CPU与主存的速度矛盾。

Cache和虚拟存储器结构的区别?
相同点:(1)基于局部性原理,把最近经常所有的部分常驻高速存储器中。
(2)都力图使存储系统的性能接近高速设备。
不同点:
(1)Cache是介于CPU和主存之间的高速缓冲存储器;虚拟存储器是介于主存和辅存之间的高速缓冲存储器。
(2)Cache用全硬件实现,虚拟存储器在主存和辅存之间用软件实现。
CPU和Cache之间通常一次传送一个字块,字块的长度是一个主存周期内能存取信息的长度。
(3)Cache是一种物理存储器,虚拟存储器是一种逻辑存储器
CPU —cache —主存 cpu-主存—辅存 的异同?
(1)cpu-cache-主存:利用cache缓和了CPU与主存储器的速度矛盾。cpu -cache-主存结构速度接近于cache,但容量接近于主存,价格接近于主存,解决了速度与成本的矛盾。
(2)cpu-主存-辅存:利用主存缓解了,高速CPU与慢速的辅存之间的速度矛盾。cpu-主存-辅存结构速度接近主存,容量接近辅存。解决了大容量低成本的矛盾。

组成原理的内存地址映射的问题
答:Cache与主存的映射方式有:直接映射,全相联映射,组相联映射。
(1)直接映射:主存中的块只能根据地址中的某些字段,映射到cache的某个特定的位置。
(2)全相联映射:只要cache有空位,就将主存中的某个块映射过去。(分组为1的组组相联映射)。
(3)组相联映射:主存中的块只能根据地址中的某些字段,映射到cache的某个特定的组中(cache的某几块中)。

Cache的写策略–全写法(写直通法),写回法
(1)全写法:CPU对Cache写命中时,必须同时将数据写回Cache和主存。
优:能随时保持主存中数据的正确性;缺:增加了访存次数。
(2)写回法:CPU对Cache写命中时,只修改Cache的内容,而不立即写回主存,只有当此块被换出时才写回主存。这种方法,减少了访存次数,但存在数据不一致的隐患。
指令格式:操作码,寻址特征,形式地址。
寻址方式有哪些?
寻址方式有直接寻址,一次间址,寄存器寻址,寄存器间接寻址,相对寻址,基址寻址,变址寻址等。
(1)直接寻址:指令中的形式地址为操作数的有效地址。
(2)一次间址:指令中的形式地址对应的内存中所存的内容为操作数的有效地址
(3)寄存器寻址:直接给出操作数所在寄存器的编号。速度快,不访存。

什么是寻址?相对寻址、基址寻址,变址寻址是什么,作用是什么?
寻址简单的说是磁头在盘片上定位数据的一个过程。
相对寻址:程序计

本文标签: 计算机