2010-09-15 10 views
5

En Programming Pearls (segunda edición) Columna 5, problema 5, la pregunta es sobre la implementación de búsqueda binaria en una matriz no ordenada.Programming Pearls Problema: Comprobación de matriz ordenada en búsqueda binaria

¿Cómo se puede añadir chequeo parcial a la función en significativamente menor que O (n-1) el costo?

Sé que puede verificar con cada iteración y lograr O (log n), pero la sugerencia en la parte posterior sugiere que hay una solución O (1).

¿Cuál es esa solución?

+0

¿Un poco más elaborado? – pavanlimo

Respuesta

4

Resumen

parcialmente comprobar si la matriz está ordenada de modo que la búsqueda binaria es aplicable se puede hacer en O (log n), como dijo el OP, y en O (1). El método O (log n) es verificar cada una de las sondas con la sonda anterior para asegurarse de que se compare adecuadamente (menor que, mayor que). El método O (1) consiste simplemente en comprobar el elemento final encontrado por la búsqueda binaria y el siguiente junto a él, de modo que si no se encuentra el elemento buscado, al menos se encontró el lugar correcto para la inserción. Si se encontró el elemento buscado, entonces esa es una buena O (1) verificación parcial.

más larga explicación

La parte del problema antes de que el bloque de código dice que un problema común es mediante la búsqueda binaria en un array sin clasificar. Básicamente, ¿cómo se puede utilizar la comprobación parcial para verificar si una matriz se ordena en menos de O (n-1) costo?

La solución O (log n) consiste en comprobar cada una de las sondas de búsqueda binarias con respecto a la sonda anterior (es menor o mayor de lo que se espera que sea). Esto no garantiza que la matriz esté ordenada, pero es una buena verificación parcial.

La única verificación O (1) que puedo pensar es comprobar el lugar final que se busca de modo que su valor y los valores vecinos se combinen con la idea de dónde debe estar el elemento buscado, incluso si el elemento no fue encontrado. Es una comprobación parcial bastante buena: si se encuentra el elemento, probablemente las cosas funcionen correctamente. Si no fuera así, compruebe los elementos alrededor de donde debería estar, de manera que haya un elemento menos que el buscado y luego uno que sea mayor que el elemento buscado. Sin embargo, me doy cuenta de que al comprobar de esta manera, significa que la búsqueda binaria, que es O (log n), ya se ha realizado, así que no sé si realmente es O (1). Sin embargo, solo agrega O (1) a la búsqueda general, por lo que creo que es aplicable.

+0

Bien escrito. Me preguntaba si esta podría ser la solución, pero me pareció un poco extraño decir que simplemente verificando el resultado final te permitirá verificar si el arreglo fue ordenado. Lo que esto realmente hace es verificar que, cuando termines, te encuentres en un estado microvalido. Todavía sería posible encontrarse en un valle donde se ordenaron los elementos localmente, pero el elemento que está buscando estaba en otro lugar sin clasificar: [1,2,4,5,6,7,3,10] Si busca 3 usted pensará que esto está ordenado y no lo encontrará [3] – Hortitude

+0

Sí, es por eso que se llama verificación parcial. No garantiza que la matriz esté ordenada, pero probablemente sí. La única manera de verificar completamente es la forma lineal, pero las comprobaciones parciales también pueden ser buenas. –

Cuestiones relacionadas