在Advent of Code de 2022的第一天,讨论操作的复杂性与大型
的复杂性有一个有趣的问题第11个问题
第11个问题"macaco no meio"的问题包括遵循一系列步骤,可以以某种方式实现,以模拟发生的事情并计算答案。我建议尝试先解决它。
第1部分的解决
问题的第1部分中没有恶作剧。也许最困难的部分可能是读取输入,因为程序不需要动态,因此本输入的数据可以在方式中固定,而不是读取输入文件的必要条件,从而简化了方式。在其他方面,它正在写出一种方式,使iTees对问题进行了依据。
中所述的行动。第2部分的解决
第2部分等于第1部分,但有两个差异:对项目的关注值不划分3,应计算出更多的回合(从20到10,000)。这些调整很容易做出,在运行程序时,它正在计算并且还没有结束。下面的谷物显示了我实施的解决方案的时间来计算我的计算机135的每轮:
在等级中可以看出,第一轮的时间相对较低,每次,山峰越来越高,山谷也在上升,即,计算新的回合的时间正在增长,因为回合通过了。剩下的问题是因为如果操作相同并且项目数量也有所不同,则会发生这种情况?是什么使代码较慢?
大型库的图书馆
当我完成我的Python程序时,这是我的代码的行为,其他语言可能会出现错误或相对粗鲁,但结果不正确。这是因为,随着程序操纵的一个值的增长,它不再适合某些位(通常是16、32或64位)的差异的空间,并发生在overflow de inteiro。一种处理此问题的方法是使用可以为变体分配更多空间的库,例如,在Python中,这已经是本地实现的。但是为什么它越来越慢?
可以澄清发生的事情的问题是:基本操作的时间(总和,减法,乘法和除法)的复杂性是多少?对于整个类型,这些操作是恒定的时间(O(1)
),当价值不再适合整体,使用整数的成员空间,此操作不再包含。想象一下,手动执行139 + 183
的总和,可以开始添加单元(9 + 3
),然后是数十个(3 + 8 + 1
,考虑到单位中的1
),然后考虑数百个。因此,可以观察到更多的房屋没有,但需要进行操作,因此该总和具有线性复杂性的价值房屋量(Koud5)。尽管计算机使用BAM的数量,但对于处理大型NoºMeros的库,即使一次操作一个或四个字节,基本的基础都会改变。由于事实是,这些值不太适合算法复杂性的一小部分,随着值的增加而增加。
减少要处理的价值
部分仍然有必要解决第2部分,尽管这些库允许您正确执行,但它们不会同时运行。如何才能做到这一点?可以使用一些数学来防止Nammers的增长。由于算法中使用的关注的价值实际上并不重要,但其余的部门对于另一个数字而言,这可以用来减少算法需要交易的关注的价值,因为它的价值操作在较小的轨道中,重复,即使它在无穷大生长,这也使您可以丢弃部分关注点。示例:
0 % 4 == 0
1 % 4 == 1
2 % 4 == 2
3 % 4 == 3
4 % 4 == 0
5 % 4 == 1
6 % 4 == 2
7 % 4 == 3
8 % 4 == 0
9 % 4 == 1
...
39 % 4 == 3
40 % 4 == 0
41 % 4 == 1
...
4000 % 4 == 0
...
porti©m介绍仅显示了一个数字之一。为此,要应用于两个或多个号。有必要找到一个可以划分关注点的值,以使该周期继续正常重复,就像上一个示例中发生的那样。一种简单的方法是将算法需要做的所有分区的所有基础倍增,并且每次计算新的忧虑时,只需在计算的该值中保持其余的分裂。
因此,关注的价值在无穷大中没有增长,并且第2部分的计算迅速。
考虑
算法只能通过与可能固定数量的整数打交道来改变其复杂性。而且,增加所有段落的位数并不有效,因为如果处理器无法一次操作,则必须执行多个操作才能达到结果,它将使代码的执行速度更慢。即使没有,也需要更多的内存。
在本文中,被认为是划分基础值的乘法,是减少关注值的一个因素。 por©m并不总是最优化的值,以确保可以使用这些值的mínimo múltiplo comum。与我的条目一样,所有值都是表弟,共同的母亲和相同结果的值的乘法,而不是更改代码的性能。即使在这个主题上,这也很有趣,因为对其他部门的循环的授予代表也可以是: