以前的练习我们实现了CLRS 35.5的子集和算法。在今天的练习中,我们解决了练习35.5-5,它要求我们返回子集及其总和。算法完全相同。不同之处在于,集合成员与其部分和一起存储。

您的任务是编写一个程序来解决上述子集和问题。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

我们研究了子集和问题,将求和到给定目标的一组整数的子集分为两部分以前的 练习; 在这两种情况下,我们都得到了一个精确的答案,但花费了指数时间。在今天的练习中,我们将研究子集和问题的一个变体-找到一组整数的子集,该子集的最大和不超过给定的目标-它可以接受精确和近似的答案;精确答案在指数时间内运行,虽然它通常很快,但近似答案在输入集中整数的数量上在线性时间内运行。我们的解决方案由CLRS 35.5给出。

精确解使用两个辅助函数。函数表示为L(左)+x个添加x个列表中的每个元素L(左).功能合并列表获取两个已排序的输入列表,并返回两个列表的合并,其中删除了重复项。然后CLRS给出如下算法,其中是整数的排序列表t吨是目标:

E类XACT公司-S公司瑞士联合银行-S公司(,t吨)
1  n个= ||
2  L(左)0= ‹0›
3  对于 = 1 n个
4      L(左)=MERGE公司-我ISTS公司(L(左)−1,L(左)−1+x个)
5从中删除L(左)大于的每个元素t吨
6个返回中最大的元素L(左)n个

近似算法在精确算法的基础上增加了微调步骤。修剪步骤从累加中删除L(左)列出因子0<δ<1内的部分和,以便删除任何小于1+δ乘以其前身的部分和。例如,给定L(左)=10、11、12、15、20、21、22、23、24、29›和δ=0.1L(左)'=10、12、15、20、23、24›,其中11因在10的10%以内而被删除,21和22因在20的10%以内被删除;修剪假设L(左)= ‹1,2,…›排序:

T型RIM公司(L(左),δ)
1出租长度为L(左)
2  L(左)‘ = ‹1
3  最后的=1
4个对于 = 22
5      如果 >最后的· (1 + δ) //最后的因为L(左)已排序
6追加在…的末尾L(左)
7          最后的=
8  返回 L(左)

然后近似亚总和算法与精确子集算法,但该步骤除外L(左)=TRIM公司(L(左), ε/2n个)在步骤4和5之间插入,其中溶液在所需目标的0<ε<1%范围内。

您的任务是实现上述两个算法。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

Aliquot序列

2014年5月23日

我们在上一次练习。今天我们来看等分序列,它与友好链密切相关。等分序列n个是以开头的序列n个作为其第零个元素(k个−1)作为其k个'第个元素,其中是上一个练习的divisors函数的总和。例如,10的等分序列是10、8、7、1、0,因为(10) = 1 + 2 + 5 = 8,(8) = 1 + 2 + 4 = 7,(7) =1,和(1) = 0.

1888年,尤金·查尔斯·加泰罗尼亚(Eugène Charles Catalan)推测,所有等分序列要么以质数结束(上面显示的10的等分序列通常被认为以质数7结束,因为一旦等分序列的一个成员是质数,接下来的两个步骤是1和0)或者在一个友好链上(一个完美的数是长度为1的友好链,或者一对友好的对是长度为2的友好链或更长的友好链)。例如,95的等分序列是95、25、6、6……,其中6是一个完全数。已确定整个等分序列的所有数字都符合猜想,但有许多数字的整个等分顺序未知,其中最小的是276。

你的任务是编写一个计算等分序列的函数;它应该返回素数或终止序列的友好链(最小数优先)。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

友好的链条

2014年5月20日

一个完全数等于它的适当除数之和;例如,28的除数是1、2、4、7和14,以及1+2+4+7+14=28,所以28是一个完美数字。如果m的除数之和等于n,n的除数和等于m,则两个数字m和n构成友好对;例如,220有除数1、2、4、5、10、11、20、22、44、55、110,其和为284,而284的除数1,2,4,71,142的和为220,所以220和284形成一个友好的对。友好链表是一个数字列表,每个数字都是前一个数字的除数之和,它循环循环,使得列表中最后一个数字除数的和是列表中的第一个数字;例如,数字12496、14288、15472、14536和14264形成一个长度为5的友好链,因为sum-div(12496)=14288、sum-dif(14288)=15472、sum-diav(15472)=14536、sum-disv(14536)=14264和sum-div(14264)=12496。我们在上一次练习

你的任务是编写程序来定位完美数字、友好数字和友好链;使用它可以找到所有元素都小于100万的对象。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

滚动代码

2014年5月16日

在车库门自动开启器的早期,所有的开启器共享一个代码,因此每个车库门开启器都与每个车库门协同工作;你可以随时打开邻居的车库门,走进他的车库。下一代车库门开启器有8个DIP开关,因此有256个密码,解决了随意阻止邻居打开车库的问题,但对小偷几乎没有威慑作用。

