Supongamos que tengo una lista de cadenas, donde cada cadena esAl encontrar los píxeles que hacen que una imagen sea única dentro de una lista, ¿puede mejorar la fuerza bruta?
- exactamente 4 caracteres de largo y
- único dentro de la lista.
Para cada una de estas cadenas, deseo identificar la posición de los caracteres dentro de la cadena que hacen que la cadena sea única.
Así que para una lista de tres cuerdas
abcd
abcc
bbcb
Para la primera cadena que quiero para identificar el carácter en cuarta posición d desde d no aparece en la cuarta posición en cualquier otra cadena.
Para la segunda cadena, quiero identificar al personaje en la 4ta posición c.
Para la tercera cuerda que yo quiero para identificar el carácter en primera posición b y el carácter en 4ª posición, también b.
Esto podría representarse de forma concisa como
abcd -> ...d
abcc -> ...c
bbcb -> b..b
si se considera el mismo problema pero con una lista de números binarios
0101
0011
1111
A continuación, el resultado que quiero sería
0101 -> ..0.
0011 -> .0..
1111 -> 1...
Manteniéndome con el tema binario, puedo usar XOR para identificar qué bits son únicos dentro de dos números binarios desde
0101^0011 = 0110
que puedo interpretar en el sentido de que en este caso la 2ª y 3ª bits (lectura de izquierda a derecha) son únicos entre estos dos números binarios. Esta técnica podría ser una pista falsa, a menos que de alguna manera pueda extenderse a la lista más grande.
Un enfoque de fuerza bruta sería mirar cada cuerda a su vez, y para cada cadena iterar a través de las divisiones verticales del resto de las cadenas en la lista.
Así que para la lista
abcd
abcc
bbcb
Me gustaría empezar con
abcd
y recorrer las rebanadas verticales de
abcc
bbcb
donde serían estos cortes verticales
a | b | c | c
b | b | c | b
o en forma de lista, "ab", "bb", "cc", "cb".
Esto daría lugar a cuatro comparaciones
a : ab -> . (a is not unique)
b : bb -> . (b is not unique)
c : cc -> . (c is not unique)
d : cb -> d (d is unique)
o concisa
abcd -> ...d
Tal vez sea una ilusión, pero tengo la sensación de que no debe haber una solución elegante y general que se aplicaría a una lista arbitrariamente grande de cadenas (o números binarios). Pero si es que aún no he podido verlo.
Espero utilizar este algoritmo para derivar firmas mínimas de una colección de imágenes únicas (mapas de bits) con el fin de identificar de manera eficiente esas imágenes en el futuro. Si la eficiencia futura no fuera una preocupación, usaría un hash simple de cada imagen.
¿Se puede mejorar la fuerza bruta?
Editar El enfoque que estoy calentando a es la construcción de un mapa de píxeles para imágenes
sprawl[Tuple<x=10, y=33,color=f1fefd>] => {
image17,
image23,
...
}
sprawl[Tuple<x=10, y=34,color=f1fef0>] => {
image11
...
}
y luego usar ese mapa para identificar el conjunto mínimo de píxeles de firma para cada imagen.
Si un píxel (identificado por x, y, color) hace referencia a una sola imagen, entonces he encontrado una firma perfecta (mínima) para esa imagen.
Es más complicado si una imagen no tiene píxeles únicos, pero como sé que todas las imágenes son únicas dentro de la lista, podría combinar dos o más referencias de píxeles (pero la menor cantidad posible) para deducir la imagen.
actualización
He estado trabajando en un algoritmo para esto. Mi problema es muy similar al this one, y he escrito mi algoritmo como answer to that question. Esta actualización es para llamar la atención de cualquier persona que siga (veo cinco marcadores). Estoy trabajando en esto de forma aislada, por lo que cualquier comentario es bienvenido, ¡aunque solo sea para observar que no me he aclarado!
Si agrega bbcd a la lista, algunos de sus elementos no tendrán caracteres únicos. ¿Cómo afectará esto a tu objetivo? –
@Kathy En ese caso, no podría derivar las firmas que busco. Para la aplicación en la que espero utilizar este algoritmo, ese escenario es posible pero poco probable. –
@Ed Guiness, ¿puedes describir la parte "identificar de manera más eficiente las imágenes en el futuro"? ¿Obtendrá alguna imagen y tendrá que decir si está entre las que tiene una firma? ¿O se te pedirá que encuentres una imagen específica (para la que tienes una firma) dentro de un determinado conjunto de imágenes desconocido? Si lo primero, entonces lo estás haciendo mal. Si esto último, entonces su idea de una firma es buena (factible o no). –