流媒体

2012年5月29日

一组数字的中位数是指当项目按排序顺序排列时,项目数为奇数时,中间的数字,或当项目数为偶数时,中位数是中间两个数字的平均数;例如,{3741265}的中位数是4,{4213}的中值是2.5。计算中值的常规算法一次考虑整个数字集;这个流媒体该算法重新计算数字集每个连续前缀的中值,并可应用于无限序列的前缀。例如,原始数字序列的流媒体是3、5、4、3.5、3、3.5和4。

使用两个堆计算流中值。所有小于或等于当前中间值的数字都位于左侧堆中,其排列方式使最大数字位于堆的根。所有大于或等于当前中值的数字都位于右侧堆中,这样安排的目的是使最小数字位于堆的根。请注意,等于当前中值的数字可以在任意一个堆中。两个堆中的数字计数相差永远不会超过1。

当进程开始时,两个堆最初是空的。输入序列中的第一个数字被添加到其中一个堆中,不管是哪个堆,并作为第一个流中值返回。然后将输入序列中的第二个数字添加到另一个堆中,如果右堆的根小于左堆的根,则交换两个堆,并返回两个数字的平均值作为第二个流中值。

然后开始主要算法。将输入序列中的每个后续数字与当前中值进行比较,如果它小于当前中值,则添加到左侧堆中,如果它大于当前中值,那么添加到右侧堆中;如果输入数字等于当前中值,则将其添加到计数较小的堆中,如果计数相同,则任意添加到其中一个堆中。如果这导致两个堆的计数相差超过1,则会删除较大堆的根并将其插入较小堆中。然后,如果计数不同,则将当前中值计算为较大堆的根,如果大小相同,则计算为两个堆的根的平均值。

您的任务是编写一个函数来计算序列的流媒体。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

阿克曼函数

2012年5月25日

20世纪20年代,威廉·阿克曼(Wilhelm Ackermann)演示了一种非原始递归的可计算函数,解决了计算理论发展过程中的一个重要争论。他的函数有几个版本,其中最常见的是

