2008-10-16 12 views
8

Tenemos una lista de autocompletar que está llena cuando una se envía un correo electrónico a alguien, que es todo muy bien hasta que la lista se hace muy grande que necesita escribir más y más de una dirección para llegar a la que usted desea, que va en contra del propósito de autocompletarAlgoritmo para los contactos más recientes/a menudo para autocompletar?

Estaba pensando que se debe agregar algo de lógica para que los resultados de autocompletar se ordenen por alguna función del contacto más reciente o el que se haya contactado con más frecuencia en vez de solo el orden alfabético.

Lo que quiero saber es si hay alguna buena algoritmos conocidos para este tipo de búsqueda, o si alguien tiene alguna sugerencia.

Estaba pensando solo en un sistema de puntos, con algo como el mismo día son 5 puntos, los últimos tres días son 4 puntos, la semana pasada son 3 puntos, el mes pasado son 2 puntos y los últimos 6 meses son 1 punto. Entonces para la mayoría de las veces, más de 25 son 5 puntos, 15+ es 4, 10+ es 3, 5+ es 2, 2+ es 1. No hay lógica real más allá de esos números que "sienten" sobre la derecha.

Otros más que arbitrariamente elegido los números, ¿alguien tiene alguna entrada? Otros números también son bienvenidos si puedes dar una razón por la que crees que son mejores que la mía

Editar: Esto sería principalmente en un ambiente de negocios donde lo reciente (yay para inventar palabras) a menudo es tan importante como la frecuencia. Además, pasado un cierto punto, realmente no hay mucha diferencia entre decir alguien con quien hablaste 80 veces frente a 30 veces.

Respuesta

2

Este tipo de cosas parece similar a lo que hace firefox cuando insinúa para qué está escribiendo el sitio.

Desafortunadamente no sé exactamente cómo lo hace Firefox, sistema de puntos parece bueno también, tal vez usted necesita para equilibrar sus puntos :)

me gustaría ir 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

Contactos que no ha escrito durante el último mes (podría cambiarse) tendrán 0 po Ints. Puede comenzar a ordenarlos para NoM enviado en total (ya que está en la lista de contactos :). Estos se mostrarán después de contactos con puntos> 0

Es solo una idea, de todos modos, es darle una importancia diferente a los contactos más enviados.

+0

Heh, supongo que esta es una versión ligeramente más calculada de la respuesta que acabo de publicar – Davy8

+0

Es solo una suma de derivados, cada uno con su propio peso (los coeficientes 1, 1/2, 1/3 :) –

+0

Suprimido el mío ya que básicamente dijo lo mismo y luego algunos – Davy8

1

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

ORDER BY DESC EmailCount, apellido, nombre

esta manera, sus direcciones utilizadas más a menudo, lo primero, aunque no se han utilizado en unos pocos días.

+0

Sí, pero en un entorno empresarial (que supongo que debería haber especificado) uno podría estar en contacto con un cliente/cliente durante unos días/semanas ya sea resolviendo un problema o acordando un acuerdo/acuerdo y en ese el caso más reciente es más relevante que la mayoría de las veces. – Davy8

+0

Absolutamente, hay todo tipo de usuarios potenciales: podría enviar correos electrónicos a mi jefe remoto una vez cada dos semanas para siempre, podría tener una cuenta de ventas activa durante un mes, podría apoyar a un cliente que necesita ayuda adicional después de nuevas compilaciones. ¿Tal vez una combinación de frecuencia e inmediatez de tiempo? –

+0

"¿Tal vez una combinación de frecuencia e inmediatez de tiempo?" Sí, eso es más de lo que estaba buscando, un poco de los detalles de cómo equilibrar los dos. – Davy8

3

Tome un vistazo a las listas de auto organizadoras.

Una mirada rápida y sucia:

Mover al principio heurístico: Una lista enlazada, de manera que cada vez que se selecciona un nodo, se trasladó a la parte delantera de la lista.

