Tengo una gran cantidad de ID de usuario (enteros), potencialmente millones. Todos estos usuarios pertenecen a varios grupos (conjuntos de enteros), de modo que existen del orden de 10 millones de grupos.Algoritmo más rápido para encontrar conjuntos con intersección alta
Para simplificar mi ejemplo y llegar a la esencia del mismo, supongamos que todos los grupos contienen 20 ID de usuario.
Quiero encontrar todos los pares de conjuntos enteros que tienen una intersección de 15 o mayor.
¿Debo comparar cada par de conjuntos? (Si mantengo una estructura de datos que mapea los ID de usuario para establecer membresía, esto no sería necesario.) ¿Cuál es la forma más rápida de hacer esto? Es decir, ¿cuál debería ser mi estructura de datos subyacente para representar los conjuntos enteros? Conjuntos ordenados, sin clasificar --- ¿puede el hashing de alguna manera ayudar? ¿Y qué algoritmo debería usar para calcular la intersección establecida? Prefiero las respuestas que relacionan C/C++ (especialmente STL), pero también son bienvenidas las ideas algorítmicas generales.
actualización Además, nótese que va a correr esto en paralelo en un entorno de memoria compartida, por lo que se prefieren las ideas que se extienden limpiamente a una solución paralela.
Además, tenga en cuenta que la gran mayoría de pares de pares tendrán un tamaño de intersección de 0 --- lo que significa que podría ser ventajoso utilizar una estructura de datos que correlacionara ID de usuario con conjuntos para evitar calcular la intersección de cada par de conjuntos.
Mi respuesta a "Millones de puntos 3D: ¿cómo encontrar los 10 más cercanos a un punto determinado?" se muestra que * millón * no es un número grande (la fuerza bruta funciona) y las E/S se come todas las diferencias entre los diferentes algoritmos http://stackoverflow.com/questions/2486093/millions-of-3d-points-how-to- find-the-10-de-ellos-los-más-cercanos-a-un-punto-dado/2486341 # 2486341 – jfs
¿Hay millones mucho? Depende de la complejidad del algoritmo que está ejecutando en él. El enfoque de fuerza bruta aquí significa (G * (G-1))/2 establecer operaciones de intersección, donde G es el número de grupos. Entonces, dado que G = 10,000,000, entonces el enfoque de fuerza bruta requiere 9.0 × 10^13 establecer intersecciones --- ¡eso es demasiado! – conradlee
@ J.F: este problema se parece más a "millones de puntos, encuentre los 10 pares más cercanos * entre sí *", no a un punto determinado. Excepto que, de hecho, incluso ese problema de punto más cercano es más difícil para algunas optimizaciones que obviamente no se aplican aquí. No creo que tengamos que lidiar con una métrica en el sentido matemático. La desigualdad triangular no se aplica a la definición "obvia" de distancia en términos de tamaño de intersección: dos conjuntos pueden ser completamente disjuntos (muy separados) y aún así estar muy cerca de un conjunto intermedio (con el que ambos tienen una intersección del 50%)) –