已阅读5页,还剩64页未读, 继续免费阅读
《数据结构与算法分析C语言描述第二版》答案英文版.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
data structures and algorithm analysis in c (second edition) solutions manual mark allen weiss florida international university preface included in this manual are answers to most of the exercises in the textbook data structures and algorithm analysis in c, second edition, published by addison-wesley. these answers refl ect the state of the book in the fi rst printing. specifi cally omitted are likely programming assignments and any question whose solu- tion is pointed to by a reference at the end of the chapter. solutions vary in degree of complete- ness; generally, minor details are left to the reader. for clarity, programs are meant to be pseudo-c rather than completely perfect code. errors can be reported to weissfi . thanks to grigori schwarz and brian harvey for pointing out errors in previous incarnations of this manual. table of contents 1. chapter 1: introduction .1 2. chapter 2: algorithm analysis .4 3. chapter 3: lists, stacks, and queues .7 4. chapter 4: trees .14 5. chapter 5: hashing .25 6. chapter 6: priority queues (heaps) .29 7. chapter 7: sorting .36 8. chapter 8: the disjoint set adt .42 9. chapter 9: graph algorithms .45 10. chapter 10: algorithm design techniques .54 11. chapter 11: amortized analysis .63 12. chapter 12: advanced data structures and implementation .66 -iii- chapter 1: introduction 1.3because of round-off errors, it is customary to specify the number of decimal places that should be included in the output and round up accordingly. otherwise, numbers come out looking strange.we assume error checks have already been performed; the routine separate? is left to the reader. code is shown in fig. 1.1. 1.4the general way to do this is to write a procedure with heading void processfile( const char *filename ); which opens filename,? does whatever processing is needed, and then closes it. if a line of the form #include somefile is detected, then the call processfile( somefile ); is made recursively. self-referential includes can be detected by keeping a list of fi les for which a call to processfile? has not yet terminated, and checking this list before making a new call to processfile.? 1.5(a) the proof is by induction. the theorem is clearly true for 0 x? 1, since it is true for x? = 1, and for x? 1, log x? is negative. it is also easy to see that the theorem holds for 1 x? 2, since it is true for x? = 2, and for x? 2, log x? is at most 1. suppose the theorem is true for p? x? 2p? (where p? is a positive integer), and consider any 2p? y? 4p? (p? 1). then log y? = 1 + log (y? / 2) 1 + y? / 2 y? / 2 + y? / 2 y?, where the fi rst ine- quality follows by the inductive hypothesis. (b) let 2x? = a?.then a?b? = (2x?)b? = 2xb?.thus log a?b? = xb?.since x? = log a?, the theorem is proved. 1.6(a) the sum is 4/3 and follows directly from the formula. (b) s? = 4 1_ + 42 2 _ _ + 43 3 _ _ + . . . . 4s? = 1+ 4 2_ _ + 42 3 _ _ + . . . . subtracting the fi rst equation from the second gives 3s? = 1 + 4 1 _ + 42 2 _ _ + . . . . by part (a), 3s? = 4/ 3 so s? = 4/ 9. (c) s? = 4 1_ + 42 4_ _ + 43 9_ _ + . . . . 4s? = 1 + 4 4 _ _ + 42 9_ _ + 43 16_ _ + . . . . subtracting the fi rst equa- tionfromthesecondgives3s? = 1+ 4 3_ _ + 42 5 _ _ + 43 7 _ _ + . . . . rewriting,weget 3s? = 2 i?=0 4i? i_ _ + i?=0 4i? 1 _ _. thus 3s? = 2(4/ 9) + 4/ 3 = 20/ 9. thus s? = 20/ 27. (d) let sn? = i?=0 4i? i?n? _. follow the same method as in parts (a) - (c) to obtain a formula for s n? in terms of sn?1, sn?2, ., s?0and solve the recurrence. solving the recurrence is very diffi cult. -1- _ _ _ _ double roundup( double n, int decplaces ) int i; double amounttoadd = 0.5; for( i = 0; i decplaces; i+ ) amounttoadd /= 10; return n + amounttoadd; void printfractionpart( double fractionpart, int decplaces ) int i, adigit; for( i = 0; i decplaces; i+ ) fractionpart *= 10; adigit = intpart( fractionpart ); printdigit( adigit ); fractionpart = decpart( fractionpart ); void printreal( double n, int decplaces ) int integerpart; double fractionpart; if( n 0 ) putchar(.); printfractionpart( fractionpart, decplaces ); fig. 1.1. _ _ _ _ 1.7 i?=?n?/ 2? n i 1 _ = i?=1 n i 1 _ i?=1 ?n?/ 2 1? i 1 _ ln n? ln n?/ 2 ln 2. -2- 1.824 = 16 1 (mod? 5). (24)25 125 (mod? 5). thus 2100 1 (mod? 5). 1.9(a) proof is by induction. the statement is clearly true for n? = 1 and n? = 2. assume true for n? = 1, 2, ., k?. then i?=1 k?+1 fi? = i?=1 k fi?+fk?+1. by the induction hypothesis, the value of the sum on the right is fk?+2 2 + fk?+1= fk?+3 2, where the latter equality follows from the defi nition of the fibonacci numbers. this proves the claim for n? = k? + 1, and hence for all n?. (b) as in the text, the proof is by induction. observe that + 1 = 2. this implies that 1 + 2 = 1. for n? = 1 and n? = 2, the statement is true. assume the claim is true for n? = 1, 2, ., k?. fk?+1 = fk? + fk?1 by the defi nition and we can use the inductive hypothesis on the right-hand side, obtaining fk?+1 k? + k?1 1k?+1 + 2k?+1 fk?+1 (1 + 2)k?+1 k?+1 and proving the theorem. (c) see any of the advanced math references at the end of the chapter. the derivation involves the use of generating functions. 1.10 (a) i?=1 n (2i?1) = 2 i?=1 n i? i?=1 n 1 = n?(n?+1) n? = n?2. (b) the easiest way to prove this is by induction. the case n? = 1 is trivial. otherwise, i?=1 n?+1 i?3 = (n?+1)3 + i?=1 n i?3 = (n?+1)3 + 4 n?2(n?+1)2_ = (n?+1)2? ? ? ? 4 n?2_ + (n?+1)? ? ? = (n?+1)2? ? ? ? 4 n?2 + 4n? + 4_? ? ? = 22 (n?+1)2(n?+2)2 _ _ = ? ? ? ? 2 (n?+1)(n?+2) _? ? ? 2 = ? ? ? ?i?=1 n?+1 i? ? ? ? 2 -3- chapter 2: algorithm analysis 2.12/n?, 37,?n?, n?, n?log log n?, n?log n?, n?log (n?2), n?log2n?, n?1.5, n?2, n?2log n?, n?3, 2n?/ 2, 2n?. n?log n? and n?log (n?2) grow at the same rate. 2.2(a) true. (b) false. a counterexample is t?1(n?) = 2n?, t?2(n?) = n?, and ?f?(n?) = n?. (c) false. a counterexample is t?1(n?) = n?2, t?2(n?) = n?, and ?f?(n?) = n?2. (d) false. the same counterexample as in part (c) applies. 2.3we claim that n?log n? is the slower growing function. to see this, suppose otherwise. then, n?/ ? log n? would grow slower than log n?. taking logs of both sides, we fi nd that, under this assumption, / ? ? log n?log n? grows slower than log log n?. but the fi rst expres- sion simplifi es to ? ?log n?. if l? = log n?, then we are claiming that ?l? grows slower than log l?, or equivalently, that 2l? grows slower than log2 l?.but we know that log2 l? = (l?), so the original assumption is false, proving the claim. 2.4clearly, logk?1n? = (logk?2n?) if k?1 k?2, so we need to worry only about positive integers. the claim is clearly true for k? = 0 and k? = 1. suppose it is true for k? i?. then, by lhospitals rule, n? lim n logi?n_ _ = n? lim i n logi?1n_ the second limit is zero by the inductive hypothesis, proving the claim. 2.5let ?f?(n?) = 1 when n? is even, and n? when n? is odd. likewise, let g?(n?) = 1 when n? is odd, and n? when n? is even. then the ratio ?f?(n?) / g?(n?) oscillates between 0 and . 2.6for all these programs, the following analysis will agree with a simulation: (i) the running time is o?(n?). (ii) the running time is o?(n?2). (iii) the running time is o?(n?3). (iv) the running time is o?(n?2). (v) ?j? can be as large as i?2, which could be as large as n?2. k? can be as large as ?j?, which is n?2. the running time is thus proportional to n?.n ?2. n?2, which is o?(n?5). (vi) the if? statement is executed at most n?3times, by previous arguments, but it is true only o?(n?2) times (because it is true exactly i? times for each i?). thus the innermost loop is only executed o?(n?2) times. each time through, it takes o?(?j?2) = o?(n?2) time, for a total of o?(n?4). this is an example where multiplying loop sizes can occasionally give an overesti- mate. 2.7 (a) it should be clear that all algorithms generate only legal permutations. the fi rst two algorithms have tests to guarantee no duplicates; the third algorithm works by shuffl ing an array that initially has no duplicates, so none can occur. it is also clear that the fi rst two algorithms are completely random, and that each permutation is equally likely. the third algorithm, due to r. floyd, is not as obvious; the correctness can be proved by induction. -4- see j. bentley, programming pearls, communications of the acm 30 (1987), 754-757. note that if the second line of algorithm 3 is replaced with the statement swap( ai, a randint( 0, n-1 ) ); then not all permutations are equally likely. to see this, notice that for n? = 3, there are 27 equally likely ways of performing the three swaps, depending on the three random integers. since there are only 6 permutations, and 6 does not evenly divide 27, each permutation cannot possibly be equally represented. (b) for the fi rst algorithm, the time to decide if a random number to be placed in a?i? has not been used earlier is o?(i?). the expected number of random numbers that need to be tried is n?/ (n? i?). this is obtained as follows: i? of the n? numbers would be duplicates. thus the probability of success is (n? i?) / n?. thus the expected number of independent trials is n?/ (n? i?). the time bound is thus i?=0 n?1 n?i ni_ i?=0 n?1 n?i n?2_ next; afterp = p-next;/* both p and afterp assumed not null. */ p-next = afterp-next; beforep-next = afterp; afterp-next = p; fig. 3.2. _ _ _ _ (b) for doubly linked lists, the code is shown in fig. 3.3. _ _ _ _ /* p and afterp are cells to be switched. error checks as before. */ void swapwithnext( position p, list l ) position beforep, afterp; beforep = p-prev; afterp = p-next; p-next = afterp-next; beforep-next = afterp; afterp-next = p; p-next-prev = p; p-prev = afterp; afterp-prev = beforep; fig. 3.3. _ _ _ _ 3.4intersect? is shown on page 9. -8- _ _ _ _ /* this code can be made more abstract by using operations such as*/ /* retrieve and ispastend to replace l1pos-element and l1pos != null.*/ /* we have avoided this because these operations were not rigorously defi ned.*/ list intersect( list l1, list l2 ) list result; position l1pos, l2pos, resultpos; l1pos = first( l1 ); l2pos = first( l2 ); result = makeempty( null ); resultpos = first( result ); while( l1pos != null else if( l1pos-element l2pos-element ) l2pos = next( l2pos, l2 ); else insert( l1pos-element, result, resultpos ); l1 = next( l1pos, l1 ); l2 = next( l2pos, l2 ); resultpos = next( resultpos, result ); return result; _ _ _ _ 3.5fig. 3.4 contains the code for union.? 3.7(a) one algorithm is to keep the result in a sorted (by exponent) linked list. each of the mn? multiplies requires a search of the linked list for duplicates. since the size of the linked list is o?(mn?), the total running time is o?(m?2n?2). (b) the bound can be improved by multiplying one term by the entire other polynomial, and then using the equivalent of the procedure in exercise 3.2 to insert the entire sequence. then each sequence takes o?(mn?), but there are only m? of them, giving a time bound of o?(m?2n?). (c) an o?(mn?log mn?) solution is possible by computing all mn? pairs and then sorting by exponent using any algorithm in chapter 7. it is then easy to merge duplicates afterward. (d) the choice of algorithm depends on the relative values of m? and n?. if they are close, then the solution in part (c) is better. if one polynomial is very small, then the solution in part (b) is better. -9- _ _ _ _ list union( list l1, list l2 ) list result; elementtype insertelement; position l1pos, l2pos, resultpos; l1pos = first( l1 ); l2pos = first( l2 ); result = makeempty( null ); resultpos = first( result ); while ( l1pos != null l1pos = next( l1pos, l1 ); else if( l1pos-element l2pos-element ) insertelement = l2pos-element; l2pos = next( l2pos, l2 ); else insertelement = l1pos-element; l1pos = next( l1pos, l1 ); l2pos = next( l2pos, l2 ); insert( insertelement, result, resultpos ); resultpos = next( resultpos, result ); /* flush out remaining list */ while( l1pos != null ) insert( l1pos-element, result, resultpos ); l1pos = next( l1pos, l1 ); resultpos = next( resultpos, result ); while( l2pos != null ) insert( l2pos-element, result, resultpos ); l2pos = next( l2pos, l2 ); resultpos = next( resultpos, result ); return result; fig. 3.4. _ _ _ _ 3.8one can use the pow? function in chapter 2, adapted for polynomial multiplication. if p? is small, a standard method that uses o?(p?) multiplies instead of o?(log p?) might be better because the multiplies would involve a large number with a small number, which is good for the multiplication routine in part (b). 3.10 this is a standard programming project.the algorithm can be sped up by setting m? = m? mod? n?, so that the hot potato never goes around the circle more than once, and -10- then if m? n?/ 2, passing the potato appropriately in the alternative direction.this requires a doubly linked list. the worst-case r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JJF 2471-2026实时荧光定量聚合酶链反应核酸检测系统分析性能确认和验证技术规范
- T/SHJD 003-2024家用多联机中央空调工程监理执行规程
- T/QME 0014-2024波浪能装置海上性能测试与评价技术标准
- T/CERDS 18-2025企业合规官能力要求
- T/CHATA 050-2025肺结核大咯血经导管血管栓塞术操作规范
- T/CSPSTC 160-2025钻爆法隧道智能建造 安全监测及风险预警管控系统技术规范
- T/SLA 005-2026青少年阅读推广服务指南
- 2025~2026学年河北省邢台市某校人教版六年级上册12月月考数学试卷 (1)【附答案】
- PHP工程师面试笔试题及详细参考答案(企业版)
- 2025-2026学年黑龙江省虎林市初中历史八年级期末下册自测模拟竞赛挑战题详细参考解析
- 2027年新版《校园安全教育》课件 专题二
- 2026年南宁市青秀区社工考试试题及答案
- 合同范本委托经营管理合同5篇
- 2025-2026学年广西壮族自治区柳州市初中历史八年级期末上册高分黑金考题(附答案)
- 【方案】2026低空经济中职院校建设方案
- 第三单元达标测试卷(试卷)2026-2027学年六年级数学上册人教版(含答案)
- 高职高考英语词汇表
- AI办公工具实操应用培训
- 2026国企总部招聘笔试真题题库及标准答案(完整版)
- 律师退伙申请书范本
- 2026易制毒、易制爆化学品安全培训课件
评论
0/150
提交评论