Heurística de frecuencia: Una lista enlazada, de modo que cada vez que se selecciona un nodo, se incrementa su frecuencia y luego se bordea el nodo hacia el frente de la lista, de modo que el acceso más frecuente está a la cabeza la lista.

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

EDITAR: Cuando se selecciona una dirección, agregue una a su frecuencia, y mueva al frente del grupo de nodos con el mismo peso (o (peso div x) para grupos de courser). Veo el envejecimiento como un problema real con la implementación propuesta, ya que requiere calcular un peso en cada elemento. Una lista de autoorganización es una buena forma de hacerlo, pero el algoritmo necesita un poco de ajuste para hacer lo que desee.

Further Edit: Envejecimiento se refiere al hecho de que los pesos disminuyen con el tiempo, lo que significa que necesita saber cada vez que se usó 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 (distintos de la búsqueda) en un nodo solo cuando se tiene acceso a ellos realmente. Esto nos da nuestro buen rendimiento estadístico.

+0

Implementación interesante, sin embargo, esto aún resultaría en el más reciente al frente o el más frecuente en el frente, no una combinación de los dos. – Davy8

+0

No estoy completamente seguro de lo que quiere decir con el envejecimiento. Mi problema con esta solución es que pone más énfasis en la frecuencia en lugar de (más o menos) igual en ambos. – Davy8

+0

Un ejemplo de lo que podría ser un problema es decir que hablas mucho con un cliente (había un problema realmente grande que resolver) pero ahora que ya está hecho, ya no tienes que contactarlo por mucho tiempo. hora. Todavía están en frente debido a toda la frecuencia y lo estarán por un largo tiempo. – Davy8

2

Si desea obtener loco, marcar el mayor número de mensajes de correo electrónico 'activos' en una de varias maneras:

  • Última vista
  • frecuencia de uso
  • contactos con las ventas pendientes
  • jefes directos
  • Etc

Luego, presente el correo electrónico activo s en la parte superior de la lista. Preste atención a qué "grupo" más usa su usuario. Cambie a esa estrategia de clasificación exclusivamente después de recopilar suficientes datos.

Es mucho trabajo, pero tipo de diversión ...

+0

Heh, más complicado de lo que probablemente estoy buscando, pero podría ser útil para otra persona, entonces +1 – Davy8

1

me gusta la idea de un sistema basado en puntos, con los puntos de uso reciente, la frecuencia de uso, y potencialmente otros factores (prefieren los contactos en el dominio local?).

He trabajado en algunos sistemas como este, y ni el "usado más recientemente" ni el "usado más comúnmente" funcionan muy bien. El "más reciente" puede ser un verdadero dolor si accidentalmente escribes 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 medidas que desea usar, puede crear una apoplicación interactiva para probar diferentes pesos, y ver cuáles le brindan los mejores resultados para algunos datos de muestra.

0

This paper describe una familia de un solo parámetro de políticas de desalojo de caché que incluye las políticas utilizadas menos recientemente y las que menos se usan con frecuencia como casos especiales.

El parámetro, lambda, varía de 0 a 1. Cuando lambda es 0, funciona exactamente como una memoria caché LFU, cuando lambda es 1 funciona exactamente igual que una caché LRU. Entre 0 y 1 combina información de actualidad y frecuencia de forma natural.

0

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

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

Yo daría cuenta de lo reciente multiplicando todos los contadores a intervalos regulares (digamos, 24 horas) por algún limitador (digamos, 0.9).

Cada uso:

UPDATE `addresslist` SET `favor` = `favor` + 10 WHERE `address` = '[email protected]' 

Cada intervalo:

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

De esta manera Me dejo caer tanto en frecuencia como lo reciente de un campo, evitar la necesidad de mantener un historial detallado para derivar {último día , la semana pasada, el mes pasado} y mantener el entero matemático (principalmente).

El incremento y el decreciente tendrían que ajustarse a las preferencias, por supuesto.

Cuestiones relacionadas