2009-12-09 2 views
2

이를 고려숫자 집합을 비교하고 MySQL과 PHP를 사용하여 가장 관련성 높은 결과를 얻으려면 어떻게해야합니까?

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

내가 가장 관련성이 같은 숫자의 집합을 나머지 D를 비교 한 결과 싶어. 결과는 다음과 같아야합니다. 4 (D는 A와 공통 숫자를, 4는 A와 B와 C에도 있음), 3 (D는 A와 공통 숫자를, 3은 A와 B에 있음) , 2 (D는 A와 공통 숫자, 2는 A), 5, 6, 7입니다.

PHP/MySQL에서 효율적인 방법으로이를 수행 할 수있는 알고리즘이 있습니까? 나는 바퀴를 재발 명하고 싶지 않고 결국 데이터베이스는 엄청난 수의 세트를 갖게 될 것입니다.

+0

모습의 수에 의해 모든 세트의 요소 및 순서를 선택합니다. 왜 D가 당신의 코드 세트 D : 1로 설정되어 있습니까? 이것이 결과 집합입니까? – Yada

+0

아니요, 가장 관련성이 높은 번호를 얻을 수 있도록 다른 모든 사람들과 비교하기를 원하는 것입니다. 숫자 집합은 다른 사람들과 비교할 쿼리 일 수 있습니다. 즉, D가 1, 7 인 경우 : 4, 5, 6의 순서로 관련이 있어야합니다 (1, 7은 공통 4를 갖는 2 세트에 공통적이며, 7은 더 많은 '연결'을 갖는 세트에 있기 때문에) 다른 사람들과 마찬가지로 5,6가 가장 관련이 있어야합니다.), 3, 2 (연결이 적지 만 여전히 관련이 있기 때문에) -> 복잡하지만 잘 표현하는 법을 모르겠습니다. – stagas

답변

1

, 난 당신이 테이블을 가정합니다 (당신이 제거 될 t의 요소 의도 않은 경우, 나는 4의 후 처리 단계로 그렇게 할 것) 2 열, 요소에 대해서는 e, 집합 이름에 대해서는 s라는 두 개의 열이있는 호출 집합.

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 

설명 :

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

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

가 이전에 선택된 군 일반 회원이 모든 그룹 선택 그룹 D.

의 요소를 선택한다.

그리고 당신은 단어 할 수 있습니다 질문 더 나은 (joel가 제안)

+0

우수. 오브리 감사합니다. 이것은 내가 원하는 것입니다! 한 가지 질문 : 요소를 자주 추가하고 세트를 추가하는 모든 세트에서이 쿼리를 얼마나 빨리 수행 할 수 있습니까? 나는 얻을 수있는만큼 빠르다 고 생각하니? – stagas

+0

나는 SQL 전문가가 아니기 때문에 최대한 빨리 확신하지 못합니다. 하지만 충분히 간단해서, 그냥 시도해 볼 수 있습니다 (합성 데이터 포함). –

2

하나의 예는 완전한 명세를 작성하지 않습니다. 세트의 수집도 3 D와 비어 있지 않은 교차로가 세트 중 가장 자주 발생하는 값을 만들 것

set E: 1 2 3 
set F: 1 3 

을 포함 예를 들어, 어떻게 당신의 대답은 다른 것입니까? 그래서 여기 내 가정은 다음과 같습니다

(원래 예에 D) 목표 설정을 감안할 때 :

  1. 값 "중복 세트"더 관련이있는 (목표 세트 비어 있지 않은 교차로가 세트)에 그 중첩 세트에없는 값.
  2. 구문 1의 제약 조건에서 관련성은 발생 빈도에 따라 결정됩니다. 원래 예에서

AD과 중첩되므로 우주는 {1, 2, 3, 4, 5, 6, 7}로 분할되어 {1, 2, 3, 4} 및 비 중첩 중첩 {5, 6, 7}. 값의 빈도는 {1 : 2, 2 : 1, 3 : 2, 4 : 3, 5 : 2, 6 : 2, 7 : 1}입니다. 이러한 사실을 결합하면 4, 3, 4, 4, 4, 4, 5, 6, 1, 2 다음에 5, 6, 7이옵니다 (1에 관련성을 부여하지 않았 음을 알았습니다. 의도적 인 경우 최종 주문에서 대상 집합의 값을 제거하는 마지막 단계 일 수 있음)

조정 된 예제에서 주파수는 {1 : 4, 2 : 3, 3 : 4, 4 : 3, 5 : 2, 6 : 2, 7 : 1}이됩니다. 이는 중첩 주파수 {1 : 4, 2 : 3, 3 : 4, 4 : 3} 및 비 중첩 주파수 {5 : 2, 6 : 2, 7 : 1} 도 4는도 5, 6은이 알고리즘에 대한 제

의사 코드는 다음 기준 :

  1. 초기화 overlappinguniverse 빈 세트로하고 frequency 빈 해시한다.

    2.1 : 각각에 대해

  2. 은 (t 타겟 세트 이외의) 세트들의 컬렉션 s 세트. universesuniverse

    2.2의 조합으로 설정하십시오.

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

    2.3 : st와 교차하는 경우 적어도 하나 개의 요소를 가지고있다. universe의 차이 overlapping

  3. 정렬 결과의 첫 번째 부분으로 frequency 그들의 값에 의해 universe의 요소

    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 
    
  4. 세트 nonOverlapping 각 요소에 se 들어.

  5. nonOverlapping의 요소를 덧붙여 frequency의 값으로 정렬합니다.

SQL에서

+0

감사합니다. 매우 감사합니다! PHP/MySQL 코드의 일부 알고리즘은 이미 어딘가에 있어야한다고 생각했지만 아무것도 찾을 수 없습니다. 나는 이것을 코드화 할 수있다. 그러나 나는 내 코드가 어디서든지 가까운 곳에있을 것이라고 생각하지 않는다. – stagas

관련 문제