2012-01-27 7 views
6

Estoy leyendo algo sobre la búsqueda de una (variedad de) serie (s) en una matriz ordenada de cadenas.Imposible para mí entender un método de búsqueda de cadenas como se describe. ¿Qué es uFFFF?

Dice:

Si usted quiere encontrar todas las cadenas que comienzan con "h", puede ejecutar una búsqueda binaria para la cuerdas "h" y "h \ uFFFF". Esto da todos los índices de la banda para todas las teclas que comienzan con "h". Tenga en cuenta que una búsqueda binaria puede devolver el índice donde estaría la cadena incluso si no está realmente en la matriz.

No entiendo nada de este párrafo.

¿Qué es h\uFFFF cómo ayuda/se usa en la búsqueda binaria y la última frase también significa que incluso esta búsqueda es defectuosa?

¿Alguna ayuda para entender lo que se dice aquí, por favor?

+0

'\ uFFFF' es el valor máximo para un carácter Unicode, no se utiliza como un carácter imprimible –

+0

'\ uFFFF' es una secuencia de escape para el punto de código U + FFFF, que está garantizado por [el estándar] (http: //unicode.org/charts/PDF/UFFF0.pdf) para no ser un personaje. ¿Hay algún uso especial para que se defina en otra parte de lo que estás leyendo? –

+1

@Sam Dehaan: * "\ uFFFF es el valor máximo para un carácter Unicode" * ... Desde Unicode 3.1 hay mucho más de 65 536 puntos de código y un solo Java * char * no es suficiente para representar los nuevos puntos de código. Por ejemplo, el carácter Unicode 'MUSICAL SYMBOL G CLEF' tiene el punto de código Unicode 0x0001D11E (bastante más que 0xFFFF) y necesita dos Java * char * para ser representado: "\ uD8334 \ uDD1E". Esta SNAFU proviene del hecho de que Java (y su tipo primitivo * char *) se definió antes de que saliera Unicode 3.1. En resumen: no, \ uFFFF es definitivamente ** NO ** el valor máximo para un punto de código Unicode. – TacticalCoder

Respuesta

3

\uFFFF es el carácter más grande posible en Java. Dado que las cadenas están ordenadas, la búsqueda de h encontrará el inicio del rango, mientras que h\uFFFF encontrará el final (suponiendo que las cadenas de unicode estén aquí) ya que ningún segundo carácter puede ser mayor que \uFFFF. Incluso si no puede coincidir exactamente con la cadena, la búsqueda devolverá el índice de donde el objetivo sería, incluso si no está realmente allí.

actualización: \uFFFF es el más grande de caracteres Unicode puede ordenar posible en el bloque de 16 bits, si se está trabajando con bloques de 32 bits utilizar U+10FFFF (sea lo que sea en Java). Personalmente, nunca trabajé en bloques Unicode de 32 bits en Java. Consulte la sección 16.7 de the 5.2.0 spec.

U + FFFF y U + 10FFFF. Estos dos puntos de código no característicos tienen el atributo de estar asociado con los valores de unidad de código más grandes para formas de codificación Unicode particulares. En UTF-16, U + FFFF está asociado con el valor de unidad de código de 16 bits más grande, FFFF. U + 10FFFF es asociado con el valor de unidad de código UTF-32 legal más grande de 32 bits, 10FFFF. Este atributo hace que estos dos puntos de código no característicos sean útiles para propósitos internos como centinelas. Por ejemplo, puede ser que sean utiliza para indicar el final de una lista, para representar un valor en un índice garantiza que sea más alto que cualquier valor de carácter válido, y así sucesivamente

+0

¿Entonces este símbolo '\ uFFFF' te ayuda a pasar un carácter en hexadecimal en una 'Cadena'? – Cratylus

+0

que depende del idioma pero "significa" el carácter unicaode que se conoce como "FFFF". SOFTof como ASCII 0xFF ... –

+0

Mire mi última oración para comprender la última oración del extracto. –

9

\ uFFFF es el " carácter "que ordena en último lugar en el" alfabeto "de 16 bits, es decir, después de cualquier letra, carácter o símbolo especial válido.

Cuando realiza una búsqueda binaria de una cadena en una matriz ordenada, encuentra un lugar donde esa cadena podría insertarse. Cuando tiene múltiples cadenas idénticas, obtiene una ubicación antes que la primera. Cuando agregue "la última letra del alfabeto" después de su cadena, el punto de inserción será posterior a la última de las cadenas idénticas, lo que le proporcionará un rango de cadenas idénticas en una matriz ordenada.

Imagínese esto: suponga que no está permitido utilizar la letra Z en sus palabras. Ahora usted tiene una matriz ordenada de cadenas:

0 1 2 3 4 5 6 
aab abb abc abc abd bcx bdy 

Si busca abc, búsqueda binaria le dice que el primer lugar donde se puede insertar, que es 2. Si busca abcZ, thoug, búsqueda binaria haría return 4, porque abcZ viene alfabéticamente después de abc. Esto le permite saber que el rango entre 2, inclusive y 4, exclusivo, está ocupado por la cadena abc. Si ambas búsquedas devuelven el mismo número, sabrá que la cadena no está presente en la matriz.

En el párrafo que citó, \uFFFF juega el papel de la "letra Z prohibida" de mi ejemplo.

+0

Creo que su ejemplo no es correcto. Tiene 'abc' {2} para ser el hijo derecho de root y también tiene' abc' {3} para dejarlo como nieto de 'aab' {root} – Cratylus

+0

En búsqueda binaria dejó a un hijo es '2 * i + 1' y el hijo derecho' 2 * i + 2'. Esto es lo que quiero decir. Corregí mi comentario – Cratylus

+0

@ user384706 Creo que estás malinterpretando mi ejemplo: no hay raíz allí, de hecho, no hay jerarquía de cualquier tipo. Es simplemente un conjunto simple de cadenas ordenadas alfabéticamente en orden ascendente. – dasblinkenlight

1

La secuencia \uFFFF en Java denota el carácter con el punto de código Unicode U + FFFF. Sin embargo, el punto de código no codifica un carácter en absoluto:

U + FFFF se utiliza para representar un valor numérico que está garantizado para no ser un carácter, para usos tales como el valor final al final de un índice .

ver estas referencias: Unicode Technical Report #16, this Unicode character chart y this character definition.

1

Como otras respuestas han especificado, la búsqueda de h se encuentra el inicio de la serie de cadenas que comienzan con h, mientras h\uFFFF se encuentra el extremo (exclusivo) de la gama de cadenas a partir de h en su conjunto de datos.

La última oración significa que la búsqueda de h\uFFFF le mostrará dónde insertaría una cadena de este tipo, si no existe en sus datos, por lo que le otorga el extremo exclusivo de su rango.

Cuestiones relacionadas