Я работаю над алгоритмом, который должен рассчитать размер набора, сгенерированного пересечениями не менее 2 наборов. Более конкретно:
Пересекающиеся наборы генерируются запросами SQL, и, чтобы поддерживать скорость, я заблаговременно получаю счет каждого запроса, затем беру набор с наименьшим счетом ( ) и использую эти идентификаторы в качестве границ для Остальные большие запросы, поэтому пересечение эффективно становится:
Даже из-за этой стратегии у меня довольно большие запросы, так какиногда может быть большим. Моя идея разобраться с этим - взять случайную выборку и пересечь ее с остальными множествами, прежде чем экстраполировать обратно до правильной оценки . Мой вопрос: каков наилучший способ выполнить выборку, а затем экстраполировать, чтобы вернуться к значению , которое, если не совсем точно, имеет предсказуемый диапазон ошибок?A 0 z z
Вот что я пробовал до сих пор (в псевдокоде, вроде):
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()
и не идеальная, но должна подходить для этой задачи.Ответы:
Если ваш набор имеет повторяющиеся элементы (т. он является мультимножеством), размер пересечения будет завышен вашей процедурой, поскольку в вашем коэффициенте масштабирования используется количество выборочных элементов, а не число уникальных «типов», выбранных. Вы можете скорректировать оценку, рассчитав коэффициент как отношение числа уникальных элементов в вашей случайной выборке к количеству уникальных элементов в полном наборе .A 0A0 A0
источник
Как указывает Innuo , моя проблема была из-за дубликатов в моем наборе , что привело к , что мой псевдокод оказался слишком низким, что, в свою очередь, привело к тому, что конечная экстраполяция оказалась слишком высокой, потому что она была сгенерирована с помощью инверсии . Удаление дубликатов решило эту проблему, и теперь алгоритм генерирует график зависимости дельты от размера выборки в соответствии с тем, что я ожидал (линии показывают предел погрешности при уровне достоверности 95% для этого размера выборки по отношению к общей совокупности). ):A0
factor
z
factor
источник