算法与数据结构C语言习题参考答案-9章.doc

上传人:钟*** 文档编号:5364253 上传时间:2020-01-27 格式:DOC 页数:6 大小:38.50KB
返回 下载 相关 举报
算法与数据结构C语言习题参考答案-9章.doc_第1页
第1页 / 共6页
算法与数据结构C语言习题参考答案-9章.doc_第2页
第2页 / 共6页
算法与数据结构C语言习题参考答案-9章.doc_第3页
第3页 / 共6页
点击查看更多>>
资源描述
1. 现在有一个已排序的字典,请改写二分法检索算法,使之当排序码key在字典中重复出现时算法能找出第一个key出现的元素下标(用*position来保存)。保持算法时间代价为O(log n)。【答】思路一般的二分法检索算法只要找出关键码key在字典中的一个下标。在比较的过程中,一旦发现相等,记录下当前下标mid就符合要求。程序如下:数据结构字典采用6.1.4节中的顺序表示法。typedef int KeyType;typedef int DataType;二分法检索算法int binarySearch(SeqDictionary * pdic, KeyType key, int * position) int low, mid, high;low = 0;high = pdic-n - 1;while (low elementmid.key = = key) *position = mid; return TRUE; else if (pdic-elementmid.key key) high = mid - 1; else low = mid + 1;*position = low;return FALSE;改写后的算法想要找出关键码key在字典中第一次出现的下标。在比较中,如果遇到相等(key与pdic-elementmid.key相等),则需要分情形讨论。(1)如果当前下标mid等于0,或者key与pdic-elementmid-1.key不等,那么mid一定是key第一次出现的下标,返回mid即可。(2)如果情形(1)不成立,那么mid一定大于等于key第一次出现的下标,需要在low和mid-1之间继续进行搜索,找出key第一次出现的下标。下面算法中,加粗的部分是对原算法的修改。修改后的二分法检索算法int binarySearch1(SeqDictionary * pdic, KeyType key, int * position) /*算法结束后,*position存放key第一次出现的下标*/int low, mid, high;low = 0;high = pdic-n - 1;while (low elementmid.key = = key) if (mid = = 0 | key != pdic-elementmid - 1.key) *position = mid; return TRUE; /*此时mid就是key在字典中第一次出现的下标*/ else high = mid - 1;/*在左半段继续搜索*/ else if (pdic-elementmid.key key) high = mid - 1; else low = mid + 1;*position = low;return FALSE;代价分析该算法的时间复杂度为O(log n)。2. 试编写一算法求出指定结点在给定的二叉排序树中所在的层数。【答】数据结构采用7.1.3节中字典的二叉排序树表示。算法int search_layer(PBinTree pbtree, PBinTreeNode pnode) /*返回二叉排序树*pbtree中结点*pnode所在层数,要求所给结点在树中*/int layer = 0;PBinTreeNode p = *pbtree;while (p != NULL) if (p-key = = pnode-key) return layer;/*查找结点成功,返回层数*/ if (p-key pnode-key) p = p-llink;/*进入左子树继续查找*/ layer+; else p = p-rlink;/*进入右子树继续查找*/ layer+; return -1;/*查找结点失败*/代价分析假设二叉排序树有n个结点,高度是h(n=hkeyvalue1&curnode-keyvalue2) curnode = curnode-llink; else if(curnode-keykeyrlink; else return curnode-key; 4. 设计一个有效的算法,在1000个无序的元素中,挑选出其中前5个最大的元素。【答】数据结构typedef int KeyType;typedef int DataType;typedef struct KeyType key;/* 排序码字段 */ DataType info;/* 记录的其它字段 */RecordNode;typedef struct int n;/* n为文件中的记录个数*/RecordNode *record;SortObject;思路这里不需要整体排序,故选择一种能较快得出最终排序段的前一部分的算法改造即可,如直接选择排序,起泡排序,堆排序都能最先得出前5个最大元素。综合考虑算法的时间代价,选择直接选择排序算法改造即可。算法函数返回一个数组,数组中存着挑出的元素,为动态分配的。RecordNode* Outmax(SortObject *pvector, int out)int i, j, k;RecordNode *outpart;RecordNode temp;if(outpvector-n) printf(the given value is wrong!); return NULL;outpart=(RecordNode*)malloc(out*sizeof(RecordNode);if(outpart=NULL) printf(No space!n); return NULL;for(i=0;iout;i+) k=i; for( j=i+1;jn;j+) if(pvector-recordj.keypvector-recordk.key) k=j; if(k!=i) temp=pvector-recordi; pvector-recordi=pvector-recordk; pvector-recordk=temp; outparti=pvector-recordi;return outpart;代价分析O(n*m) (设从n个元素中选出m个最大元素)。5. 写一个算法来判断对给定有向图中的指定顶点是否至少存在一条有向边指向它。【答】图有三种表示方法:出边表(邻接表的一种),入边表(邻接表的一种)和邻接矩阵。相应的有三种算法。设n为顶点数,m为边数。对于出边表,顺次搜索一遍边即可,时间代价为O(m)。对于入边表,判断指定顶点的边表头指针是否非空即可,时间代价为O(1)。对于邻接矩阵,搜索矩阵中指定顶点对应的列,判断其中是否有非0元即可,时间代价为O(n)。以出边表为例,给出一个算法如下。数据结构采用9.1.3节中有向图的邻接表(出边表)表示法。算法int is_end(GraphList g, int k) /*判断图g中是否有边指向第k个结点(0=k=g.n-1)*/EdgeList p;int i;for ( i = 0;i endvex = = i) return 1; p = p-nextedge; return 0;代价分析该算法的时间复杂度为O(m)。6.设计一个算法,确定(无权)图中每一对结点之间的可达关系。【答】数据结构采用图的邻接矩阵表示法。#define MAXVEX 100typedef char * VexType;typedef int AdjType;typedef struct VexType vexsMAXVEX;/*顶点信息*/AdjType arcsMAXVEXMAXVEX;/*边信息*/int n;/*图的顶点个数*/GraphMatrix;思路这里介绍Warshall算法,该算法解决了(无权)图的可达性问题。算法用到了一个矩阵a(a作为算法的参数之一)。开始时,对矩阵a中元素赋值,使a与图的邻接矩阵相等。这样,矩阵a记录的就是所有直接的边连接。算法的核心部分是一个三重循环。其中外重循环的循环次数为n,每次循环更新a中的元素。循环一次后,a中记录的就是所有直接连接或者只经由结点0而形成的通路的情况。循环k(1kn)次后,a中记录的就是所有至多只经由结点0, 1, , k-1而形成的通路的情况。这样,算法结束时,矩阵a中记录的就是每一对结点之间的可达性信息。aij为1,表示从结点i到结点j是可达的;为0,则表示不可达。算法void warshall(GraphMatrix * pgraph, int aMAXVEX) int i, j, m;for (i = 0; i n; i+)/*对矩阵a中元素赋值,使a与图的邻接矩阵相等*/ for ( j = 0; j n; j+) aij = pgraph-arcsij;for ( m = 0; m n; m+)/*算法的核心部分,一个三重循环*/ for ( i = 0; i n; i+) for (j = 0; j n; j+) aij = aij | (aim & amj);代价分析算法的核心部分是一个三重循环,每重的循环次数为n,因此该算法的时间代价为O(n3)。调试结果该示例程序计算下图的可达性:运行结果如下:0 1 0 1 1 10 0 0 1 1 10 1 0 1 1 10 0 0 0 0 00 0 0 1 0 10 0 0 0 0 0此文档可自行编辑修改,如有侵权请告知删除,感谢您的支持,我们会努力把内容做得更好最新可编辑word文档
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!