¿Cuál es el tiempo de complejidad de una iteración a través de todas las posibles secuencias de una matriz

abeja Danny:

Un algoritmo que pasa a través de todas las posibles secuencias de índices dentro de una matriz.

complejidad de tiempo de un solo bucle y es lineal y dos bucles anidados es O cuadrática (n ^ 2). Pero lo que si otro bucle se anida y pasa a través de todos los índices separados entre estos dos índices? Se eleva la complejidad del tiempo a O cúbico (n ^ 3)? Cuando N es muy grande, no parece que haya suficientes iteraciones para considerar la complejidad cúbica sin embargo, parece demasiado grande para ser O cuadrática (n ^ 2)

Aquí es el algoritmo considerando N = longitud de la matriz

for(int i=0; i < N; i++)
{
    for(int j=i; j < N; j++)
    {
        for(int start=i; start <= j; start++)
        {
          //statement
        }
    }
}

Aquí es un simple visual de las iteraciones cuando N = 7 (que continúa hasta i = 7):

introducir descripción de la imagen aquí introducir descripción de la imagen aquí

Y así..

Should we consider the time complexity here quadratic, cubic or as a different size complexity?

btilly :

Short answer, O(choose(N+k, N)) which is the same as O(choose(N+k, k)).


Here is the long answer for how to get there.

You have the basic question version correct. With k nested loops, your complexity is going to be O(N^k) as N goes to infinity. However as k and N both vary, the behavior is more complex.

Let's consider the opposite extreme. Suppose that N is fixed, and k varies. If N is 0, your time is constant because the outermost loop fails on the first iteration.. If N = 1 then your time is O(k) because you go through all of the levels of nesting with only one choice and only have one choice every time. If N = 2 then something more interesting happens, you go through the nesting over and over again and it takes time O(k^N). And in general, with fixed N the time is O(k^N) where one factor of k is due to the time taken to traverse the nesting, and O(k^(N-1)) being taken by where your sequence advances. This is an unexpected symmetry!

Now what happens if k and N are both big? What is the time complexity of that? Well here is something to give you intuition.

Can we describe all of the times that we arrive at the innermost loop? Yes! Consider k+N-1 slots With k of them being "entered one more loop" and N-1 of them being "we advanced the index by 1". I assert the following:

  1. These correspond 1-1 to the sequence of decisions by which we reached the innermost loop. As can be seen by looking at which indexes are bigger than others, and by how much.
  2. The "entered one more loop" entries at the end is work needed to get to the innermost loop for this iteration that did not lead to any other loop iterations.
  3. If 1 < N we actually need one more that that in unique work to get to the end.

Now this looks like a mess, but there is a trick that simplifies it quite unexpectedly.

The trick is this. Suppose that we took one of those patterns and inserted one extra "we advanced the index by 1" somewhere in that final stretch of "entered one more loop" entries at the end. How many ways are there to do that? The answer is that we can insert that last entry in between any two spots in that last stretch, including beginning and end, and there is one more way to do that than there are entries. In other words, the number of ways to do that matches how much unique work there was getting to this iteration!

Y lo que significa es que el trabajo total es proporcional a O(choose(N+k, N))la cual es también O(choose(N+k, k)).

Vale la pena saber que a partir de la aproximación normal a la fórmula binomial, si N = kentonces este resulta ser O(2^(N+k)/sqrt(N+k))que de hecho crece más rápido que el polinomio. Si necesita una aproximación más general o precisa, puede utilizar la aproximación de Stirling para los factoriales en choose(N+k, N) = (N+k)! / ( N! k! ).

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=178024&siteId=1
Recomendado
Clasificación