第5个,第6个,……第n个图形算法怎么画?点数有哪些不同的算法?我的想法是

这是个机器人猖狂的时代,请输一下验证码,证明咱是正常人~ 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
《计算机图形学》第1-5章课后习题参考答案
下载积分:1000
内容提示:《计算机图形学》第1-5章课后习题参考答案
文档格式:DOC|
浏览次数:38|
上传日期: 00:33:47|
文档星级:
该用户还上传了这些文档
《计算机图形学》第1-5章课后习题参考答案
官方公共微信第5章 搜索法_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第5章 搜索法
上传于||暂无简介
大小:2.78MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢算法导论习题解答
算法导论习题解答
随笔分类 - 算法导论习题解答
摘要: CLRS 18-2连接与分裂2-3-4树 连接操作的输入为两个动态集合S'和S'',以及一个元素x,使得对任何x'ε S',x'' ε S'',有key[x'] & key[x] & key[x'']。它返回一个集合S = S' U {x} U S''。分裂操作有点像一个“逆”操作:给定一个动态集S和一个元素xε S,它创建一个集合S',其中包含了S - {x}中所有关键字小于key[x]的元素;同时创建了一个集合S'',其中包含了S -
Microgoogle 阅读(1514) |
摘要: CLRS 16.2-2 请给出一个解决0-1背包问题的运行时间为O(nW)的动态规划方法,其中,n为物品的件数,W为窃贼可放入他的背包中的物品中的最大重量。我们有n种物品,物品j的重量为wj,价格为pj。我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。可以用公式表示为:maximize subject to 方法一:采用最原始的递归方法,公式为V(1,...,n) = max(vk + V(1,...,k-1,k+1,...,n));时间复杂度为O(2n),很多子问题被重复计算。View Code 1 #i...
Microgoogle 阅读(3223) |
摘要: CLRS 16.1-3假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。请给出一个有效的贪心算法,来确定哪一个活动应使用哪一个教室。(这个问题也被成为区间图着色(interval-graph coloring)问题。我们可作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。为使任两个相邻结点的颜色均不相同,所需的最少颜色对应于找出调度给定的所有活动所需的最少教室数。)方法一:我们很容易就可以想到用P227页的GREEDY-ACTIVITY-SELECTOR(s, f)来解决这个问题,首先调用这个函数,得到可以兼容的最大活动数,然后再在余下的活动中再次调用
Microgoogle 阅读(4226) |
摘要: CLRS 15-1 双调欧几里得旅行商问题欧几里得旅行商问题是对平面上给定的n个点确定一条连接各点的最短闭合旅程的问题。如图(a)给出了一个7个点问题的解。这个问题的一般形式是NP完全的,故其解需要多于多项式的时间。J. L. Bentley建议通过只考虑双调旅程来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。下图(b)显示了同样的7个点的最短双调路线。在这种情况下,多项式的算法是可能的。事实上,存在确定的最优双调路线的O(n2)时间的算法。描述一个确定最优双调路线的O(n2)时间的算法。可以假设任何两点的x坐标都不相同。(提示:从左到右扫描,保持
Microgoogle 阅读(3003) |
摘要: CLRS 14-2Josephus问题的定义如下:假设n个人排成环形,且有以正整数m&=n。从某个制定的人开始,沿环报数,每遇到第m个人就让其出列,且报数进行下去。这个过程一直进行到所有人都出列为止。每个人出列的次序定义了整数1,2,...,n的(n, m)-Josephus排列。例如,(7,3)-Josephus排列为&3,6,2,7,5,1,4&。a)假设m为整数。请描述一个O(n)时间的算法,使之对给定的整数n,输出(n, m)-Josephus排列。b)假设m不是个常数。请描述一个O(nlgn)时间的算法,使给定的整数n和m,输出(n, m)-Josephus排列。解
Microgoogle 阅读(2239) |
摘要: 算法导论习题解答系列停了一年了,现在重新拾起,好多算法已经忘了,有的记得大概,但是真正的用代码实现却很难下手。CLRS 14.1-3 写出OS-SELECT的非递归形式一般递归形式改写为非递归形式要用到while,有时还要用到栈结构。OS-SELECT(x, i){ r = size[left[x]] + 1; while (r != i) { if (i & r) { x = left[x]; r = size[left[x]] + 1; } else { x = right[x]; i = i -r; r...
Microgoogle 阅读(2285) |
摘要: CLRS 13.1-1利用性质画图,略CLRS13.1-2是否CLRS13.1-3是,因为就根部被改变了,并不与其他性质矛盾。CLRS13.1-44,两个子结点都为红色3,两个子结点一红一黑2,两个子结点都为黑树的叶子的深度将会都一样,因为路径上都是黑结点了。CLRS13.1-5略CLRS13.1-6当路径上一半黑一半红时,为最多,2^(2k) - 1个,当路径上全是黑时,为最少,2^k - 1个。CLRS13.1-7最大比值为1,即根部为黑结点,两个孩子为红,然后就是NIL结点(为黑)。最小比值为0,这时全是黑结点。
Microgoogle 阅读(638) |
摘要: CLRS 12.2-1C错,240及240之后的节点应该都为911左子树上的节点,那么所有节点必然小于或等于911,但点912明显违反了。CLRS12.2-2SEARCH-MINIMUM(x) if(left[x] != NIL) SEARCH-MINIMUM(left[x]) return xSEARCH-MAXIMUM(x) if(right[x] != NIL) SEARCH-MAXIMUM(right[x]) return xCLRS12.2-3TREE-PREDECESSOR(x) if(left[x] != NIL) return TREE-MAXIMUM(left[x]) y =
Microgoogle 阅读(540) |
摘要: CLRS 12.1-3:给出一个非递归的中序树遍历算法。(提示:有两种方法,在较容易的方法中,可以采用栈作为辅助数据结构;在较为复杂的方法中,不采用栈结构,但假设可以测试两个指针是否相等。)算法思想:1.采用栈的话,先寻找最左边的节点,把经过的节点都存入栈中,第一个被弹出来的为最左节点,那么访问其右子树,对右子树也像前面一样遍历,整个流程跟递归一样。2.不采用栈的话,先是访问最左节点,然后访问其右子树,然后回溯到最左节点的父节点,不断重复这个过程,思路还是一样。这里参考了重剑无锋的http://blog.csdn.net/kofsky/archive//2886453.as
Microgoogle 阅读(3712) |
摘要: CLRS 10.2-7 :在O(n)时间内对给定的单链表进行逆转。解法:这题没什么技巧,就是将指针的指向进行改变即可。#include &iostream&//很简单的Node 和 Listclass Node{public: Node* Node(); Node(int d);};class List{public: Node* List(); void insert(int d);};int main(){ int K =5; List* list =new List(); ...
Microgoogle 阅读(463) |
摘要: CLRS 10.1-7 :说明如何用两个队列来实现一个栈,并分析有关栈操作的运行时间。解法:1.有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。2.现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。3.如果继续做push操作,比如插入d,f,则把d,f插入到q2中,4.此时若要做pop操作,则做步骤25.以此类推,就实现了用两个队列来实现一个栈的目的。注意在此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么
Microgoogle 阅读(1195) |
摘要: CLRS10.1-6 :说明如何用两个栈来实现一个队列,并分析有关队列操作的运行时间。解法:1.有两个栈s1和s2,先往s1内插入a,b,c,这做的都是enqueue操作。2.现在要做dequeue操作,即要得到a,这时可以将s1中的元素全部弹出并存入s2中,这时s2中元素的顺序(从底部到顶部)为c,b,a,这时做s2.pop()操作即可得到a。3.如果继续做enqueue操作,比如插入d,f,则把d,f插入到s1中,4.此时若要做dequeue操作,则直接弹出s2中的b,它是目前为止,呆得时间最长的元素5.若继续做dequeue操作,则s2弹出c,6.若继续做dequeue操作,则s2为空,
Microgoogle 阅读(836) |
摘要: CLRS 10.1-5栈的插入和删除操作都是在一端进行的,而队列的插入和删除却是在两头进行的。有一种双端队列(deque),其两端都可以做插入和删除的操作。对于一个用数组构造的双端队列,请写出四个在两端进行插入和删除操作的过程,要求运行时间为O(1)。#include &iostream&template &class T&class Deque{public: void push_front(T t); void push_back(T t); T pop_front(); T pop_back(); Deque(int m);
Microgoogle 阅读(668) |
摘要: CLRS 10.1-2 :说明如何用一个数组A[1...n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢。注意PUSH和POP操作的时间应为O(1)。解法:用top1指向数组第一个元素,用top2指向数组最后一个元素,然后PUSH的时候,它们向中间进发,POP的时候向相应的方向减一。
Microgoogle 阅读(986) |
摘要: CLRS 9.3-9 :选择主输油管道的最优位置(使得各喷管长度总和最小的位置)。算法思想:1.当n为奇数时,其实就是求median;2.当n为偶数时,就是第n/2小和第n/2 + 1小的数为边界的闭区间的任何数。其实这个证明还是蛮简单的,可以移动x轴来观察情况,位于median处(n为奇数)或median范围内(n为偶数)时,设其距离为min,当移动x轴时,移出这个范围,则可以发现所有点(包括median点)到x轴的距离必然大于min。画一下图,就会一目了然。在这里用到了寻找第i小的数#include &iostream&#include &time.h&usingn
Microgoogle 阅读(1923) |
摘要: CLRS 9.3-8:设X[1...n]和Y[1...n]为两个数组,每个都包含n个已排序好的数。给出一个求数组X和Y中所有2n个元素的中位数的、O(lgn)时间的算法。算法思想:该算法类似于二分查找算法1.两个数组中小于median的个数为(n - 1)个,假设该median为数组a中的第k个,k为数组下标,那么在数组a中已经存在k个值小于median,那么在数组b中必然有(n - 1) - k = (n-k-1)个数小于median,如果b[n - k - 2] &= median &= b[n - k - 1],那么median就找到了,如果median &= b[n
Microgoogle 阅读(1289) |
摘要: CLRS 9.3-7 :给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k&=n后,它能确定出S中最接近其中位数的k个数。算法思想:1.找到数组a中第n/2小的数median;2.对a中非median数进行|a[i] - median|,得到一个大小为n - 1的数组distance;3.寻找distance中第k小的数值;4.对distance进行一次遍历,找到小于等于k的数,从而对应得到数组a中的k个数。上述每一步的时间复杂度都为O(n),因而最后总的时间复杂度为O(n).#include &iostream&#include &time.
Microgoogle 阅读(284) |
摘要: CLRS 9.2-3 :写出RANDOMIZED-SELECT的一个迭代版本在这里,顺便实现在数组内寻找第i小的数值。#include &iostream&#include &time.h&//随机化分割int randomized_partition(int* a, int p, int r);int randomized_select(int* a, int p, int r, int i);int main(){ int arr[10] = {4, 34, 21, 8, 3, 10, 453, 32, 1, 400}; in
Microgoogle 阅读(611) |
摘要: CLRS 9.1-1 :证明:在最坏情况下,利用n + [lgn] - 2此比较,即可找到n个元素中的第2小元素。(提示:同时找最小元素)算法思想:1.将数组中的元素分组,每组两个元素,然后比较每组中的两个元素得到最小值,重新得到包含原来一半元素的数组,继续重复上述过程,那么最后一个元素必然为最小值。如图所示,数组为{2, 1, 4, 3, 5}2.上述过程形成的是一个二叉树,其中叶子节点都为数组元素,非叶子节点刚好4个,这是二叉树的性质。3.然后我们来找第二小元素,第二小元素必然跟着1,首先赋值为5,然后再赋值为3, 然后赋值为2,即为所求。PS:本章讨论的元素都互异,不存在相同值(见原书)
Microgoogle 阅读(754) |
摘要: CLRS 8-5:平均排序解答:a)非递增完全排序b)2 1 4 3 6 5 8 7 10 9c)展开题目中的公式,然后消除相同项,即可得到此结论。d)算法思想: 1.将数组分成k组,即{a[0], a[k], a[2k] ...}, {a[1], a[1+k], a[zk+1] ...}, ..., {a[i], a[i+k], a[i+2k], ...}, ..., {a[k-1], a[2k-1], ...}. 2.然后对每一组用合并排序或者堆排序进行排序,则每一组的时间为t = n/k*lg(n/k),总的时间为nt,即nlg(n/k).e)由于数组已是k排序的,则可以将数组按d).1
Microgoogle 阅读(303) |
摘要: CLRS 8-4 :水壶比较问题解答:a)两个for循环即可,O(n^2);b)不会证明,略;c)算法思想:1.由于相同颜色的瓶子不能比较,因而不能对红色瓶子或者蓝色瓶子进行内部排序。2.随机从红色瓶子抽取一个瓶子(实现时选的是中间瓶子),然后与蓝色瓶子进行比较,找到那个相等的蓝色瓶子,它们就是配对的,小于这个红色瓶子的就存在一个数组内,大于这个红色瓶子的就存在另外一个数组内,用得到的蓝色瓶子再和红色瓶子组进行比较,将小于这个蓝色瓶子的存在一个数组内,大于这个蓝色瓶子的存在另一个数组内。3.对得到的两组小的红色瓶子和蓝色瓶子重复2过程,对得到的两组大的红色瓶子和蓝色瓶子重复2过程,即递归。代码
Microgoogle 阅读(518) |
摘要: CLRS 8-3(b) : 给定一个字符串数组,其中不同的串包含的字符数可能不同,但所有串中总的字符个数为n。说明如何在O(n)时间内对该数组进行排序。算法思想:1.在这里用空间来换取时间,因而采用trie树,即字典树,顾名思义,像一本字典一样。2.将每个字符串插入到trie树中,到达特定的结尾节点时,在这个节点上进行标记,如插入"afb",第一个字母为a,沿着a往下,然后第二个字母为f,沿着f往下,第三个为b,沿着b往下,由于字符串最后一个字符为'\0',因而结束,不再往下了,然后在这个节点上标记afb.count++,即其个数增加1.3.通过前序遍历此树
Microgoogle 阅读(517) |
摘要: CLRS 8-3(a) :给定一个整数数组,其中不同的整数中包含的数字个数可能不同,但该数组中,所有整数中总的数字数为n。说明如何在O(n)时间内对该数组进行排序。算法思想:1)先把各个数字按位数分组。2)然后对各个分数进行基数排序3)将各个组连接起来即可这个题目基本上重复了算法导论8.3-4习题解答(基数排序) 的核心算法.#include &iostream&#include &fstream&void radix_sort(int* a, constint d, constint length, int radix);int
Microgoogle 阅读(541) |
摘要: CLRS 8.3-4 :说明如何在O(n)时间内,对0到n^2 - 1之间的n个整数进行排序。算法思想:1.把这n个数看成n进制数,那么每个数只有两位,因而循环只需两次2.调用通用的基数排序(在这写着,留着以后用)在此题中,我选择n = 15, 即数组中有15个数,依次为0, 3, 8, ..., 224,但是将顺序打乱了。PS:在前一篇文章中,计数排序的总时间为O(k+n),在实践中,如果当k = O(n)时,我们常常采用计数排序,这时其运行时间为O(n).在这里采用的是基数排序,在实践中,其排序时间为O(d*(n+k)),但很耗内存,有时甚至比快速排序更快,具体应用再看。#include
Microgoogle 阅读(613) |
摘要: CLRS 8.2-4 :在O(1)的时间内,回答出输入的整数中有多少个落在区间[a...b]内。给出的算法的预处理时间为O(n+k)算法思想:利用计数排序,由于在计数排序中有一个存储数值个数的临时存储区C[0...k],利用这个数组即可。#include &iostream&//通过改编计数排序而来,因为有些部分需要注释掉void counting_sort(int*&a, int length, int k, int*&b, int*&c);int main(){ constint LEN =100; int*a =n
Microgoogle 阅读(339) |
摘要: CLRS 7.1-4:应如何修改QUICKSORT,才能使其按非增序进行排序?算法思想:改掉书上partition算法中的&=为&=#include &iostream&void quick_sort(int*&a, int p, int r);int partition(int*&a, int p, int r);int main(){ constint LEN =20; int b[LEN] = {12, 43, 0, -4, 98, 75, 64, 88, 5, 32, 11, 12, 13, 84, 34,
Microgoogle 阅读(311) |
摘要: CLRS 6-3 :Young氏矩阵( 杨氏矩阵)解答:(a)2 4 9 12 3 5 14 Max 8 16 Max Max Max Max Max Max(b)Y[1, 1]为Max的话,那么按照Young氏矩阵定义,矩阵中其他数值必然大于等于它,所以Y为空。 若Y[m, n] & Max的话,由其他元素都小于等于Y[m, n]可知此矩阵是满的。(c)算法思想: 1)A[0][0]必然是最小值,将其取出,然后将矩阵的最后一个元素A[m-1[n-1]补到第一位来,并将A[m-1[n-1]设置为Max 2)将A[0][0]与A[0][1]和A[1][0]二者之间的最小值进行交换, 3)若
Microgoogle 阅读(1088) |
摘要: CLRS 6-1 :1.当输入数组相同时,过程BUILD-MAX-HEAP和BUILD-MAX-HEAP'产生的堆是否总是一样的?解答:这个可以用举反例的方式来反驳之。如数组为{1, 2, 3, 4, 5}按照BUILD-MAX-HEAP的方式为: 1 1 5 2 3 -& 5 3 -& 4 3 4 5 4 2 1 2按照BUILD-MAX-HEAP'的方式为: 2 3 4 5 1 -& 1 -& 1 2 -& 3 2 -& 4 2 1 1 32.简单说明:BUILD-MAX-INSERT的时间为lgn,而for循环运行了了n-1次,所以总时
Microgoogle 阅读(256) |
摘要: CLRS 6.5-8 原题为:请给出一个时间为O(nlgk)、用来将k个已排序链表合并为一个排序链表的算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)。 算法思想:1. 从k个链表中取出每个链表的第一个元素,组成一个大小为k的数组arr,然后将数组arr转换为最小堆,那么arr[0]就为最小元素了2. 取出arr[0],将其放到新的链表中,然后将arr[0]元素在原链表中的下一个元素补到arr[0]处,即arr[0].next,如果 arr[0].next为空,即它所在的链表的元素已经取完了,那么将堆的最后一个元素补到arr[0]处,堆的大小自动减一,循环n-k次即可
Microgoogle 阅读(997) |
摘要: CLRS 6.5-7: HEAP-DELETE(A, i)操作将结点i中的项从堆A中删去。对含n个元素的最大堆,请给出时间为O(lgn)的HEAP-DELETE的实现。算法思想:对即将被删的i处的元素设置为堆中末尾的元素,同时堆的大小减1.此题同时附带6.2-5的解答代码如下: 1 #include &iostream& 2 3 //修正i的位置,在此处已经假设i的子节点都是堆 4 static void max_heapify(int*&a, int i, int length); 5 //建立数组的堆 6 void build_
Microgoogle 阅读(494) |
摘要: CLRS 6.3-3:证明:在任一含n个元素的堆中,至多有[n/2^(h+1)]个高度为h的结点。证明:运用归纳证明1.所有叶子结点的高度都为0,那么h = 0, [n/2^(h+1)] = [n/2],显然成立,因为叶子结点的序号是[n/2] + 1, [n/2] + 2, ..., n,见6.1-7的习题解答,/shuaiwhu/archive//2065081.html2.若h = x时成立,则需证明h = x + 1也成立,易得证。
Microgoogle 阅读(428) |
摘要: CLRS 6.2-5:请用迭代的控制结构(循环)取代递归结构,从而写一个更为高效的MAX-HEAPIFY.这道题的解法包含在6.5-7中了,请参见本博客下下篇,/shuaiwhu/archive//2065078.htmls
Microgoogle 阅读(258) |
摘要: CLRS 6.1-7 :证明:当用数组表示存储了n个元素的堆时,叶子结点的下标是[n/2] + 1, [n/2] + 2, ..., n.证明:因为有n个元素,最后一个元素序号为n,那么它的parent结点应该是序号最大的parent结点,那么这个parent结点就为[n/2],其之后都是叶子结点,因而为[n/2] + 1, [n/2] + 2, ..., n。
Microgoogle 阅读(541) |
摘要: CLRS 6.1-2 :证明:含n个元素的堆的高度为[lgn].证明:因为 2^h &= n &= 2^(h+1) - 1 所以 lg(n+1) -1 &= h&= lg(n) 可推出lg(n) - 1 & lg(n+1) -1 &= h&= lg(n) 从而h = [lgn].
Microgoogle 阅读(150) |
摘要: CLRS 2-4:要求用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目。(提示:修改合并排序)算法思想:逆序对,即i a[j],那么我们可以修改合并排序,每次合并时,都把这样的对数记下来即可,因为合并排序是从最底部开始的(书上给出了一个树形图)。代码如下:#include//寻找一个数组中的逆序对//逆序对://i a[j]//算法思想:修改合并排序#define LEN 5void merge(int* a, int p, int q, int r, int&count){ int* left =new int[q-.
Microgoogle 阅读(645) |
摘要: CLRS 2-2 :冒泡排序算法的正确性解答:这里我只实现了冒泡算法,证明什么的,我也不大会.#include &iostream&//冒泡排序#define LEN 35int main(){ int* a =newint[LEN]; for(int i =0; i & LEN; i++) a[i] = i -5; for(int i =0; i & LEN; i++) for(int j = LEN -1; j & j--) { if(a[j] & a[j-1]) ...
Microgoogle 阅读(184) |
摘要: CLRS 2.3-7:请给出一个运行时间为O(nlgn)的算法,是之能在一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。算法思想:1.先运用合并排序进行排序 O(nlgn),2.然后运用二分查找法寻找y,y = x - a[i];代码如下: 1 #include &iostream& 2 3 4 void sort(int*&a, int p, int q, int r) 5 { 6 int* left =new int[q - p +1]; 7 int* right =new int[r -
Microgoogle 阅读(642) |
摘要: CLRS 2.1-2 :重写过程insertion-sort,使之按非升序排序。算法思想:模仿书中的代码即可,送分题。#include &iostream&#define LEN 17//最坏的情况O(n2)int main(){ int* a = new int[LEN]; for(int i = 0; i & LEN; i++) a[i] = i - 5; int temp = a[0]; for(int i = 1; i & LEN; i++) { int j = int key = a[i]; while(j &
Microgoogle 阅读(362) |
发表评论:
TA的最新馆藏观察下图,推测第5个图形有多少根火柴棒,第n个图形有多少个火柴棒?
taozhengsbPM14
第1个图形有1个3根第2个图形有1+2=3个3根第3个图形有1+2+3=6个3根照这样下去第5个图形就有1+2+3+4+5=15个3根,也就是15x3=45根第n个图形就有1+2+3+……+n=(1+n)n/2个3根,也就是3(1+n)n/2根
为您推荐:
其他类似问题
扫描下载二维码

我要回帖

更多关于 计算机图形学算法 的文章

 

随机推荐