Я працюю над алгоритмом, який повинен обчислити розмір набору, генерованого перетинами щонайменше 2 множин. Більш конкретно:
Набори, які перетинаються, генеруються за допомогою SQL-запитів, і, прагнучи швидко тримати речі, я отримую підрахунок кожного запиту достроково, потім беру набір з найменшим числом ( ) і використовую ці ідентифікатори як межі на решта великих запитів, тому перетин фактично стає:
Навіть ця стратегія залишає мені запускати кілька досить великих запитів, оскількиіноді можуть бути великими. Моя ідея розібратися з цим - взяти випадкову вибірку та перехрестити її з іншими наборами, перш ніж екстраполювати назад до належної оцінки . Моє запитання: який найкращий спосіб взяти вибірку, а потім екстраполювати, щоб повернутися до значення яке, якщо не зовсім точне, має передбачуваний діапазон помилок?
Ось що я спробував поки що (у псевдокоді, начебто):
sample_threshold := 10000
factor := 1
if (len(A0) > sample_treshold) {
factor = sample_threshold / len(A0)
}
// Take a random sample of size 10000 from A0
// Intersect all the other sets with the A0 sample, then with each other
working_set := A0
for i, a := range A {
a = intersect(A0, a)
working_set = intersect(working_set, a)
}
z := len(working_set) * (1 / factor)
Цей код працює, але, здається, постійно переоцінюється z
, менший розмір вибірки дає більш високу оцінку. Окрім того, я не впевнений, як би це масштабувалося з більш ніж двома множинами для перетину.
Я сподіваюся, що це питання має сенс, дайте мені знати, чи можу я щось уточнити далі. Крім того, якщо це питання поза темою або належить десь в іншому місці, будь ласка, дайте мені знати, і я з задоволенням перенесу його.
За коментарем Білла я провів кілька швидких випробувань, щоб показати розмір вибірки та помилку. Кожне відро розміром зразка було виконано 20 разів, і як ви бачите, є досить чітка тенденція:
ORDER BY RAND()
, яка не є ідеальною, але повинна відповідати цій задачі.