En az 2 kümenin kesişimleri tarafından oluşturulan bir kümenin boyutunu hesaplamak için gereken bir algoritma üzerinde çalışıyorum. Daha spesifik olarak:
Kesişen kümeler SQL sorguları tarafından oluşturulur ve işleri hızlı tutma çabasıyla, her sorgudan önce bir sayı alırım, sonra en düşük sayıyı () ve bu kimlikleri büyük sorguların geri kalanında sınır olarak kullanın, böylece kavşak etkili bir şekilde olur:
Bu strateji bile beni çalıştırmam için oldukça büyük sorgular bırakıyor bazen büyük olabilir. Bununla başa çıkma fikrimi rastgele bir örnek almak ve uygun bir tahmine geri dönmeden önce setlerin geri kalanıyla kesişmesi . Sorum şu: örnekleme ve sonra bir değere geri dönmek için tahmin etmek gitmek için en iyi yolu nedir yani, tam olarak doğru değilse, öngörülebilir bir hata aralığı vardır?
İşte şimdiye kadar denedim (sözde kod, tür):
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)
Bu kod işe yarıyor, ancak sürekli olarak fazla tahmin ediyor gibi görünüyor z
, daha düşük bir örnek boyutu daha yüksek bir tahmin sağlıyor. Ayrıca, bunun kesişecek ikiden fazla kümeyle nasıl ölçekleneceğinden emin değilim.
Umarım bu soru mantıklıdır, daha fazla netleştirebilir miyim, bana bildirin. Ayrıca, bu soru konuyla ilgili değilse veya başka bir yere aitse, lütfen bana bildirin ve taşımaktan mutluluk duyuyorum.
Başına Bill'in yorumun , ben örnek büyüklüğü vs hatayı gösterme bazı hızlı testler yaptı. Her numune boyutu kovası 20 kez çalıştırıldı ve gördüğünüz gibi oldukça açık bir trend var:
ORDER BY RAND()
, mükemmel değil, ancak bu görev için uygun olması gereken rastgele .