2011-12-02 2 views
1

나는 많은 목록을 가지고 있으며 그것들을 비교하고 톱 페어를 얻고 싶다. 두 개의 고유 번호가 목록에 함께 있으면 쌍입니다.목록을 비교하고 가장 빈번한 쌍을 효율적으로 얻는 방법은 무엇입니까?

목록 1 => 1 4 5 6 0 7

목록 2 => 2 3 8 6 1 9

목록 3 => 4 7 1 3 5 6

1,6 - 3 회 (목록 1,리스트 2, 목록 3) 최고 쌍

1.5 - 2 회 (목록 1, 목록 3)

4,5 - 2 회 (목록 1, 목록 3)

2,3 - 1 회 (만리스트 2)

어떻게 효율적으로이 작업을 수행하려면?

참고 : 목록에는 같은 번호가 없습니다. 모든 숫자는 목록에서 고유합니다.

+1

무엇이 지쳤습니까? &&이 문맥에서 '쌍'은 무엇을 의미합니까? – soulcheck

+0

어떤 프로그래밍 언어를 원하십니까? – ChrisBD

+0

나는 C#에서 이것을 원한다. – onurbaysan

답변

0

목록을 세트로 사용하고 있습니다. 사용법을보다 잘 일치 시키려면 먼저 모든 목록을 정렬하고 중복을 제거하십시오 (또는 사용 가능한 경우 집합 데이터 구조 사용).

각 쌍의 모든 쌍을 생성하고 쌍을 키로, 정수를 값으로 사용하여 해시 테이블에서 항목을 계산합니다. 생성은 간단한 중첩 루프로 수행 할 수 있습니다. 해시 테이블의 값으로 키를 정렬하십시오.

+0

질문이 업데이트되었습니다. 각 목록에는 동일한 값이 없습니다. 이 목록을 세트로 간주 할 수 있습니다. – onurbaysan

0

가능한 해결책.

정렬 각 목록 및 10 비트 이진수로 변환

예컨대

목록 하나 개

9 8 7 6 5 4 3 2 1 0 
    N N Y Y Y Y N N Y Y = 243 

목록 두

9 8 7 6 5 4 3 2 1 0 
    Y Y N Y N N Y Y Y N = 846 

목록 세

,536,913 쌍

0,1 = 3 
0,2 = 5 
... 
1,5 = 34 
... 
5,7 = 160 
... 
8,9 = 768 

값과 계산의 목록 (I가 용이 한 쌍 텍스트 표현을 포함 시켰습니다)

를 만들기위한 63,210
9 8 7 6 5 4 3 2 1 0 
    N N Y Y Y Y Y N Y N = 250 

사전 생성 가능한 모든 값

예 :

public class Details { 
    public string Pair { get; set; } 
    public int Value { get; set; } 
    public int Count { get; set; } 
} 

// selection only 
public readonly static List<Details> PairDetails = new List<Details>() { 
    new Details{Pair = "0,1", Value = 3}, 
    new Details{Pair = "0,2", Value = 5}, 
    new Details{Pair = "1,5", Value = 34}, 
    new Details{Pair = "1,6", Value = 66}, 
    new Details{Pair = "2,3", Value = 12}, 
    new Details{Pair = "4,5", Value = 48} 
}; 

는 쌍을 반복하고

foreach (var details in PairDetails) { 
    foreach (var value in values) { 
     if ((value & details.Value) == details.Value) { 
      details.Count++; 
     } 
    } 
} 

var most = PairDetails.Where(dtls => dtls.Count == PairDetails.Max(dt => dt.Count)).ToList(); 

이 당신에게 목록에 시대의 대부분의 금액을 발생하는 모든 쌍의 목록을 줄 것이다 나열합니다.

hth,

앨런.

관련 문제