Я работаю над алгоритмом, который должен рассчитать размер набора, сгенерированного пересечениями не менее 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()
и не идеальная, но должна подходить для этой задачи.