Algorithm 除数的时间复杂度是多少?

Algorithm 除数的时间复杂度是多少?,algorithm,time-complexity,Algorithm,Time Complexity,我使用除法运算 根据时间复杂度的划分(以下之一): 到目前为止,我在Python中使用了这个算法,但我需要在平台上独立地描述它。对于Python(或类似语言)用户来说,这些时间复杂度定义中哪一个是正确的 如前所述,如果基本变量类型使用ALU或FPU 您可以假设除法复杂性为O(1),因为指令开销通常与所用除法的实际运行时相当。如果使用的硬件平台不支持除法(例如一些较旧的MCU),则必须通过程序(而不是单个指令)计算除法,这不再适用 另外,如果您有任意精度变量(bignums),那么实际的数字位或数

我使用除法运算

根据时间复杂度的划分(以下之一):

到目前为止,我在Python中使用了这个算法,但我需要在平台上独立地描述它。对于Python(或类似语言)用户来说,这些时间复杂度定义中哪一个是正确的

  • 如前所述,如果基本变量类型使用ALU或FPU

    您可以假设除法复杂性为
    O(1)
    ,因为指令开销通常与所用除法的实际运行时相当。如果使用的硬件平台不支持除法(例如一些较旧的MCU),则必须通过程序(而不是单个指令)计算除法,这不再适用

    另外,如果您有任意精度变量(bignums),那么实际的数字位或数字宽度开始起作用,并且您不再处于
    O(1)
    中。在这种情况下,请参见#2

  • 大多数除法算法使用乘法作为核心函数

    然后,除法的复杂性由所使用的算法及其使用的组件来定义。例如,如果您有基本变量,但计算除法(不支持硬件除法器),则使用的操作仍然是
    O(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))
    由于速度非常慢,所以没有使用此算法。取而代之的是使用更先进的东西。大多数除法算法使用乘法作为核心函数,因此Schönhage–Strassen和Karatsuba与除法算法相关。见:

    • 我最喜欢的
  • 现在如何确定自定义部门的复杂性?

    取算法的基本复杂度乘以其核心函数的最慢复杂度。如果每次迭代都不使用核心函数,这可能会变得非常棘手在组合/比较复杂性时,不要忘记使用与
    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