Nasıl sayı kümesi karşılaştırmak ve MySQL ve PHP kullanarak en uygun sonuçlar elde edebilirsiniz?

2 Cevap php

Bu düşünün:

set A: 1 2 3 4
set B:     3 4 5 6
set C:       4 5 6 7
set D: 1

I want to compare D with the rest and get as a result a set of numbers as most relevant. The result should be in this order: 4 (as D has a common number with A and 4 is in A and also in B and C), 3 (as D has a common number with A and 3 is in A and B), 2 (as D has a common number with A and 2 is also in A), then 5, 6, 7.

PHP / MySQL etkin bir şekilde bunu yapmak için bazı algoritma var mı? Ben tekerleği yeniden icat etmek istemiyorum, ve aynı zamanda veritabanı sonunda setleri çok sayıda olurdu ..

2 Cevap

SQL, ben set adını elemanları ve s için 2 sütun, e ile, setleri adında bir tablo var sanacaklar.

select e,count(*) as c from sets where s in
(select s from sets where e in (select e from sets where s='D') group by s)
group by e order by c desc

açıklama:

(select e from sets where s='D')

grup D. elemanlarını seçer

(select s from sets where e in (select e from sets where s='D') group by s)

önceden seçilmiş grup ile ortak üye olan tüm grupları seçer.

ve o zaman bu setleri tüm öğeleri seçin ve (joel önerildiği gibi) görünüşe sayısına göre bunları sipariş

Bir örnek bir tam özellikleri yapmaz. Setleri koleksiyonu da dahil Örneğin, nasıl cevap farklı olurdu

set E: 1 2 3
set F: 1   3

3 D ile boş olmayan kavşağa sahip kümeleri arasında en sık görülen değer kılacak? Yani burada benim varsayımlar şunlardır:

(Orijinal örnekte D), bir hedef set Verilen:

  1. "Örtüşen setleri" (hedef seti ile boş olmayan kavşağa sahip setleri) değerleri daha ilgili olduğu değerler değil, bu üst üste setleri.
  2. Deyimi 1'in kısıtlaması altında, ilgi oluşum frekansı tarafından belirlenir.

Orijinal örnekte, A D ile örtüşür, bu evrenin {1, 2, 3, 4, 5, 6, 7} {1, 2, 3, üst üste içine paylaştırılır , 4} ve {örtüşmeyen 5, 6, 7}. Değer frekansları {01:02, 02:01, 03:02, 04:03, 05:02, 06:02, 07:01}. Bu gerçekleri birleştiren, örtüşen frekansları sırasını 4, 3 üretir {01:02, 02:01, 03:02, 04:03} ve örtüşmeyen frekansları {05:02, 06:02, 07:01} verir 1, ardından 2 5, 6, 7. (Sana 1 bir alaka atamadı fark. kasıtlı, bu nihai sıralamadan belirlenen hedefin değerlerini kaldırarak bir son adım olabilir.)

Benim düzeltilmiş örnekte, frekansları haline {01:04, 02:03, 03:04, 04:03, 05:02, 06:02, 07:01}. Bu üst üste gelen frekansları sırasını 1 üreten {1:04, 2:03, 3:04, 4:03} ve örtüşmeyen frekans {5:02, 6:02, 7:01} verir, 3, 2, 4 5, 6, 7 takip etmektedir.

Bu algoritma için sözde kodu:

  1. overlapping başlat ve universe boş takım olmalı ve frequency boş bir karma olmak.

  2. Her set için s (t, hedef seti dışında) setleri koleksiyonunda:

    2.1. Set universe s ve universe ve sendika

    2.2. s t, en az bir elemanı vardır ile kesişen durumunda:

    2.2.1. Set `overlapping` to the union of `overlapping` and `s`
    

    2.3. Her bir elemanı için e in s,

    2.3.1. If 'e' is a key in `frequency`
    
    
    
    2.3.1.1. Then increase the value (count) for `e` in `frequency` by 1
    2.3.1.2. Else initialize the value (count) for `e` in `frequency` to 1
    
  3. Set nonOverlapping universe ve overlapping arasındaki farka

  4. Sıralama sonucu ilk parçası olarak frequency kendi değerlerine göre universe elemanları.

  5. Elemanları nonOverlapping, ayrıca frequency kendi değerlerine göre sınıflandırılmaktadır sonucu eklenecek.

(Eğer t elimine edilecek unsurları için niyetinde olsaydı, ben yaparım o 4'te bir post-processing adım olarak.)