Algoritmos para eliminar columnas por diferencias

Algoritmos, fórmulas, estadísticas...
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

OPTIMIZANDO DE NUEVO

Mensaje por JoanD »

La formula anterior requiere conocer el signo que tiene una columna en un determinado partido. Esto nos obliga a calcular igualmente la cadena en base 3 para poder conocerlo.

¿Se puede calcular el signo de una columna de la que sólo conocemos su valor decimal sin necesidad de convertir el valor a base 3?. Si esto fuera posible podríamos trabajar con números decimales sin necesidad de hacer cambios de base con el consiguiente ahorro de tiempo.

Pues bien, sí se puede.

Dado el numero decimal N, el signo correspondiente al partido situado en la posición P de la columna se calcula de la siguiente manera

ValorDigito = (N \ 3^(P - 1)) Mod 3

Observaciones: La división de la expresión és una división entera. El resultado es un número ente 0 y 2 que representa a “1”, “X”, “2” según los gustos de cada cual.

Substituyendo el ValorDigito en la formula para obtener el número decimal de una columna que se diferencia en un solo signo obtenemos la siguiente expresión:

N + 3^(pos-1)*(i-(N \ 3^(P - 1)) Mod 3)

Con ello todavía he vuelto a rebajar mas el tiempo de respuesta. Como siga optimizando al final será instantáneo. 800.000 apuestas se reducen a distancia 3 en 2 minutoS y 40 segundos en un Pentium II.
Avatar de Usuario
Doctorpi
12
12
Mensajes: 2660
Registrado: Mié 15 Oct, 2003 6:14 pm
Contactar:

Diferencias de columnas en MQ

Mensaje por Doctorpi »

Hola a todos
Si quereis testear resultados, podeis probar con MQ de la siguiente manera.
Poned en pronostico 14Triples
En columnas base, escoged vuestra columna y para obtener las columnas que se diferencian en X resultados, marcad 14-X aciertos.
Un saludo
PD: en MQ no es instantaneo pero tarda 5 o 6 segundos creo.
Dr.Pi
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

No es comparable con lo que estamos proponiendo.
Si partimos de una columna base y le pido 11 aciertos, efectivamente tendran 3 signos distintos con la base, pero no tendran necesariamente 3 ó mas signos distintos entre ellos.

También influirá el procesador, no es lo mismo hacer la prueba en un Pentium II que en un Pentiu IV.

Tambien influirá el lenguaje de programación empleado. Con el mismo algoritmo se obtiene mayor velocidad si se programa en ASM o C++ que si se programa en Visual Basic.

De todos modos, DoctorPi, nos estas dando a entender que todavia existe un cuarto método y quizás mas rápido, es eso ¿no?.

Con el método nº 3 que he expuesto se ha eludido los millones de comparaciones entre dos columnas y por ello se ha mejorado la velocidad. Con métodos que hagan estas comparaciones, para reducir los tiempos, hay que atacar al algoritmo de comparación, como bien sugerias en tu anterior post, pero le estoy dando vueltas y no doy con ello. Incluso si incorporo una sentencia IF THEN para finalizar el cálculo de diferencias cuando se sobrepasa un valor, estoy reduciendo tiempo al no hacerlas todas pero estoy aumentandolo, también, al tener que ejecutar la comprobación en cada iteración.
Avatar de Usuario
Doctorpi
12
12
Mensajes: 2660
Registrado: Mié 15 Oct, 2003 6:14 pm
Contactar:

