Algorithm 除数的时间复杂度是多少?
我使用除法运算 根据时间复杂度的划分(以下之一): 到目前为止,我在Python中使用了这个算法,但我需要在平台上独立地描述它。对于Python(或类似语言)用户来说,这些时间复杂度定义中哪一个是正确的Algorithm 除数的时间复杂度是多少?,algorithm,time-complexity,Algorithm,Time Complexity,我使用除法运算 根据时间复杂度的划分(以下之一): 到目前为止,我在Python中使用了这个算法,但我需要在平台上独立地描述它。对于Python(或类似语言)用户来说,这些时间复杂度定义中哪一个是正确的 如前所述,如果基本变量类型使用ALU或FPU 您可以假设除法复杂性为O(1),因为指令开销通常与所用除法的实际运行时相当。如果使用的硬件平台不支持除法(例如一些较旧的MCU),则必须通过程序(而不是单个指令)计算除法,这不再适用 另外,如果您有任意精度变量(bignums),那么实际的数字位或数
O(1)
,因为指令开销通常与所用除法的实际运行时相当。如果使用的硬件平台不支持除法(例如一些较旧的MCU),则必须通过程序(而不是单个指令)计算除法,这不再适用
另外,如果您有任意精度变量(bignums),那么实际的数字位或数字宽度开始起作用,并且您不再处于O(1)
中。在这种情况下,请参见#2O(1)
,但未使用除法
让我们举个例子
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))
- 我最喜欢的
n
相同的含义强>
如果您无法访问所用算法的源代码,则可以尝试测量BIG一组具有足够大范围n
的数字的除法,并尝试从测量的时间图中估计复杂性。。。这是不可靠的,因为很多事情都会把它搞砸,比如多线程、调度粒度、未知的n
,等等如今,整数除法在CPU(也包括浮点除法)中占用了几个周期,CPU内部是“有线”的,同时有很多并行操作。你的意思是像手动那样编程除法吗?在链接中,你在哪里看到除法有logn?@ringøNo,只是像1/2一样的普通除法。那么什么定义是正确的呢?乘法和除法等算术运算的时间复杂度通常只与任意精度有关。当您最多以64或128位的固定宽度操作时,您可以安全地将其假定为O(1),因为运行时间在几个周期之后被限制。这取决于您考虑的代码>代码> N< /代码>…
variable a=...,b=...,d,r;
for (d=0,r=a;r>=b;) { r-=b; d++; }
// d=a/b
// r=a%b