Me gustaría ampliar la respuesta de Vladislav Zorov para agregar que la sincronización automática no es una propiedad necesaria , y los códigos de sincronización automática son, de hecho, un subconjunto de la categoría más general de códigos de prefijo . Un código de prefijo es aquel que asigna caracteres a palabras de código binario de modo que ninguna palabra de código coincida El prefijo o el comienzo de otra palabra de código. Esencialmente, todas las codificaciones de caracteres a palabras de código binario son códigos de prefijo.
El primer caso, como se usa en codificaciones similares a ASCII, es asegurarse de que su código sea un código de prefijo asegurándose de que todos los caracteres tengan la misma longitud en bits. Si todos los caracteres tienen la misma longitud, ningún carácter puede aparecer como una subcadena de otro en ningún lugar , y mucho menos como un prefijo. La principal ventaja de este método es que es realmente fácil encontrar el comienzo y el final de un carácter (generalmente están alineados en bytes) y, por lo tanto, operaciones como “charAt ()” y “substring ()” no son más difíciles que indexación y corte de matrices. La principal desventaja es que desperdicia espacio y ancho de banda representando caracteres comunes como “” (espacio) usando la misma cantidad de bits que caracteres poco comunes como “²”.
El segundo caso, como se usa en el Código Morse y similares, es asegurarse de que su código sea un código de prefijo mediante el uso de un símbolo ‘fuera de banda’ para indicar un salto de carácter. En la práctica, esto es idéntico a la adición de esta secuencia de bits (que no puede aparecer dentro de una palabra de código) al final de cada palabra de código de caracteres, lo que hace imposible que cualquier carácter sea un prefijo de otro. Este método rara vez se usa en contextos digitales binarios como lo indicó Zorov. La ventaja de espacio de tener longitudes de palabras de código que varían según el uso se pierde tan pronto como se agrega la secuencia de bits de “corte” adicional, por lo que en realidad no hay ventajas en la práctica para este método.
- ¿Por qué no podría ser reemplazada la HCI por sentido común básico?
- ¿Qué tipo de semiosis ocurre dentro de una computadora?
- ¿Cómo la arquitectura de Von Neumann proporciona flexibilidad para el desarrollo del programa?
- ¿Cuál es la mejor computadora para un desarrollador de PHP?
- Dada una matriz de tamaño n, ¿cómo encuentra todos los subconjuntos posibles de la matriz de tamaño k?
El tercer caso, utilizado por UTF-8, es permitir que los caracteres abarquen varios bytes / fragmentos, pero dejar que uno de los bits en cada byte / fragmento indique si este es el último byte en este carácter o si el siguiente byte es parte de El mismo personaje. He usado este método para otros fines en el pasado, y definitivamente tiene muchas ventajas. Si ninguno de los caracteres necesita abarcar múltiples bytes (como si todos fueran ASCII), entonces el acceso aleatorio de tiempo constante todavía es posible como en el primer caso. Esto se pierde tan pronto como un carácter necesita varios bytes, pero dado que los inicios de los caracteres todavía están alineados con los bytes y solo se necesita verificar un bit en cada byte, los tiempos de búsqueda para “charAt ()” aún pueden ser rápidos. Por último, a pesar de que es menos eficiente en espacio que la siguiente estrategia, todavía permite que los personajes más populares tengan representaciones más cortas. En el caso de UTF-8, también se sincroniza automáticamente, debido a que los bits que verifica siempre aparecen en los mismos lugares y sirven como códigos de sincronización.
El cuarto caso, como se usa en los códigos de Hamming, es permitir que la longitud de una palabra de código sea cualquier número de bits y simplemente construir los símbolos de tal manera que se asegure de que sean un código de prefijo. El código de Hamming es en realidad la forma más eficiente de espacio para hacer esto, y construir un código que coincida aproximadamente con los datos de frecuencia de los caracteres utilizados se realiza muy rápidamente en la práctica. No es tan rápido leer una secuencia de caracteres de esta codificación como lo es en los métodos anteriores, ya que los datos tienen que leerse bit por bit, definitivamente es una muy buena compensación de espacio / ancho de banda y velocidad. Además, este método no tiende a sincronizarse automáticamente. Debe ver la transmisión desde el principio para asegurarse de obtener los caracteres correctos.
Existen métodos para codificar cadenas como binarias que no sean códigos de prefijo. La codificación aritmética se conoce como el medio más eficiente en el espacio para codificar cadenas de símbolos en datos de frecuencia dados binarios para su uso, pero elimina por completo la idea de que un símbolo tenga una representación fija. En su lugar, toma la secuencia de bits como representación de un rango de símbolos, con cada bit de lectura reduciéndose a la mitad el espacio de probabilidad en el que está buscando. Un salto de carácter / palabra / símbolo solo se determina cuando el rango cae completamente dentro del rango asignado a un símbolo particular. Los rangos asignados a los símbolos pueden cambiar con cada salida de símbolos si los datos están disponibles para hacerlo. Como resultado, la lectura de una cadena en los símbolos de sus componentes debe realizarse en orden desde el principio y puede ser muy lenta. Sin embargo, el ahorro de espacio y ancho de banda es inmenso. (Probablemente no hace falta decir que no hay nada que se sincronice automáticamente con esta codificación).