¿Cuántas veces es más rápida la búsqueda binaria que la búsqueda secuencial cuando se busca el elemento 592 en una lista de 1024 elementos?

El problema, como se indicó, es impreciso. Supongamos que está buscando un elemento en particular por valor, y la “lista” es una matriz ordenada, y lo único que importa es la cantidad de comparaciones. (Es completamente posible que en la práctica la búsqueda secuencial pueda ser más rápida en un problema de tamaño 1024, por ejemplo, en una máquina de ejecución ultra-canalizada o paralela).

Quizás una fuente de error es que está comparando el peor de los casos con el comportamiento real. No siempre toma 10 comparaciones en la búsqueda binaria, y no siempre toma exactamente 592 comparaciones en la búsqueda secuencial.

Comparando el peor de los casos, podríamos decir que la búsqueda binaria es 1024/10 = aproximadamente 100 veces mejor.

Si en su lugar trabajamos a través de la búsqueda binaria elemento por elemento, entonces podríamos obtener un número exacto de comparaciones que difiere de 10. Dean Carpenter trabajó en el ejemplo y mostró que solo se necesitan 6 comparaciones para encontrar 592, pero esto depende de que siempre escojamos n / 2 para verificar primero, no n / 2-1 (es decir, mirando el índice 512 en lugar de 511).

Usé la sintaxis de Swift (aproximadamente) para describir mi respuesta a continuación …

var num = 1024
num / 2/2/2/2/2/2/2/2/2 = 2
Esta es la forma binaria. Sigue dividiendo por la mitad y eliminando la mitad en la que no está el número objetivo. Si lo hace, le tomará 9 conjeturas para encontrar el número 592. El máximo que obtendrá es 10.

Si lo haces de forma secuencial, vas
var num = 1 + 1 + 1 + 1 … en cada punto, verificando si el resultado es igual a tu objetivo.

Entonces su respuesta es 592 secuencialmente y 9 usando búsqueda binaria. Para saber cuántas veces más rápido es, divide 9 en 592, lo que equivale a 65.7777777777778. Entonces diría que es aproximadamente 66 veces más rápido.

Podría estar equivocado, pero así es como lo entiendo. Por cierto, hay un gran curso sobre Algoritmos en la academia Khan, lo que explica esto mucho mejor que yo.

Me gustaría agregar la función que escribí para hacer esto …


func doSearch (arr: [Int], targetValue: Int) -> Int {
var min = 0
var max = recuento de arr. – 1
var guess: Int
var numGuesses = 0
while (max> = min)
{
adivinar = Int ((min + max) / 2)
if (arr [guess] == targetValue) {
numGuesses ++
volver adivina
}
if (arr [adivinar] numGuesses ++
min = adivinar + 1
} más {
numGuesses ++
max = adivinar – 1
}
println (“Número total de conjeturas = \ (numGuesses)”)
}
volver -1
}

var arr1: [Int] = []
para (var i = 0; i <1024; i ++) {
arr1.append (i)
}
var res1 = doSearch (arr1, 592)
var num = 1024
num / 2/2/2/2/2/2/2/2/2 // <- Aquí obtengo 2

var num2 = 592.0 / 9 // <- aquí es donde obtengo 65.7777777777778
// si hiciste 592.0 / 10 porque 10 es el máximo de intentos que obtendrías 59.2

El resultado que obtengo en la consola es esto debido a las declaraciones println ():
/////////////////////
Número total de conjeturas = 1
Número total de conjeturas = 2
Número total de conjeturas = 3
Número total de conjeturas = 4
Número total de conjeturas = 5
Número total de conjeturas = 6
Número total de conjeturas = 7
Número total de conjeturas = 8
Número total de conjeturas = 9

Si se trata de una lista (vinculada), debe pasar la mitad de los elementos para el primer paso y 1/4 para el segundo, etc. Al final tendrías que revisarlos todos, lo cual es peor que la búsqueda lineal.

¿O quisiste decir vector?

1: 512-1024 (512)
2: 512-768 (256)
3: 512-640 (128)
4: 576-640 (64)
5: 576-608 (32)
6: 592! (dieciséis)
Cuando sigues sus pasos, descubres que solo son 6 iteraciones para encontrar el objetivo. Tienes suerte; eleva su límite inferior a 512 en el primer paso, luego a 576 en el cuarto, lo que significa que cuando intenta agregar 16 a 576 en el paso 6, termina girando en 592, lo que significa que tropieza con lo que estaba buscando .

More Interesting

¿Cuáles son los mejores libros de matemáticas gratuitos para graduados de CS?

¿En qué circunstancias necesitaría un desarrollador web utilizar estructuras de datos como Listas vinculadas, BST y Gráficos?

¿Cómo se puede escribir un programa Java que imprima un conjunto completo de las primeras cuatro tablas de multiplicación (hasta 12) organizadas en columnas?

Si tengo una variable, X, en un modelo de regresión que se calcula usando otras tres variables (X = 0.3X1 + 0.5X2 + 0.2X3), ¿está bien que regrese 0.3X1, 0.5X2 y 0.2X3 por separado?

¿Cuándo fue la última vez que se descubrió el número primo más grande sin la ayuda de una computadora?

¿Por qué los programas de posgrado estadounidenses en matemáticas, estadística y CS están dominados por estudiantes internacionales?

¿Cuáles son algunos de los divertidos libros de matemáticas que puede leer una persona de nivel secundario?

¿Es correcto que 'todos los lenguajes de computadora converjan a LISP'? ¿Por qué?

¿Cuál es la ecuación matemática correcta para el siguiente problema informático?

¿Alguien puede explicar paso a paso cómo se puede resolver el siguiente problema?

¿Cuál es la mejor manera de estudiar programación y matemáticas de libros o mirar tutoriales?

¿Qué tipo de matemáticas debo estudiar para comprender mejor la teoría detrás de la programación?

Cómo resolver [matemáticas] (n + k) ^ j = \ Theta (n ^ j) [/ matemáticas] para k, j en números reales y j> 0

¿Cuál es el significado de bucket = Math.abs (x.hashCode () * p)% tablesize en Java?

Cómo analizar un archivo de texto en Python y obtener la suma de los números presentes en el archivo