Mea culpa... :o((

Mensaje por Doctorpi »

Perdona JoanD tienes razon habia leido mal el enfoque.
De todas maneras, cuando en un email anterior te decia que no hacia falta hacer 14 comparaciones no me referia a que cuando tienes mas de 3 diferencias paras, sino que hay otras maneras a tener que comparar los 14 signos de una columna con los otros 14.
Esto es solo un ejemplo para que pongas en marcha tu imaginacion, no quiero decir que este sea el metodo, pero...
Imaginate que tuvieras una tabla de 3^14 quin x 3^14 quin en donde estuviera guardado el numero de diferencias.Al tener 2 quinielas, solo deberias tener su equivalente numerico y buscar en la tabla el numero de diferencias. Si ademas guardaras las quinielas en ese formato numerico, te ahorrarias el paso de convertirlas.
A ver que se te ocurre....
Un saludo
Dr.Pi
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

Uuuuuyyyyy, Dr. Pi con estas pistas que me habeis dado se me ha encendido una lucecita pero si resulta que al final descubro vuestro secreto ¿tendras problemas con el jefe?.

Creo que se pueden comparar los 14 signos haciendo sólo 3 comparaciones pero no sigo para no ponerte en un compromiso. Yo de todos modos me doy por satisfecho.
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Encontrar apuestas que se diferencian en uno o mas signos

Mensaje por JoanD »

Veo que hay interés por el tema. Para encontrar apuestas que se diferencian en uno o mas signos podemos usar la técnica anteriormente explicada en el método nº 3 y usar una función recursiva que encuentre, cada vez que se llama, las apuestas que se diferencian en un signo.

Si tenemos esta columna: 11111
para encontrar las que se diferencian en un signo hay que variar cada vez un signo empezando por el primer partido y acabando por el último:

x1111
21111
1x111
12111
11x11
11211
111x1
11121
1111x
11112

Si lo que queríamos era encontrar columnas que se diferencian en dos signos de "11111" hay que coger cada una de las que se diferencian en un signo y hacer variar los signos de los partidos que tiene a su derecha, por ejemplo si tenemos la columna 11x11 que se diferencia en un signo de la 11111, como el signo distinto está en la posición 3, vario unicamente los de la posición 4 y 5:

11xx1
11x21
11x1x
11x12

Por lo tanto la función recursiva tiene 3 parámetros: el primero es para indicar la columna sobre la que se hace la variación, en nuestro caso es el valor decimal que representa la columna; el segundo es el partido a partir del cual debemos hacer las variaciones de signos; y el tercero es la profundidad que coincide con el numero de diferencias que se quiere encontrar.

La función en visual basic es la siguiente:

Private Sub EncontrarDistantes(IndiceInicial As Long, PosicionInicial As Integer, pProfundidad As Integer)

      Dim SigIni As Integer
      Dim partido As Integer
      Dim z As Integer
      Dim Indice As Long

      'Flags() es el vector de indicadores para cada una de las apuestas posibles. Es una variable global
      'Indice es el valor decimal de la apuesta encontrada que se diferencia en un signo

      'pot() es un array de 14 elementos con las potencias de 3

      Static Profundidad As Integer

      Profundidad = Profundidad + 1

      '--encontramos las apuestas que se diferencian en un solo signo ----
      For partido = PosicionInicial To 14
           SigIni = (IndiceInicial \ pot(partido - 1)) Mod 3

           Contador = 0
           For z = 0 To 2
                If z <> SigIni Then
                     Contador = Contador + 1
                    
Última edición por JoanD el Sab 19 Nov, 2005 1:06 pm, editado 3 veces en total.
coarma
10
10
Mensajes: 53
Registrado: Sab 18 Oct, 2003 7:49 pm

Mensaje por coarma »

Hola Joan ( tengo pendiente contestarte)
Pego aquí un procedimiento para hallar las columnas con premio de una columna, o sea 1+28+364+2912 = 3.305 (faltan los 10).

Este procedimiento no es recursivo, sólo utiliza bucles for, tengo entendido que los procedimientos recursivos son más lentos que los bucles, pero no sé cual será más rapido. Funcionará con solo pegarlo en un módulo.

Graba las columnas en un archivo de texto, pero desordenadamente, fácilmente puede adaptarse para meter en archivos o matrices los 13, 12,11 por separado, o anular el 11,12.....

Public Sub colPremios()

'************************************************************
'algoritmo para hallar las columnas con premio de una columna
'de 14 a 11, faltan los 10
'columna con 15 partidos

'autor "coarma", 2002
'*************************************************************

Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim m As Integer
Dim k2 As Integer
Dim columnab As String * 15
Dim columnatemp As String * 15
Dim columnaant As String * 15
Dim columnaant2 As String * 15
Dim matrizColumnab(1 To 15) As String * 1
Dim matrizSigno(1 To 15) As String * 1
Dim matrizSigno2(1 To 15) As String * 1

'(implementación de la columna inicial)
'Este algoritmo es para una sola columna, para varias se hace un bucle leyendo de
'de fichero: line input columnab o de matriz.


columnab = "212X1X11211X111" 'columna de ejemplo
columnatemp = columnab

For k = 1 To 15 'mete la columna texto en matriz
matrizColumnab(k) = Mid(columnab, k, 1)
Next

Open "ColPremios.txt" For Output As #1 'abre archivo para grabar las columnas
Print #1, columnab 'columna inicial



For k = 1 To 2 'dos cambios de signo por cada posición
Select Case k
Case 1
For k2 = 1 To 14 'identifica y cambia signos
Select Case matrizColumnab(k2)
Case "1"
matrizSigno(k2) = "X"
matrizSigno2(k2) = "2"
Case "X"
matrizSigno(k2) = "1"
matrizSigno2(k2) = "2"
Case "2"
matrizSigno(k2) = "1"
matrizSigno2(k2) = "X"
End Select
Next
Case 2
For k2 = 1 To 14
Select Case matrizColumnab(k2)
Case "1"
matrizSigno(k2) = "2"
matrizSigno2(k2) = "X"
Case "X"
matrizSigno(k2) = "2"
matrizSigno2(k2) = "1"
Case "2"
matrizSigno(k2) = "X"
matrizSigno2(k2) = "1"
End Select
Next
End Select

For i = 1 To 14
Mid(columnatemp, i, 1) = matrizSigno(i)
Print #1, columnatemp 'las de 13
columnaant = columnatemp

For j = i + 1 To 14 'las de 12
Mid(columnatemp, j, 1) = matrizSigno(j)
Print #1, columnatemp
columnaant2 = columnatemp
For m = j + 1 To 14 'de 11
Mid(columnatemp, m, 1) = matrizSigno(m)
Print #1, columnatemp
Mid(columnatemp, m, 1) = matrizSigno2(m)
Print #1, columnatemp
columnatemp = columnaant2
Next

Mid(columnatemp, j, 1) = matrizSigno2(j)
Print #1, columnatemp 'de 12
columnaant2 = columnatemp
For m = j + 1 To 14 'de 11
Mid(columnatemp, m, 1) = matrizSigno2(m)
Print #1, columnatemp
Mid(columnatemp, m, 1) = matrizSigno(m)
Print #1, columnatemp
columnatemp = columnaant2
Next
columnatemp = columnaant
Next
columnatemp = columnab
Next
Next

Close #1


End Sub
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

Muchas grácias Coarma, siempre es bueno tener toda la gama de posibles planteamientos. En este caso tenemos uno recursivo y otro no. Yo tambien tengo entendido que los procediemientos recursivos son mas lentos, pero en este caso como mucho se llama 4 veces a si misma (en el caso mas desfavorable de buscar los de 4 diferencias) por lo que no consume demasiada pila. A mi me va muy rápido. Cuando pueda probaré el tuyo.
[Nomada]

Mensaje por [Nomada] »

Gracias a los dos por los algoritmos, no es que no sepa como hacerlo, me sirven los dos y ya los aplicare a donde deben de ser, os mantendre informados respecto a los logros que se consiguen.

Suerte

Un saludo
Pinfly
10
10
Mensajes: 60
Registrado: Mié 12 Nov, 2003 11:48 pm
Ubicación: Olot

METODO DE REDUCCION AL BIT.

Mensaje por Pinfly »

Idea extaida de mis estudios de electronica.

Se trata de comprimir las columnas a traves de un metodo de cifrado para que ocupen menos espacio. Luego se podrian cargar en memoria.

Los signos 1,X,2 son de tipo (char) y ocupan 1 byte en memoria. Para una columna son 14 bytes mas el retorno de carro y el cambio de linia. Total 16 bytes por columnas.

Como podriamos poner mas signos en un solo byte ?
Alguien se acuerda del sistema binario?

Segun mis calculos haria falta 1 byte para poder realizar 5 triples. y nos sobrarian 13 bits de los 256 que contiene un byte.

* 1 byte = 256 bits


5 triples = 243 bits
5 triples = 243 bits
4 triples = 81 bits
+
-------------------------------
14 triples = 567 bits

567 / 256 = 2.21 bytes

******************************
**** 3 bytes para 14 triples. ******
******************************

Metodo antiguo : 16 bytes por columna.
Metodo prueba : 3 bytes por columna.

5.33 veces más de memória con este metodo.
Eso significa que si se pueden cargar las columnas en memoria, se multiplica la velocidad.


Cabe destacar que el algoritmo de cifrado debe ser lo suficientemente rapido como para soportar un barrido de columnas tan brutal como el que deseamos hacer.

NOTA : Para aumentar la velocidad de forma considerable, no pongais rutinas de deteccion de teclado dentro de los bucles principales. Una buena manera de poner un rutina de teclado seria creando un contador de tipo INT ( el float es mas lento ) y cuando llegue a 32.000 compruebe el teclado y se ponga a 0. este tipo si se podria poner dentro del bucle principal porque no se comprueba cada vez.

OTRA NOTA : es mejor guardar las columnas resultantes en memoria y guardarlas todas de golpe en disco cuando se detecte que se llega al final de la memoria, en lugar de ir escribiendolas cada vez.
Pinfly
10
10
Mensajes: 60
Registrado: Mié 12 Nov, 2003 11:48 pm
Ubicación: Olot

Mensaje por Pinfly »

Si alguien encuentra la manera de poder reducir esto a 2 bytes en lugar de 2.21 que me lo diga.

INT = 2 bytes

Se podrian representar las columnas como INT.
Muchisimo menos trabajo de cifrado.
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

Con 2 bytes sólo puedes llegar a generar 65.536 valores distintos y como necesitamos 4.782.969 resulta imposible.

Ahora bien, si pudieramos tener un array de bits, en lugar de bytes, se podria ajustar a la memòria estrictamente necesaria. Pensaré en ello.
Pinfly
10
10
Mensajes: 60
Registrado: Mié 12 Nov, 2003 11:48 pm
Ubicación: Olot

Mensaje por Pinfly »

JoanD cuantos bits tiene un byte ?
Un byte tiene 8 bits. Con 8 bits se pueden crear 256 valores distintos.
cada 256 valores distintos és un byte.

65536 bytes*256 = 524288 valores distintos por 2 byte.
Última edición por Pinfly el Dom 22 Feb, 2004 7:08 pm, editado 1 vez en total.
Pinfly
10
10
Mensajes: 60
Registrado: Mié 12 Nov, 2003 11:48 pm
Ubicación: Olot

Mensaje por Pinfly »

Cabe aclarar que los signos 1,x,2 son char ocuparian un byte cada uno.
Pero realmente dentro del byte estos signos solo ocupan una posicion, el resto de posiciones del byte no las usas
Pinfly
10
10
Mensajes: 60
Registrado: Mié 12 Nov, 2003 11:48 pm
Ubicación: Olot

Mensaje por Pinfly »

Lo explico de otra manera.



1 byte - de 0 a 255 ( 8 bits )

'1' - okupa la posicion 0
'X' - okupa la posicion 1
'2' - okupa la posicion 2

i el resto de posiciones del byte ?¿

SOBRAN 255-3= !!! 252 posiciones !!!!!!
coarma
10
10
Mensajes: 53
Registrado: Sab 18 Oct, 2003 7:49 pm

Mensaje por coarma »

Muy, muy interesante.
Pero los 24 triples no son 243+243+81 sino
243*243*81=4.782.969 bits /256=18.683,47265625 bytes = 18.68 Kb
¿Según esto se podrian tener los 14 triples en memoria en sólo 19 Kb ¡¡¡ ?
¿ Y una tabla de 4782969 * 4782969 en 361 Kb ¡¡¡ ? No lo entiendo bien, lástima que no tengo ni idea de lenguaje binario.
¿Cómo se meten 5 triples, 243 columnas de 5 signos, en 1 byte ?
Pinfly
10
10
Mensajes: 60
Registrado: Mié 12 Nov, 2003 11:48 pm
Ubicación: Olot

Pues por ejemplo se pueden poner asi.

Mensaje por Pinfly »

ASCI - BINARIO - 5 TRIPLES
---------------------------------------------------

0 - 00000000 - 11111
1 - 10000000 - X1111
2 - 01000000 - 21111
3 - 11000000 - 1X111
4 - 00100000 - XX111
5 - 10100000 - 2X111
6 - 01100000 - 12111
7 - 11100000 - X2111
8 - 00010000 - 22111
9 - 10010000 - 11X11
10 - 01010000 - X1X11
11 - 11010000 - 21X11
12 - 00110000 - 1XX11
13 - 10110000 - XXX11
14 - 01110000 - 2XX11
15 - 11110000 - 12X11
16 - 00001000 - X2X11
17 - 10001000 - 22X11
18 - 01001000 - 11211
19 - 11001000 - X1211
20 - 00101000 - 21211
21 - 10101000 - 1X211
22 - 01101000 - XX211
23 - 11101000 - 2X211
24 - 00011000 - 12211
25 - 10011000 - X2211
26 - 01011000 - 22211
27 - 11011000 - 111X1
28 - 00111000 - X11X1
29 - 10111000 - 211X1
30 - 01111000 - 1X1X1
31 - 11111000 - XX1X1
32 - 00000100 - 2X1X1
33 - 10000100 - 121X1
34 - 01000100 - X21X1
35 - 11000100 - 221X1
36 - 00100100 - 11XX1
37 - 10100100 - X1XX1
38 - 01100100 - 21XX1
39 - 11100100 - 1XXX1
40 - 00010100 - XXXX1
41 - 10010100 - 2XXX1
42 - 01010100 - 12XX1
43 - 11010100 - X2XX1
44 - 00110100 - 22XX1
45 - 10110100 - 112X1
46 - 01110100 - X12X1
47 - 11110100 - 212X1
48 - 00001100 - 1X2X1
49 - 10001100 - XX2X1
50 - 01001100 - 2X2X1
51 - 11001100 - 122X1
52 - 00101100 - X22X1
53 - 10101100 - 222X1
54 - 01101100 - 11121
55 - 11101100 - X1121
56 - 00011100 - 21121
57 - 10011100 - 1X121
58 - 01011100 - XX121
59 - 11011100 - 2X121
60 - 00111100 - 12121
61 - 10111100 - X2121
62 - 01111100 - 22121
63 - 11111100 - 11X21
64 - 00000010 - X1X21
65 - 10000010 - 21X21
66 - 01000010 - 1XX21
67 - 11000010 - XXX21
68 - 00100010 - 2XX21
69 - 10100010 - 12X21
70 - 01100010 - X2X21
71 - 11100010 - 22X21
72 - 00010010 - 11221
73 - 10010010 - X1221
74 - 01010010 - 21221
75 - 11010010 - 1X221
76 - 00110010 - XX221
77 - 10110010 - 2X221
78 - 01110010 - 12221
79 - 11110010 - X2221
80 - 00001010 - 22221
81 - 10001010 - 1111X
82 - 01001010 - X111X
83 - 11001010 - 2111X
84 - 00101010 - 1X11X
85 - 10101010 - XX11X
86 - 01101010 - 2X11X
87 - 11101010 - 1211X
88 - 00011010 - X211X
89 - 10011010 - 2211X
90 - 01011010 - 11X1X
91 - 11011010 - X1X1X
92 - 00111010 - 21X1X
93 - 10111010 - 1XX1X
94 - 01111010 - XXX1X
95 - 11111010 - 2XX1X
96 - 00000110 - 12X1X
97 - 10000110 - X2X1X
98 - 01000110 - 22X1X
99 - 11000110 - 1121X
100 - 00100110 - X121X
101 - 10100110 - 2121X
102 - 01100110 - 1X21X
103 - 11100110 - XX21X
104 - 00010110 - 2X21X
105 - 10010110 - 1221X
106 - 01010110 - X221X
107 - 11010110 - 2221X
108
Pinfly
10
10
Mensajes: 60
Registrado: Mié 12 Nov, 2003 11:48 pm
Ubicación: Olot

Mensaje por Pinfly »

108 - 00110110 - 111XX
109 - 10110110 - X11XX
110 - 01110110 - 211XX
111 - 11110110 - 1X1XX
112 - 00001110 - XX1XX
113 - 10001110 - 2X1XX
114 - 01001110 - 121XX
115 - 11001110 - X21XX
116 - 00101110 - 221XX
117 - 10101110 - 11XXX
118 - 01101110 - X1XXX
119 - 11101110 - 21XXX
120 - 00011110 - 1XXXX
121 - 10011110 - XXXXX
122 - 01011110 - 2XXXX
123 - 11011110 - 12XXX
124 - 00111110 - X2XXX
125 - 10111110 - 22XXX
126 - 01111110 - 112XX
127 - 11111110 - X12XX
128 - 00000001 - 212XX
129 - 10000001 - 1X2XX
130 - 01000001 - XX2XX
131 - 11000001 - 2X2XX
132 - 00100001 - 122XX
133 - 10100001 - X22XX
134 - 01100001 - 222XX
135 - 11100001 - 1112X
136 - 00010001 - X112X
137 - 10010001 - 2112X
138 - 01010001 - 1X12X
139 - 11010001 - XX12X
140 - 00110001 - 2X12X
141 - 10110001 - 1212X
142 - 01110001 - X212X
143 - 11110001 - 2212X
144 - 00001001 - 11X2X
145 - 10001001 - X1X2X
146 - 01001001 - 21X2X
147 - 11001001 - 1XX2X
148 - 00101001 - XXX2X
149 - 10101001 - 2XX2X
150 - 01101001 - 12X2X
151 - 11101001 - X2X2X
152 - 00011001 - 22X2X
153 - 10011001 - 1122X
154 - 01011001 - X122X
155 - 11011001 - 2122X
156 - 00111001 - 1X22X
157 - 10111001 - XX22X
158 - 01111001 - 2X22X
159 - 11111001 - 1222X
160 - 00000101 - X222X
161 - 10000101 - 2222X
162 - 01000101 - 11112
163 - 11000101 - X1112
164 - 00100101 - 21112
165 - 10100101 - 1X112
166 - 01100101 - XX112
167 - 11100101 - 2X112
168 - 00010101 - 12112
169 - 10010101 - X2112
170 - 01010101 - 22112
171 - 11010101 - 11X12
172 - 00110101 - X1X12
173 - 10110101 - 21X12
174 - 01110101 - 1XX12
175 - 11110101 - XXX12
176 - 00001101 - 2XX12
177 - 10001101 - 12X12
178 - 01001101 - X2X12
179 - 11001101 - 22X12
180 - 00101101 - 11212
181 - 10101101 - X1212
182 - 01101101 - 21212
183 - 11101101 - 1X212
184 - 00011101 - XX212
185 - 10011101 - 2X212
186 - 01011101 - 12212
187 - 11011101 - X2212
188 - 00111101 - 22212
189 - 10111101 - 111X2
190 - 01111101 - X11X2
191 - 11111101 - 211X2
192 - 00000011 - 1X1X2
193 - 10000011 - XX1X2
194 - 01000011 - 2X1X2
195 - 11000011 - 121X2
196 - 00100011 - X21X2
197 - 10100011 - 221X2
198 - 01100011 - 11XX2
199 - 11100011 - X1XX2
200 - 00010011 - 21XX2
201 - 10010011 - 1XXX2
202 - 01010011 - XXXX2
203 - 11010011 - 2XXX2
204 - 00110011 - 12XX2
205 - 10110011 - X2XX2
206 - 01110011 - 22XX2
207 - 11110011 - 112X2
208 - 00001011 - X12X2
209 - 10001011 - 212X2
210 - 01001011 - 1X2X2
211 - 11001011 - XX2X2
212 - 00101011 - 2X2X2
213 - 10101011 - 122X2
214 - 01101011 - X22X2
215 - 11101011 - 222X2
216 - 00011011 - 11122
217 - 10011011 - X1122
218 - 01011011
Pinfly
10
10
Mensajes: 60
Registrado: Mié 12 Nov, 2003 11:48 pm
Ubicación: Olot

Mensaje por Pinfly »

218 - 01011011 - 21122
219 - 11011011 - 1X122
220 - 00111011 - XX122
221 - 10111011 - 2X122
222 - 01111011 - 12122
223 - 11111011 - X2122
224 - 00000111 - 22122
225 - 10000111 - 11X22
226 - 01000111 - X1X22
227 - 11000111 - 21X22
228 - 00100111 - 1XX22
229 - 10100111 - XXX22
230 - 01100111 - 2XX22
231 - 11100111 - 12X22
232 - 00010111 - X2X22
233 - 10010111 - 22X22
234 - 01010111 - 11222
235 - 11010111 - X1222
236 - 00110111 - 21222
237 - 10110111 - 1X222
238 - 01110111 - XX222
239 - 11110111 - 2X222
240 - 00001111 - 12222
241 - 10001111 - X2222
242 - 01001111 - 22222


1 byte son 256 bits.

En este caso para representar 5 triples utilizamos tan solo 242 bits de los que consta un byte.

5 triples = 1 byte ( 242 bits )

Luego cojemos 5 triples más y repetimos el proceso.
5 triples = 1 byte ( 242 bits )

Luego:
4 triples = 1 byte ( 81 bits )

5+5+4 = 14 triples
1+1+1 = 3 bytes;
coarma
10
10
Mensajes: 53
Registrado: Sab 18 Oct, 2003 7:49 pm

Mensaje por coarma »

ok, está muy bien pero lo que representas no son 5 triples, le faltan 9 unos por la derecha si son los 5 primeros triples, 5 unos por la izquierda y 4 por la derecha para los triples 6 a 10 y 9 unos por la izquierda para los triples 10 a 14. Luego para tener en memoria el desarrollo de los 14 triples hay que multiplicar los tres grupos, 18Kb, que sigue siendo excepcionalmente reducido.
Responder