A(m,n)=\left\{begin{array}{ll}n+1和\mbox{if\(m=0\)}\\A(m-1,1)和\mbax{if\。

在非负整数上定义n个。即使是非常小的输入,函数也会快速增长;例如,A(4,2)是大约20000位的整数。

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

页:1 2

海明码

2012年5月22日

汉明码由理查德·汉明于1950年发明,是一种通过噪声信道传输数据的方法,使接收者能够纠正简单的错误。发送器将奇偶校验位添加到传输流中,这样,当数据位和奇偶校验位相结合时,可以识别和纠正数据位或奇偶校验比特中的任何单位错误。所需奇偶校验位的数量由汉明规则给出d日+第页+ 1 ≤ 2第页哪里d日是数据位数第页是奇偶校验位的数目。码字的长度c(c)它结合了数据位和奇偶校验位d日+第页,汉明代码描述为(c(c)d日). 我们将说明如何使用4位数据字,它需要3个奇偶校验位才能满足汉明规则(2是不够的,因为4+2+1>4,但3是足够的,因为4+3+1≤8),并由(7,4)描述。

汉明码的一个特定实例使用两个矩阵,G公司生成器矩阵和H(H)综合征矩阵。以下是(7,4)汉明码的样本生成器(左)和综合征(右)矩阵:

1 0 0 0 1 1 1    1 0 1 1 1 0 0
0 1 0 0 0 1 1    1 1 0 1 0 1 0
0 0 1 0 1 0 1    1 1 1 0 0 0 1
0 0 0 1 1 1 0

生成器矩阵表示为[:一个]由一个单位矩阵组成在最左边的四列(数据位数)和奇偶校验编码矩阵中一个在最右边的三列中(奇偶校验位的数量)。对于一个矩阵;它的构造必须确保每个数据位都由两个或多个奇偶校验位进行检查,这样奇偶校验比特的组合就不会与数据位重叠。表示综合征矩阵[一个T型:]由奇偶编码矩阵的转置组成一个在最左边的四列中,单位矩阵在最右边的四列。

数据字通过将其乘以生成矩阵进行编码,所有算术均为模2;我们给出了一个矩阵乘法的算法上一次练习例如,数据字[1 0 0 1]被编码为[1 0 0 1 0 0 1],如下所示:

|1|
                                  | 0 |
              | 1 0 0 0 1 1 1 |   | 0 |
| 1 0 0 1 | * | 0 1 0 0 0 1 1 | = | 1 |
              | 0 0 1 0 1 0 1 |   | 0 |
              | 0 0 0 1 1 1 0 |   | 0 |
                                  | 1 |

解码是逆运算,将综合征矩阵乘以编码数据:

                    | 1 |
                    | 0 |
| 1 0 1 1 1 0 0 |   | 0 |   | 0 |
| 1 1 0 1 0 1 0 | * | 1 | = | 0 |
| 1 1 1 0 0 0 1 |   | 0 |   | 0 |
                    | 0 |
                    | 1 |

如果所有结果位均为零,则传输成功且无错误,输入代码为编码的前四位[1 0 0 1]。但如果有传输错误,则该综合征会指向它。例如,如果接收者接收到的传输为[1 0 1 1 0 0 1],则综合征计算为[1 01],这与H(H)矩阵,表示传输的第三位出错,因此消息不是[10 1 1],而是[1 0 0 1],这是正确的。

您的任务是编写使用上述汉明码对消息进行编码和解码的函数。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

格式化数字输出

2012年5月18日

程序通常需要生成各种格式的数字输出,大多数语言都为此提供了库;例如,C提供了打印函数,其中包括d日(f)十进制数(整数)和浮点数的格式规范。

您的任务是编写格式化整数和浮点数的库函数;你可以遵循C语言或其他语言的格式约定,也可以发明自己的格式。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

流媒体背包

2012年5月15日

计算机科学中一个著名的问题是背包问题,在背包问题中,你要从人群中找出与给定目标相加的项目组合,通常带有某种约束条件,例如最大化项目的价值。在今天的问题中,我们希望找到第一种可能的组合k个正整数流中的整数,其和为n个例如,给定输入流4、8、9、2、10、2、17、2、12、4、5…,我们希望在读取第三个2后立即找到包含4、2、10,2、2的背包,而不读取其后的12、4和5。

你的任务是编写一个接受参数的程序k个n个和输入流,并返回第一个可能的背包。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

分区

2012年5月11日

整数的分区是所有整数集合的集合,这些整数集合之和等于给定的整数。例如,4的分区是集合的集合((1 1 1 1)(1 1 2)(1 3)(2 2)(4))。我们计算了一个整数在上一次练习。在今天的练习中,我们将列出分区。

这个过程是递归的。只有一个分区0,即空集()。有一个1的单独分区,即集合(1)。有两个2的分区,集合(11)和(2)。有三个3的分区,集合(11)、(12)和(3)。有五个4的分区,集合(1 1 1 1)、(1 1 2)、(13)、(2 2)和(4)。有7个5的分区,集合(11 11)、(11 12)、(12 2)、(13)、(14)、(23)和(5)。在每种情况下,下一个较大的分区集都是通过添加每个整数来确定的x个小于或等于所需整数n个到由n个x个,消除任何重复项。

您的任务是编写一个函数,生成给定整数的所有分区集。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

因子表

2012年5月8日

在计算机出现之前,大多数计算都是借助于表格:对数表、正弦表等等。这些表格无处不在,不可或缺,而且错误百出。需要对数字进行因子分解的数字理论家使用了数字的最小素因子表。最古老的这样的表可以追溯到1603年(它包含了所有数字中最小的素因子,达到750),而新的表则是在1909年德里克·N·莱默(Derrick N.Lehmer)的最小素因子表达到1000万时才开始构建的(他是德里克·H·莱默的父亲);Maarten Bullynck给出了历史这是一个大表格中的示例页面,显示了所有小于1000的数字中的最小素因子;可被2和5整除的数字被省略,素数被跳过:

      0    1    2    3    4    5    6    7    8    9
 1        --    3    7   --    3   --   --    3   17
 3   --   --    7    3   13   --    3   19   11    3
7--3--11 3--7 3--
 9    3   --   11    3   --   --    3   --   --    3
11   --    3   --   --    3    7   13    3   --   --
13   --   --    3   --    7    3   --   23    3   11
17   --    3    7   --    3   11   --    3   19    7
19   --    7    3   11   --    3   --   --    3   --
21    3   11   13    3   --   --    3    7   --    3
23   --    3   --   17    3   --    7    3   --   13
27    3   --   --    3    7   17    3   --   --    3
29   --    3   --    7    3   23   17    3   --   --
31   --   --    3   --   --    3   --   17    3    7
33 3 7--3-13 3--7 3
37----3--19 3 7 11 3--
39    3   --   --    3   --    7    3   --   --    3
41   --    3   --   11    3   --   --    3   29   --
43   --   11    3    7   --    3   --   --    3   23
47   --    3   13   --    3   --   --    3    7   --
49    7   --    3   --   --    3   11    7    3   13
51    3   --   --    3   11   19    3   --   23    3
53   --    3   11   --    3    7   --    3   --   --
57    3   --   --    3   --   --    3   --   --    3
59   --    3    7   --    3   13   --    3   --    7
61   --    7    3   19   --    3   --   --    3   31
63    3   --   --    3   --   --    3    7   --    3
67   --   --    3   --   --    3   23   13    3   --
69    3   13   --    3    7   --    3   --   11    3
71   --    3   --    7    3   --   11    3   13   --
73   --   --    3   --   11    3   --   --    3    7
77    7    3   --   13    3   --   --    3   --   --
79   --   --    3   --   --    3    7   19    3   11
81    3   --   --    3   13    7    3   11   --    3
83   --    3   --   --    3   11   --    3   --   --
87    3   11    7    3   --   --    3   --   --    3
89   --    3   17   --    3   19   13    3    7   23
91    7   --    3   17   --    3   --    7    3   --
93    3   --   --    3   17   --    3   13   19    3
97   --   --    3   --    7    3   17   --    3   --
99    3   --   13    3   --   --    3   17   29    3

例如,该表显示,在标题为9的列和标题为23的行中,923的最小素数是13,997是小于1000的最大素数。要计算一个数的因子,请在表中找到它的最小素因子,用除法计算剩余的余因子,然后重复计算,直到余因子为素。

在建立表格时,最小素因子是通过筛选计算的,而不是通过试验划分。该设置与Eratostennes的Sieve相同,只是使用了整数而不是布尔值,并且筛子中的每个项目都初始化为1。然后是每个连续的最小素数第页已过筛选,但未进行更改真的,在第页已更改为第页(忽略其他值)。与普通筛号相同的优化-仅奇数,从平方开始第页,并在以下情况下停止第页2大于n个-请在此处申请。

您的任务是编写一个筛选最小素因子的函数,并使用该函数编写一个程序来构建如上所述的因子表。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

均匀添加分区

2012年5月4日

我不知道这个问题是从哪里来的;要么是家庭作业,要么是面试问题。尽管如此,这很简单也很有趣:

取一个整数数组并对其进行分区,以便数组中的所有偶数整数都位于数组中所有奇数整数之前。您的解决方案必须在数组大小上花费线性时间,并且只能在恒定的额外空间内就地操作。

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

页:1 2

勒让德符号

2012年5月1日

勒让德符号和它的近亲雅可比符号用于模运算,以确定一个数字是模量的二次剩余.一个数字如果存在数字,则为二次剩余x个这样的话x个2(修订版)且仅在以下情况下定义是共同质数。例如,2(mod 7)用于从0到6是列表02(mod 7)=0,12(mod 7)=1,22(mod 7)=4,32(mod 7)=2,42(mod 7)=2,52(mod 7)=4和62(mod 7)=1,因此7的二次残数为1、2和4(0被排除在外,因为它不是7的同素)。雅可比符号考虑任何奇数模;legendre符号仅限于奇数素数模。符号通常写在括号中结束,如下所示:\左(a \顶部m \右)。有时符号用水平标尺写在,有时它写在一行上(/).

legendre/jacobi符号可以根据以下三个终止规则进行计算:

1. (0 /) = 0

2.(1)/)=1

3. (2 /)=-1,如果mod 8∈{3,5}或1如果模8∈{1,7}

以及以下三个缩减规则:

4.[折减系数2](2/) = (2 /) × (/)

5.[减小模数] (/) = ((修订版) /)如果< 0

6.[减少奇数余素数] (/) = −(/)如果≡3(模4),或(/)否则

因此,如果是二次剩余,-1,如果不是二次剩余,如果不是共同总理。

我们的各种素数程序都使用了legendre/jacobi符号的定义,但这种定义不起作用;对于某些值它返回了错误的结果,对于的其他值它进入了一个无限循环。这个练习解决了这个问题。

您的任务是编写一个函数,使用上述规则计算legendre/jacobi符号。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2