如今,车库门开启器和汽车锁钥匙链遥控器使用滚动码,有时也称为跳跃码,以确保安全。每个遥控门锁发射器都有一个唯一的序列号;每个车库门遥控器或汽车锁都经过编程,只识别来自特定遥控器的信号。信号本身通过滚动码进行随机和加密。

它的工作原理是这样的:每次按下遥控门锁发射器上的按钮,请求的信号就会连同遥控门锁发射器的序列号和滚动码一起发送给接收器,滚动码是一个加密的随机数。接收器确保遥控钥匙有一个识别的序列号,解密滚动码,将其与接收器的同步随机数生成器进行比较,如果一切都同意,则执行请求的操作,如果不同意,则拒绝请求的操作。

当发射器超出接收器的范围时,它可能会发送信号。为了实现这一点,接收器检查随机序列中的下一个256个数字,而不是仅检查一个数字,并且如果256个数字中的任何一个一致,则接受信号。此外,如果遥控门锁发射器发送超过256个连续信号超出范围,则接收器将执行所请求的操作,如果遥控锁发射器从随机序列发送两个连续数字,则接收器会重新同步其随机数字序列的副本。

你的任务是编写模拟遥控门锁发射器和接收器动作的程序。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

三个面试问题

2014年5月13日

我经常看的网站之一是职业杯发布在实际工作面试中提出的编码问题。这些问题是今天早上提出的:

1) 考虑一个排序的单链表,其节点如下:10->30->50->70->NULL。您将得到一个指向节点50的指针和一个值为40的新节点。您能在保持升序的列表中正确插入节点40吗?

2) 给定一个链表5->4->3->2->1,通过从第一个节点减去链表的最后一个节点,从第二个节点减去下一个到最后一个的节点,以此类推,生成链表4->2->0->2->1。

3) 编写一个程序,输出一个数的阶乘中连续尾随零的数量。例如,如果数字是5,那么5!=120,后面有一个零。

你的任务是编写程序来回答上面提出的三个面试问题。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

集群

2014年5月9日

聚类是将输入集合中具有某些共同特征的所有项目分组收集的过程;例如分组依据SQL的操作符执行集群。我们将定义集群(进程、lt?、lst)作为一个接受输入列表并返回列表列表的函数;程序计算输入列表中每个项目的签名,输出列表中的每个子列表包含具有相同签名的输入列表的所有元素,子列表根据书信电报?.类型集群是(α→β)×(β×β→布尔值) × (列表α) → (列表(列表α)).

你的任务是编写函数集群。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

包装好的Ascii

2014年5月6日

打包ascii是一种将有用的ascii字符子集压缩为6位的方法,用于HART启用设备。可以传输的字符包括空格字符、26个大写字母、10位数字和以下标点符号:! “#$%&'()*+,-./:;?@[\]^_.省略了26个小写字母、擦掉字符和以下标点符号:`{|}~

压缩是通过只保留每个ascii字符的六个低位来实现的。压缩字符通过添加一个高阶位扩展为其原始字符,该位是压缩高阶位的补码。例如,字符串“PRAXIS”被压缩为六个6位二进制数010000 010010 000001 011000 001001 010011。

一个字符串被压缩为6位字符,然后通过将位从高位压缩到低位,以8位字节的形式传输,从而将四个字符分为三个字节传输,实现25%的压缩。如果消息长度不是四的偶数倍,则在字符串末尾添加空格字符作为填充。因此,表示“PRAXIS”的六个6位二进制数将用两个空格字符填充,并作为六个8位二进制数01000001 0010000001011000 00100100000进行传输,这与字符串“A X%8”相对应。

您的任务是编写以打包ascii格式压缩和扩展字符串的函数。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

二进制反射格雷码

2014年5月2日

n个-位格雷序列是2的序列n个值,从0开始,其中每个值与前一个值相差一位。始终有2个n个−1 n个-比特格雷序列;例如,两个2位Gray序列是0、1、3、2和0、2、3、1。当格雷序列以二进制形式写入时,更容易看到它们;以二进制形式写入的两个2位格雷序列是00,01,11,10和0,0,10,11,01,其中很明显,序列的每个元素与前一个元素仅相差一位。

尽管对于任何给定的比特数都有许多可能的格雷序列,但有一个格雷序列称为二进制反射格雷码BRGC,这几乎总是正在讨论的格雷序列。通过反转序列,在原始序列的条目前面加上0位,在反转序列的条目之前加上1位,然后将两个序列串联起来,从下一个较小的序列递归生成此类序列。例如,给定2位Gray序列00、01、11、10,其反转为10、11、01、00,将0位添加到原始序列中给出000、001、011、010,将1位添加到反转序列中给出110、111、101、100,并将这两个序列串联起来给出000、001、011和010、110、111和101100,即0、1、3、2、6、7、5、4。

您的任务是编写一个生成n个-二进制位反映格雷序列。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2