- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
问题求解与程序设计第五讲 问题抽象 李文新 2004.2 – 2004.6 内容提要 Binary codes - 1147 讨论 – 1063 作业 – 1063 问题描述 给定一个N位的二进制串 b1 b2 … bN-1 bN 将该串做旋转,即将b1移到bN后面,得到一个新的二进制串: b2 … bN-1 bN b1 问题描述 对新的二进制串再做旋转,得二进制串 b3 b4 … bN-1 bN b1 b2 重复旋转操作操作,可得N个二进制串,对这N个串排序,可得一个N*N的矩阵 问题描述 例如: 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0 0 问题描述 对它们做排序,得矩阵 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 问题描述 问:给定这种矩阵的最后一列, 求出矩阵的第一行。 对于上面的例子,给出 1 0 0 1 0,要你的程序输出 0 0 0 1 1。 问题描述 输入文件名:bincode.in 第一行有一个整数 N 表示二进制串的长度 第二行有N个整数,表示矩阵最后一列从上到下的数值。 问题描述 输出文件名:bincode.out 第一行包括N个整数,表示矩阵第一行从左到右的数值。 问题描述 输入样例 bincode.in 5 1 0 0 1 0 问题描述 输出样例 bincode.out 0 0 0 1 1 问题描述 限制 1 = N = 1000 解法一 猜测法 计算输入列中包含 0 的个数 I 生成输出行:前I个为0,后N-I个为1 思路:因为矩阵按字母序排序,所以0应该在前面。? 该算法不能保证正确,但对样例正确? 解法二 穷举法 生成一个长度为N的全0序列 按规则将其旋转生成N*N矩阵 如果最后一列与输入相同,则输出开始的序列。 按字母序生成下一个长度为N的二进制序列,goto 2. 解法二 穷举法 显然这一算法不是最优的,但是它是正确的,因为它穷举了全部可能。 解法三 迭代法 初始化一个N行,最开始是0列的工作矩阵. 将输入列放在当前工作矩阵左边,对行排序. 如果矩阵列数小于N, goto 2. 输出第一行 解法三 迭代法 例子 (输入10010) 0 10 00 100 000 0 0 00 00 000 001 0 0 00 01 001 011 1 1 11 10 110 100 0 1 01 11 011 110 解法三 迭代法 例子 (输入10010) 000 1000 0001 10001 00011 0 001 0001 0011 00011 00110 0 011 0011 0110 00110 01100 1 100 1100 1000 11000 10001 0 110 0110 1100 01100 11000 输出:00011 解法三 迭代法 分析 该算法所需数时间是O(N3) N次迭代,每次要对一个N*N的矩阵排序 解法三 迭代法 证明 该算法的本质是逐一构造矩阵的前 I 列 对于I=1,重新排序后显然成立 对于IN,如果前I列就是矩阵的前I列,那么把最后一列加到前面,从序列的顺序来说,是正确的,重新对这I+1列排序保证了行顺序的正确性。 解法三 迭代法 分析 一个值得注意的现象是:每次排序总是把开头是0的行按原来的先后次序移到前面,而把开头是1的行按原来的先后次序移到后面。 解法四 线性算法 算法描述: 1. 计算输入列中0和1的个数,并用它们形成第一列. 解法四 线性算法 2. 生成一个Next数组,使得数组中的i个0指向最后一列第i个0的行数,数组中的第j个1指向最后一列第j个1的行数. 解法四 线性算法 3. 从第1行开始,按照Next指引的顺序 – 从k到Next[k], 每次把该行最后一列的数字取出生成第一行的相应数字。 解法四 线性算法 例如 输入 10010 有3个0,2个1,所以第1列一定是 0 0 0 1 1 解法四 线性算法 例如 输入 10010 2. 生成Next数组 Next 1 0 1 2 2 0
原创力文档


文档评论(0)