Pregunta

Tenemos una lista de autocompletar que se rellena cuando le envías un correo electrónico a alguien, lo cual está muy bien, hasta que la lista sea realmente grande, debes escribir más y más direcciones para llegar a la que deseas. , lo que va en contra del propósito de autocompletar

Estaba pensando que se debería agregar algo de lógica para que los resultados de autocompletar se clasifiquen por alguna función de las más recientemente contactadas o contactadas más a menudo en lugar de solo el orden alfabético.

Lo que quiero saber es si hay algún buen algoritmo conocido para este tipo de búsqueda, o si alguien tiene alguna sugerencia.

Estaba pensando solo en una cosa del sistema de puntos, con algo como que el mismo día es 5 puntos, los últimos tres días son 4 puntos, la semana pasada son 3 puntos, el último mes son 2 puntos y los últimos 6 meses son 1 punto. Luego, para la mayoría de las veces, 25+ es 5 puntos, 15+ es 4, 10+ es 3, 5+ es 2, 2+ es 1. No hay lógica real que no sean esos números " sentir " sobre derecho.

Aparte de los números elegidos arbitrariamente, ¿alguien tiene alguna entrada? Otros números también son bienvenidos si puede dar una razón por la que cree que son mejores que los míos

Editar: Esto sería principalmente en un entorno empresarial donde la actualidad (sí, para inventar palabras) es a menudo tan importante como la frecuencia. Además, después de cierto punto, realmente no hay mucha diferencia entre decir alguien con quien hablaste 80 veces o decir 30 veces.

¿Fue útil?

Solución

Este tipo de cosas parece similar a lo que hace Firefox al sugerir cuál es el sitio para el que estás escribiendo.

Lamentablemente, no sé exactamente cómo lo hace Firefox, el sistema de puntos también parece bueno, tal vez necesites equilibrar tus puntos :)

Iría por algo similar a:

NoM = Número de correo

(NoM enviado a X hoy) + 1/2 * (NoM enviado a X durante la última semana) / 7 + 1/3 * (NoM enviado a X durante el último mes) / 30

Los contactos que no escribiste durante el último mes (se podría cambiar) tendrán 0 puntos. Podría comenzar a clasificarlos para el envío de NoM en total (ya que está en la lista de contactos :). Estos se mostrarán después contactos con puntos > 0

Es solo una idea, de todos modos es para dar diferente importancia a la mayoría de los contactos que solo enviamos por correo.

Otros consejos

Eche un vistazo a las listas de autoorganización.

Una mirada rápida y sucia:

Mover al frente heurístico: Una lista enlazada, de modo que cada vez que se selecciona un nodo, se mueve al frente de la lista.

Frecuencia heurística: Una lista enlazada, de manera que cada vez que se selecciona un nodo, se incrementa su recuento de frecuencia, y luego el nodo se burbujea hacia el frente de la lista, de modo que el más visitado es el que encabeza la lista.

Parece que el paso a la implementación frontal se adapta mejor a sus necesidades.

EDITAR: cuando se selecciona una dirección, agregue una a su frecuencia y muévase al frente del grupo de nodos con el mismo peso (o (peso div x) para los grupos de cursores). Veo el envejecimiento como un problema real con su implementación propuesta, ya que requiere calcular un peso en cada elemento. Una buena lista de organización es un buen camino a seguir, pero el algoritmo necesita un poco de ajustes para hacer lo que desea.

Edición adicional: El envejecimiento se refiere al hecho de que los pesos disminuyen con el tiempo, lo que significa que debe saber cada vez que se utilizó una dirección. Lo que significa que debe tener todo el historial de correo electrónico disponible cuando construya su lista.

El problema es que queremos realizar cálculos (aparte de la búsqueda) en un nodo solo cuando realmente se accede a él. Esto nos da nuestro buen rendimiento estadístico.

Si quiere volverse loco, marque los correos electrónicos más 'activos' de una de varias maneras:

  • Último acceso
  • Frecuencia de uso
  • Contactos con ventas pendientes
  • jefes directos
  • Etc

Luego, presente los correos electrónicos activos en la parte superior de la lista. Presta atención a qué " grupo " tu usuario usa más. Cambie a esa estrategia de clasificación exclusivamente después de que se recopilen suficientes datos.

Es mucho trabajo pero un poco divertido ...

Tal vez cuente el número de correos electrónicos enviados a cada dirección. Entonces:

ORDENAR POR EmailCount DESC, Apellido, Nombre

De esa manera, sus direcciones más utilizadas son lo primero, incluso si no se han utilizado en unos días.

Me gusta la idea de un sistema basado en puntos, con puntos para uso reciente, frecuencia de uso y potencialmente otros factores (¿prefiere contactos en el dominio local?).

He trabajado en algunos sistemas como este, y ninguno " usado más recientemente " ni " más comúnmente usado " funciona muy bien El " más reciente " puede ser un verdadero dolor si accidentalmente escribe mal algo una vez. Alternativamente, " más usado " no evoluciona mucho con el tiempo, si tuvo mucho contacto con alguien el año pasado, pero ahora su trabajo ha cambiado, por ejemplo.

Una vez que tenga el conjunto de mediciones que desea usar, puede crear una aplicación interactiva para probar diferentes ponderaciones y ver cuáles le proporcionan los mejores resultados para algunos datos de muestra.

Este documento describe una familia de un solo parámetro de políticas de desalojo de caché que incluyen las políticas menos utilizadas recientemente y las menos utilizadas como casos especiales.

El parámetro, lambda, varía de 0 a 1. Cuando lambda es 0, se realiza exactamente como un caché LFU, cuando lambda es 1, se realiza exactamente como un caché LRU. Entre 0 y 1, combina la información reciente y de frecuencia de forma natural.

A pesar de que se ha elegido una respuesta, quiero presentar mi enfoque para su consideración y comentarios.

Daría cuenta de la frecuencia incrementando un contador cada uso, pero con un valor mayor que uno, como 10 (para agregar precisión al segundo punto).

Daría cuenta de la actualidad al multiplicar todos los contadores a intervalos regulares (por ejemplo, 24 horas) por algún reductor (por ejemplo, 0.9).

Cada uso:

UPDATE `addresslist` SET `favor` = `favor` + 10 WHERE `address` = 'foo@bar.com'

Cada intervalo:

UPDATE `addresslist` SET `favor` = FLOOR(`favor` * 0.9)

De esta manera, colapso tanto la frecuencia como la antigüedad en un campo, evito la necesidad de mantener un historial detallado para derivar {el último día, la semana pasada, el mes pasado} y mantener las matemáticas (en su mayoría) enteras.

El incremento y el reductor tendrían que ajustarse a la preferencia, por supuesto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top