算法 – 什么是时间复杂的分裂?

我使用算法与分裂.

根据https://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations,该部门有时间复杂性(以下之一):

O(n log n log log n)
O(n log n 2O(log* n))
O(n**2)
O(M(n))

到目前为止,我在Python中使用此算法,但我需要在平台上独立描述它.对于Python(或类似语言)用户,今天哪个时间复杂度定义是正确的?

最佳答案 >如上所述,如果您将ALU或FPU用于基本变量类型

您可以假设除法复杂度为O(1),因为指令开销通常与所用除法的实际运行时间相当.如果使用的HW平台不支持除法(例如某些旧的MCU),那么它必须通过程序(而不是单个指令)计算,这不再适用.

此外,如果你有任意精度变量(bignums),那么实际数字位或数字宽度开始重要,你不再在O(1)在这种情况下,请参阅#2.
>大多数除法算法使用乘法作为核心函数

然后,使用所使用的算法和组件来定义除法的复杂性.例如,如果您有基本变量但计算除法(没有HW分频器支持),那么使用的操作仍然是O(1)但是使用的除法不是.

我们以Division by repeated subtraction为例.

variable a=...,b=...,d,r;
for (d=0,r=a;r>=b;) { r-=b; d++; }
// d=a/b
// r=a%b

如果n是结果的位宽,那么对于基本变量,这是O(2 ^ n).但是如果变量是任意精度,则使用的操作不再是O(1)这使用减法,比较和增量都是O(n)所以除法复杂度将变为O(n *(2 ^ n))而没有任何改变算法或代码……所以你总是要知道你在谈论什么复杂性

>基算法复杂度O(2 ^ n)
>总复杂度O(n *(2 ^ n))

不使用此算法,因为速度很慢.而是使用更高级的东西.大多数除法算法使用乘法作为核心函数,因此Schönhage-Strassen和Karatsuba与除法算法相关.看到:

> fast bignum sqr for division speed up
>我最喜欢的Approximation divider

>现在如何确定自定义划分的复杂性?

考虑算法的基本复杂性,并将其乘以其核心函数的最慢复杂度.如果每次迭代都没有使用核心函数,这可能变得非常棘手……在结合/比较复杂性时,不要忘记使用相同的n意义!

如果您无法访问所用算法的源代码,那么您可以尝试测量具有足够大的n范围的BIG数字集的除法,并尝试从测量时间图中估计复杂性…这不可靠因为许多事情可以像多线程,调度粒度,未知n等一样搞砸了……

点赞