Biblioteca de clases genéricas - errores, descripción, preguntas, características de uso y sugerencias - página 6

 
Vasiliy Sokolov:

Sucede que diferentes palabras comienzan con la misma letra del alfabeto. Si ponemos "manzana" en nuestro diccionario anterior, y luego intentamos poner "aplicación", no funcionará. El índice 0 estará ocupado por la palabra manzana. En este caso hablamos de una colisión de la función hash. Nuestra función hash es muy sencilla: devuelve el número del primer carácter de la palabra, por lo que las colisiones en esta función serán muy frecuentes. Para almacenar diferentes palabras, que empiezan por la misma letra, haremos una adición: almacenaremos los elementos no en array, sino en array de arrays. En este caso, el índice 0 contendrá otra matriz con dos palabras: "manzana" y "aplicación":

Ahora nuestro diccionario almacena palabras que incluso empiezan por la misma letra. Pero el coste de acceder a palabras con la misma primera letra aumenta. Porque ahora necesitamos una búsqueda completa de todas las palabras que empiezan por 'a' para saber si la palabra 'aplicación' está en el diccionario o no. Si nuestra función hash produjera números diferentes aunque las palabras difirieran en un carácter, entonces la probabilidad de probar palabras con los mismos índices tendería a cero, y el acceso a un elemento arbitrario tendería a o(1). Esto es exactamente lo que ocurre en los diccionarios reales y las funciones que se utilizan en ellos son a prueba de colisiones, por lo que podemos afirmar sin lugar a dudas que el acceso a los elementos de estas colecciones es muy rápido y casi no tiene búsqueda.

Intentaré dar mi solución a este ejemplo. Sin punteros. Un poco más tarde.
 

Hace poco leí un libro sobre el tema. Se llama"Algoritmos de Rechazo". Todo está muy claramente expuesto, con ejemplos.

 
Vasiliy Sokolov:

En el siguiente ejemplo lo mejoraremos para que pueda almacenar palabras que empiecen por la misma letra.

Por favor, escríbalo de forma sucinta, sin encabezados ni entidades innecesarias.

Por ejemplo, este

bool Contains(string word)
{
   uchar index = (uchar)StringGetCharacter(word, 0)-97;
   return words[index] != NULL;
}

podría escribirse de forma mucho más clara.

bool Contains(string word)
{
   return words[word[0]-'a'] != NULL;
}


Y aún así este código puede funcionar de forma diferente para MT4/5 porque en MT4 el array se inicializa con valores NULL, y en MT5 puede ser basura.

 
fxsaber:

Por favor, escriba de forma sucinta, sin líos de sombreros y entidades superfluas.

...


Categóricamente en contra. Es preferible que el código esté escrito en su totalidad. Mira todos los códigos MQ - hay "tapas" en todas partes. Esta es la norma.


fxsaber:

...

Y sin embargo este código para MT4/5 puede funcionar de forma diferente porque en MT4 el array se inicializa con valores NULL, y en MT5 puede ser una basura.


¿Qué tiene esto que ver con la antigua terminal? Si eres perezoso y sigues usando el antiguo, este es tu propio problema. La comunidad no debería ralentizarse por culpa de estos vagos.

 
Vladimir Karputov:

Mira todos los códigos MQ - hay "tapas" en todas partes. Esta es la norma.

A la mierda la norma, aquí lo importante es la esencia, no el estilo que se lleva el 50% del código.

 
fxsaber:

Que le den a la norma, lo que cuenta es la esencia, no el estilo que ocupa el 50% del código.


La principal tarea del foro es la EDUCACIÓN. Por lo tanto, el código debe ampliarse y entenderse lo más cerca posible de la norma.

 
Vasiliy Sokolov:

Esto es exactamente lo que ocurre en los diccionarios reales; las funciones que se utilizan en ellos son resistentes a las colisiones, por lo que podemos afirmar sin lugar a dudas que el acceso a los elementos de estas colecciones es muy rápido y casi sin sobresaltos.

Es decir, para cada tarea es necesario encontrar un término medio entre el tamaño del diccionario (RAM) y la complejidad computacional de la función hash (CPU).

 
Vladimir Karputov:

El objetivo principal del foro es educar. Por lo tanto, el código debe ser ampliado y comprendido

esto es suficiente.

lo más cerca posible de la norma.

Puede insertar sus propias cabeceras. A100 ha emitido cientos de informes en la SD sin tapones, ¡es la norma! Porque lo que importa es la esencia, no el oropel.

 
Hay una solución. Sin embargo, para mantener temporalmente la intriga, me gustaría publicar aquí el ejecutable. Además, las personas capacitadas compararán el rendimiento de mi solución y la solución proporcionada por el autor anterior. Me pregunto cuál funciona más rápido.
Archivos adjuntos:
Dictionary.ex5  10 kb
 
ReTeg Konow:
Hay una solución. Sin embargo, para mantener temporalmente la intriga, me gustaría publicar el extracto aquí. Además, las personas capaces compararán el rendimiento de mi solución y la solución proporcionada por el autor anterior. Me pregunto cuál funciona más rápido.
Tienes que ejecutar el ejecutable. Aparecerá un campo de entrada. A continuación, puedes escribir diferentes palabras. Si hay una coincidencia, la impresora le notificará que la palabra está en el diccionario. Si no hay ninguna palabra, recibirá una notificación de que la palabra se ha añadido al diccionario.
Razón de la queja: