¿Dada cierta secuencia finita $a_n$ $n \in {1..N}$, hay un método más eficiente para resolver (P1) que el método de fuerza bruta de O($N^2$)?
($P1$) maximizar $n_2-n1$ tal que $a{n1}>a{n_2}$
¿Dada cierta secuencia finita $a_n$ $n \in {1..N}$, hay un método más eficiente para resolver (P1) que el método de fuerza bruta de O($N^2$)?
($P1$) maximizar $n_2-n1$ tal que $a{n1}>a{n_2}$
Esto es $O(N)$.
Si $a_n$ es mayor que todos los elementos antes, llamar a un pico; y si $a_n$ es menor que todos los elementos después de que en un comedero.
Entonces si $(a_i,a_j)$ es un máximo separados par de satisfacciones $a_i>a_j$, sabemos que $a_i$ debe ser un pico (de lo contrario no sería un elemento anterior $a_k$ tal que $a_k>a_j$); y de manera similar, $a_j$ debe ser un comedero.
Así que aquí está el algoritmo:
Tenga en cuenta que podemos iniciar el análisis en el Paso 4 el valor de $t$ en la iteración anterior, por lo que el número total de operaciones de utilizado por los que paso en el algoritmo es $O(N)$.
Editado para añadir: De hecho, podemos omitir el Paso 1, y con tan solo escanear el siguiente pico en el Paso 6. (No podemos omitir el Paso 2, ya que la digitalización de los comederos que se ha hecho al revés.)
Yo creo que se puede hacer esto en $O(N \log N)$, pero puede haber una manera más rápida. Aquí es un alto nivel de descripción del algoritmo:
[3, 1, 4, 2]
, se almacenaría como [(3,0), (1,1), (4,2), (2,3)]
. Este va a ser $O(N)$[(4, 2), (3, 0), (2, 3), (1, 1)]
. Esto se puede hacer en $O(N\log N)$Total de complejidad = $O(N \log N)$.
Creo que los pasos a $1$ $2$ son bastante auto explicativo. Si eres curioso acerca de cómo paso a $3$ se puede hacer en $O(N)$, aquí está el código:
def max_diff_indexes(arr):
"""
@params:
arr - This is just an array of the SECOND parts of the tuple in
the algorithm described above. That is, arr contains only ints
representing the second values of the tuple (index field) after
the sorting in step 2.
@return:
max_pair - Returns a pair of indexes n_1 and n_2 that maximise
n_2 - n_1 such that a_{n_1} > a_{n_2}. The first property is
ensured by this algorithm while the second property in ensured
by the fact that the array was initally sorted in decresing order
of value
"""
if not arr: return None
min_val = arr[0]
max_diff = 0
for elem in arr:
max_diff = max(elem - min_val, max_diff)
min_val = min(elem, min_val)
max_val = max_diff - min_val
return min_val, max_val
Bien, me llevó a una grieta en mí mismo y me encontré con el siguiente enfoque que parece ser $O\big( (N/M)^2 + N \log(N) \big)$ donde $M$ es el valor óptimo de (P1).
Bucle de la siguiente$k$$1,2,\dots$:
Cada una de las $k$th iteración requiere: $O\big( N+ 4^k\big)$ operaciones, por ello la suma sobre todos los necesarios $k$ da la total complejidad de la $O\big((N/M)^2 + N \log(N) \big)$, donde el ex término domina para las pequeñas $M$ y los últimos términos domina por $M \gtrsim \sqrt{N}$.
I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.