Recientemente ha surgido un problema en la programación con el que podría beneficiarme enormemente de la experiencia de los matemáticos adecuados. El problema del mundo real es que las aplicaciones a menudo necesitan descargar grandes cantidades de datos de un servidor, como videos e imágenes, y los usuarios pueden enfrentar el problema de no tener una gran conectividad (por ejemplo, 3G) o pueden tener un plan de datos costoso.
Sin embargo, en lugar de descargar un archivo completo, he estado tratando de demostrar que es posible simplemente descargar una especie de "reflejo" del mismo y luego usar la poderosa computación del teléfono inteligente para reconstruir con precisión el archivo localmente usando probabilidad.
La forma en que funciona es así:
La forma en que me imagino es como un cubo de Rubik transparente de 10x10. En tres de los lados, la luz brilla a través de cada fila. Cada celda por la que viaja tiene un valor predeterminado y está activada o desactivada (ya sea 1 o 0 binario). Si está encendido, magnifica la luz por su valor. Si está apagado, no hace nada. Todo lo que vemos es la cantidad final de luz que sale de cada fila, después de viajar a través del cubo desde el otro lado. Usando los tres lados, la computadora necesita determinar qué valores (ya sea 1 o 0) hay dentro del cubo.
Por el momento estoy usando números primos normales como valores de celda para reducir el tiempo de cálculo, pero tengo curiosidad por saber si hay otro tipo de primo (u otro tipo de número completamente) que podría ser más efectivo. Estoy buscando una serie de valores que tenga la combinación más baja posible de componentes dentro de esa serie.
Aquí hay un diagrama aproximado:
Puede ser útil imaginar que la luz brilla en las flechas verdes y sale con algún valor en las flechas rojas. Esto sucede para cada fila, en cada una de las tres direcciones. Nos quedan solo tres lados 2D de números, que se usan para reconstruir lo que hay dentro del cubo.
Si miras donde sale el 14 a la izquierda, puede haber dos combinaciones posibles, (3 + 11 y 2 + 5 + 7). Si por el bien de los argumentos asumiéramos que son 3 y 11 (de color verde), entonces podríamos decir que en la coordenada donde existen 3 y 11, hay celdas activas (aumentando la luz por su valor). En términos de datos, diríamos que está activado (binario 1).
En la práctica, rara vez podemos decir con certeza (para 2 y 3 podríamos) qué valor interno tiene en función de su reflejo en la superficie, por lo que se asigna una probabilidad para cada coordenada o celda. Algunos números nunca se reflejarán en la superficie, como el 1, el 4 o el 6, ya que no pueden estar compuestos únicamente por números primos.
Lo mismo sucede en la dirección vertical, donde la salida es 30, que tiene múltiples posibilidades de las cuales dos corresponden a la posibilidad que se muestra en la dirección horizontal con una salida de 14, de color azul y rosa (ya que dan en el 23, lo mismo que 3 en la dirección horizontal).
Esta probabilidad también se suma a esa coordenada y repetimos en la dirección de adelante hacia atrás, haciendo lo mismo por última vez. Después de hacer esto para cada celda en todo el cubo, tenemos un conjunto de tres probabilidades de que una celda esté encendida o apagada. Luego se usa como punto de partida para ver si podemos completar el cubo. Si no se 'desbloquea' probamos con una combinación diferente de probabilidades y así sucesivamente hasta que hayamos resuelto el Sudoku 3D.
El paso final del método es una vez que se resuelve el cubo, la información binaria se extrae y se organiza en el patrón inverso al que se presentó en el servidor. Luego, esto se puede cortar (por ejemplo, para varias imágenes) o se puede usar para crear un video o algo así. En teoría , podría toser descargar algo como Avatar 3D (280 GB) en unos 3 minutos con wifi decente. Sin embargo, resolverlo (no importa construir la salida de píxeles) llevaría un tiempo, y aquí es donde tengo curiosidad sobre el uso de una alternativa a los números primos.
Es posible que hayas adivinado que mi capacidad matemática va por un precipicio muy empinado más allá de la programación de rutina. Hay tres áreas de preocupación/inconvenientes de este método:
EDITAR:
Gracias por tu útil aporte. Muchas respuestas se han referido al principio del casillero y al problema de demasiadas combinaciones posibles. También debo corregir que un cubo de 1000x requeriría 7 dígitos y no 4 como dije anteriormente, ya que la suma de los primeros 1000 primos es 3682913. También debo enfatizar que la idea no es comprimir en el sentido común de la palabra, como sacar píxeles de una imagen, pero más como enviar planos sobre cómo construir algo, y confiar solo en el cálculo y el conocimiento en el extremo receptor para completar los espacios en blanco. Hay más de una respuesta correcta, y se marcará como correcta la que tenga más votos. Muchas gracias por las detalladas y pacientes explicaciones.
La compresión universal sin pérdidas es imposible, esto no puede funcionar. El conjunto de cadenas binarias de longitud no es inyectiva al conjunto de cadenas binarias de longitud .
Hay cadenas binarias de longitud . Llamemos al conjunto de todas las cadenas binarias de longitud dada . Cuando , hay
Desde , el principio del casillero implica que no existe una función inyectiva del conjunto de todas las cadenas binarias de longitud a cualquier para . Esto significa que un esquema perfecto de compresión sin pérdidas como el descrito es imposible ya que constituiría tal función.
Además, para cualquier número existe una cadena de longitud cuya complejidad Kolmogorov-Chaitin es .
Si asume que este no es el caso, tiene alguna función dónde es un programa que codifica una cadena cuya complejidad . tal que y . También sabemos que . De nuevo por el principio del casillero si todos cadenas de longitud tener un programa cuya longitud es menor que , de los cuales sólo puede haber , debe haber un programa que produzca dos cadenas diferentes, de lo contrario, el conjunto más grande no está cubierto. Nuevamente, esto es absurdo, por lo que al menos una de estas cadenas tiene una complejidad de al menos su propia longitud.
Editar:A las preguntas sobre la compresión con pérdida, parece poco probable que este esquema sea ideal para la gran mayoría de los casos. No tiene forma de controlar dónde y cómo induce errores. Los esquemas de compresión como H.264 aprovechan la estructura visual inherente de una imagen para lograr una mejor fidelidad en tamaños más bajos. El método propuesto elegiría indiscriminadamente una solución para el sistema de ecuaciones que genera, lo que probablemente introduciría artefactos notables. Creo que también es posible que estos sistemas estén sobredeterminados, usando espacio innecesario, mientras que una DCT es una descomposición ortogonal. La solución de estas ecuaciones probablemente también tendría que encontrarse usando un solucionador SAT/SMT, cuyo tiempo de ejecución también haría que la descompresión muy costoso si no intratable, mientras que las técnicas basadas en DCT están bien estudiadas y optimizadas para el rendimiento,
Todo el crédito por una excelente pregunta en la que ha gastado mucha energía creativa. Este es un comentario en lugar de una respuesta porque es demasiado largo para el cuadro de comentarios habitual.
Tiene una idea interesante y continúe investigándola, pero ¿sabía que la compresión de datos ya tiene una base de investigación muy amplia? Es posible que desee investigar en caso de que su idea, o algo similar, ya esté disponible. Hay un artículo de Wikipedia sobre la compresión como punto de entrada al tema.
Algunas observaciones son:
Los archivos de sonido, películas e imágenes utilizados por la mayoría de las aplicaciones están altamente comprimidos, generalmente (pero no siempre) utilizando algoritmos imperfectos con una pérdida de datos asociada. Formatos como zip, jpeg, mp3, mov e incluso png, por lo tanto, no están 'listos para funcionar al recibirlos', pero a veces necesitan un procesamiento extenso antes de su uso. Los algoritmos se han desarrollado mucho en los últimos 50 años y, en algunos casos, son muy sofisticados.
En general, la compresión explota la regularidad en los datos originales (como una foto, donde gran parte de la imagen puede ser similar, o texto donde el mensaje puede usar solo una pequeña cantidad de palabras diferentes) y funciona peor o no funciona en absoluto cuando el archivo los datos son verdaderamente aleatorios.
En algunas aplicaciones, la pérdida de datos puede ser aceptable, por ejemplo, en una imagen o música donde el ojo o el oído realmente no pueden ver ni escuchar pequeñas imperfecciones, y en estos casos se pueden obtener niveles muy altos de compresión (por ejemplo, una reducción del 90 % en el tamaño ). Pero para muchos propósitos, necesita resultados perfectos garantizados, ya que la pérdida de precisión simplemente no será aceptable, por ejemplo, en un archivo de programa de computadora o en un texto. Los datos a menudo todavía se pueden comprimir, aprovechando la regularidad existente, pero no se garantiza un ahorro en todos los casos.
Un comentario final sobre estas observaciones es que aplicar la compresión dos veces rara vez es efectivo porque los datos regulares una vez comprimidos se vuelven mucho menos regulares y menos susceptibles a una mayor compresión, por lo que tratar de comprimir un archivo jpg o mp3 generalmente no ahorrará nada e incluso puede costar espacio. .
Comenzaré confesando que no leí la descripción completa de su esquema de compresión en detalle. Realmente no necesito hacerlo, ya que lo que está tratando de lograr es un esquema de compresión de datos sin pérdidas independiente de la entrada, y eso es imposible.
Teorema 1: no existe un esquema de compresión sin pérdidas que mapee cada archivo de longitud bits a un archivo de longitud inferior a pedacitos
La prueba se sigue fácilmente del principio del casillero y del hecho de que hay archivos distintos de pedacitos pero solo archivos distintos de menos de pedacitos Esto implica que cualquier mapeo de esquema de compresión -archivos de bits a archivos de menos de eso Los bits deben asignar al menos dos archivos de entrada al mismo archivo de salida y, por lo tanto, no pueden tener pérdidas.
Teorema 2: No existe un esquema de compresión sin pérdidas para el cual la longitud promedio de los archivos de salida sea más corta que la longitud promedio de los archivos de entrada (con promedios tomados de todos los archivos de entrada posibles como máximo). bits de longitud, para cualquier entero no negativo ).
Este teorema más fuerte es un poco más complicado de probar. Para ser breve, supondré que está familiarizado con la notación básica de la teoría de conjuntos, como por la unión, para la intersección y por la diferencia de los conjuntos y .
Necesitamos un poco de notación adicional. Específicamente, deja indicar la longitud del archivo , y deja denota la longitud total sumada de todos los archivos en el conjunto . Así, la longitud media de los archivos en es , dónde es el número de archivos en . También para dos conjuntos disjuntos de archivos y .
Ahora deja ser un esquema de compresión sin pérdidas, es decir, una función de asignación de archivos a archivos, vamos ser el conjunto de todos los archivos de longitud máxima pedacitos, y dejar Sea el conjunto de archivos obtenidos aplicando a cada archivo en . Desde no tiene pérdidas, debe mapear cada archivo de entrada en a un archivo de salida distinto; de este modo , y así también .
Desde es el conjunto de todos los archivos como máximo bits de largo, se sigue que si y solo si . De este modo
Además, desde es disjunto de ambos y ,
PD. Entonces, ¿cómo funcionan los esquemas de compresión sin pérdidas del mundo real ? En pocas palabras, se basan en el hecho de que la mayoría de los archivos "naturales" (que contienen datos de imagen o sonido sin comprimir, código de programa, texto, etc.) tienden a ser muy repetitivos y muy diferentes a un archivo aleatorio de longitud similar. Básicamente, esos archivos "naturales" forman solo un pequeño subconjunto de todos los archivos de su longitud, y el software de compresión inteligente puede identificar dichos archivos repetitivos y acortarlos, mientras aumenta (ligeramente) la longitud de otros archivos de entrada de aspecto más aleatorio.
También es posible hacer esto de manera que se garantice que nunca aumentará la longitud de ningún archivo en más de un pequeño número fijo de bits, incluso en el peor de los casos. De hecho, es posible tomar cualquier esquema de compresión sin pérdidas y convertirlo en un esquema que es casi tan eficiente y solo aumenta la longitud de cualquier archivo de entrada en un bit como máximo: simplemente defina
Como otros han señalado, esto no puede funcionar por razones generales.
Sin embargo, puede estar más interesado en comprender dónde se descompone su análisis para este esquema específico.
Considere un cubo de pedacitos En cada fila hay diferentes combinaciones, así que si puedes almacenar valores para cada entrada en uno de los tres lados, en el mejor de los casos puede reducir el número de posibilidades a .
En tu ejemplo para y al usar números primos, debe y puede almacenar no valores reales hasta 7919, sino la suma de los primeros 1000 números primos, lo que requiere 7 dígitos decimales. En cualquier caso, habría 10000000 valores diferentes para codificar diferentes combinaciones, por lo que en el mejor de los casos, un valor en el lado corresponde a diferentes combinaciones de bits en esa fila. Incluso proyectar en las diferentes direcciones no hará una diferencia significativa.
Si desea que esto funcione, necesita muchos más dígitos para almacenar sus sumas, o ir a una dimensión muy alta en lugar de 3. En ambos casos, los datos adicionales requeridos para transmitir serán iguales a nuestra cantidad original de datos.
Extrapolando lo que dijo, el uso de números primos dañará la compresión de datos, no la ayudará.
Supongamos que tenemos una secuencia de 8 bits: ( ).
Podríamos hacer un producto de números primos para codificar esa secuencia de bits: .
Pero ahora el rango de valores posibles de es , que necesitaría 24 bits para representar en notación estándar. Esto es mucho peor que nuestros 8 bits originales.
Sin embargo, los productos de números primos se pueden usar para pruebas matemáticas teóricas: https://en.wikipedia.org/wiki/G%C3%B6del_numbering
Es un comentario, simplemente no encaja.
Como uno de esos tipos con conexiones lentas, agradezco los esfuerzos.
Youtube es bueno para mí exactamente porque tiene videos de 144p, y si algo es interesante o lo necesito, puedo elegir qué xxxp configurar.
Pero tiene sus problemas de conmutación y almacenamiento en búfer que probablemente no tendría si esa variedad de resoluciones se implementara o lograra de manera diferente.
En los viejos tiempos de los módems, se veía con más frecuencia, una imagen que comienza con unos pocos píxeles enormes y luego se detalla a medida que se descargan más datos. No estoy seguro de qué compresión era, pero parece un jpeg con esteroides. Esos fragmentos de datos podrían definirse como n-streams para video o múltiples imágenes, y podría brindar un control más preciso del lado del usuario, pero estableciendo un límite en la cantidad de canales para solicitar, o ajustarlo automáticamente.
Entonces, tal vez mire no en la dirección de cuánto comprimir, sino en cómo controlar la calidad. Todos los formatos de compresión de tasa de bits fija y tasa de bits variable hacen que varíe la calidad o intente mantener la calidad. Pero producen un blob de datos, y administrar diferentes resoluciones puede ser un desafío en el lado del servidor, por lo que el usuario no tiene tantas opciones (me alegro de que haya algunos lugares donde uno tiene), retrasos en la calidad de cambio, etc., etc.
Entonces, tal vez, como sugerencia, aborde el problema desde una perspectiva diferente: un control de calidad más flexible en el lado del usuario y del servidor. Transición más fluida de una calidad a otra y similares.
Las personas con conexiones más lentas ya hacen compromisos y seguro que aprecian los lugares que ofrecen opciones adecuadas. De la misma manera que no hay alternativa para YouTube para mí porque la menor calidad que he visto fue 360p y es de la mejor calidad para mí (con algunas dificultades, si el clima es bueno, por así decirlo) si ellos (alternativas) tienen tales opciones en absoluto . A veces no me importaría 100p o no necesitaría video en absoluto hasta que lo haga, y cuando lo haga, me gustaría no descartar el búfer de 1 minuto ya existente, sino agregarlo para mejorar la calidad.
Por lo tanto, las mejores herramientas, opciones y enfoques para luchar contra todos esos compromisos pueden ser más apreciados que un algoritmo sorprendente que funciona un 10 % mejor que todos los algoritmos existentes en cualquier dato. Al variar la calidad, obtengo una reducción del 90% de los datos la mayor parte del tiempo: cuando los detalles comienzan a ser importantes, entonces sí, es hora de armas pesadas como esperar un búfer y otras opciones disponibles.
En general, intercambiar recursos de usuario por menos transferencia de datos no es imposible, y no es necesariamente un problema puramente matemático, como 5 oraciones que describen un manzano o una imagen, y el lado del usuario ai genera uno o encuentra visualmente similar en un diccionario, etc. Pero es un problema un poco más amplio.
usuario2661923
johnny rockex
johnny rockex
Empy2
johnny rockex
Carlos
kai
Pablo Sinclair
qwr
perezoso furioso
david z
david z
Cort Amón
Cort Amón
johnny rockex
johnny rockex
BlueRaja - Danny Pflughoeft
Bernardo Barker
johnny rockex
Aarón F.
johnny rockex
Bernardo Barker
johnny rockex
Bernardo Barker
Bernardo Barker
Aarón F.
Ave de Artimis
Pedro
usuario253751
johnny rockex
usuario253751
johnny rockex
usuario21820
johnny rockex
usuario21820
johnny rockex
usuario21820
johnny rockex