¿Cómo diseñaría un algoritmo codicioso que conecta cada punto negro con un punto blanco para que la longitud total de los cables utilizados para formar tales pares conectados sea mínima?

Sí, una solución codiciosa resuelve fácilmente este problema. Incluso podemos renunciar a la disposición “igualmente espaciada”.

Suponga que tiene una lista ordenada de las posiciones de punto blanco y las posiciones de punto negro. Entonces debe hacer coincidir el i-ésimo punto blanco con el i-ésimo punto negro.

Para demostrar que esto es óptimo, solo necesitamos demostrar que el punto más a la izquierda debe coincidir con el punto más a la izquierda del color opuesto. Sin pérdida de generalidad, suponga que el punto más a la izquierda es blanco, [math] w_0 [/ math], y estamos tratando de hacer coincidirlo con un punto negro.

Supongamos que tenemos una solución que coincide con [matemática] w_0 [/ matemática] con alguna [matemática] b_i [/ ​​matemática] diferente al punto negro más a la izquierda [matemática] b_0 [/ matemática], y suponga que [matemática] b_0 [/ matemática] fue emparejado con [math] w_j [/ math]. Entonces podemos calcular la coincidencia de estos dos pares como

[matemáticas] C (w_0, b_i) + C (w_j, b_0) = b_i – w_0 + | w_j – b_0 | [/ matemáticas]

Y si intercambiamos los pares obtendríamos el costo

[matemáticas] C (w_0, b_0) + C (w_j, b_i) = b_0 – w_0 + | w_j – b_i | [/ matemáticas]

Hay tres casos dependiendo de la posición relativa de [math] w_j [/ math] entre [math] b_0 [/ math] y [math] b_i [/ ​​math]. Cuando es más pequeño que ambos, los costos relativos se mantienen igual. Cuando es más pequeño que solo [math] b_i [/ ​​math] guarda [math] 2w_j-2b_0 [/ math] intercambiando y cuando es más grande que ambos guarda [math] 2b_i-2b_0 [/ math]. Por lo tanto, siempre debe emparejar el punto más a la izquierda con el punto más a la izquierda del color opuesto que conduce al algoritmo codicioso mencionado anteriormente.

Si formulamos el problema en una variedad de posiciones para los puntos como tales:

[negro, negro, blanco, negro, blanco, blanco]

una solución codiciosa iteraría sobre la matriz y para cada negro la emparejaríamos con el primer blanco que aparece a continuación.

Esta solución no es necesariamente óptima. En el ejemplo anterior, el resultado del algoritmo codicioso sería los siguientes pares (por posición):

(0,2)
(1,4)
(3,5)

Lo que nos da una distancia total de 7.

Una mejor solución podría ser:

(1,2)
(3,4)
(1,5)

con una distancia total de 6.

Ahora, un algoritmo que podría (haciendo hincapié en el poder mientras lo hago fuera de mi mente) probablemente proporcionaría una mejor solución sería iterar sobre la matriz para todos los pares con la distancia 1, que la distancia 2 y así sucesivamente. Además, un enfoque algo codicioso.

Este algoritmo nos permitiría obtener la segunda solución del ejemplo anterior, pero sería peor en cuanto a complejidad.

More Interesting

¿Cuáles son algunas buenas preguntas para la entrevista de C?

¿Es malo usar funciones de lenguaje integradas en entrevistas técnicas?

Cómo mejorar mis habilidades de lenguaje C para que si alguien me hace alguna pregunta sobre C, pueda tener la respuesta a esas preguntas particulares

¿Cuál es la complejidad temporal de este código?

¿Cómo podemos encontrar si una matriz, arr [], tiene dos índices distintos, i y j, donde abs (a [j] - a [i]) <= L y abs (j - i) <= K en O ( N) tiempo y O (K) espacio?

¿Por qué empresas como Myntra / Treebo / Directi permiten que ingenieros muy inexpertos tomen entrevistas técnicas?

Cómo aumentar mi nivel de programación

¿Cuál es la mejor manera de prepararse para la entrevista de Amazon, cuando todos son nuevos en la codificación?

¿Cómo debo manejar una entrevista telefónica de 'pasante de software' por primera vez en mi vida?

¿Debo molestarme en solicitar un trabajo de desarrollador si estoy seguro de que no puedo descifrar la entrevista técnica?

Si menciona en su currículum que tiene un nivel principiante de competencia en un lenguaje de programación en particular, ¿cuánto se espera que sepa?

¿Qué tipo de preguntas debo esperar en una entrevista de Yelp New Grad Software Engineer?

¿Cuáles son algunos sitios web similares a CareerCup que ofrecen preguntas de entrevistas en varias compañías?

¿Puedo considerarme un buen desarrollador si soy malo resolviendo tareas algorítmicas en las entrevistas?

Escriba un programa para contar el número de subárboles de valor único en un árbol dado.