2010-08-03 5 views
3

사실, 이것은 SQL에만 국한된 것이 아니며 "대화 패턴"이 올바른 이름인지는 의심 스럽지만 더 나은 캡션을 생각할 수는 없습니다.SQL에서 "대화"패턴을 어떻게 탐지합니까?

단순화하기 위해 방대한 int 스트림이 있다고 가정 해보십시오. 작업은 A.{1;max_n}A 패턴을 감지하는 것입니다. int가 n (> 0) 다른 int가오고 그 다음 원래의 int가 다시 오는 경우 패턴을 충족시킵니다. n < = max_n입니다.

예 : max_n < = 3 패턴 값 4 대한 만족 그래서 여기

... 
1 
4 <-- 
7 \ 
3 > n = 3 
3/
4 <-- 
2 
... 

상기 INT 4는, 그 사이 임의의 int (3)을 반복한다.

질문은 어떻게 데이터의 거대한 덤프에서 어떤 정수가이 패턴을 따르는 지 감지 할 수 있습니까? 대부분 알고리즘 자체에 관심이 있지만 SQL 또는 C#의 예제도 환영합니다.

내가 생각한 순진한 아이디어는 먼저 목록이나 모든 고유 한 int를 수집 한 다음 각 패턴에 대해 간단한 방식으로 패턴을 확인하는 것이지만 성능 병목 현상을 일으킬 수 있습니다.

+0

는 아마도 숫자 테이블을 사용하여 ... –

+0

미안해하는 숫자 테이블은 무엇인가? – mafu

+1

SQL은 집합에서 작동합니다. 출력 집합의 행을 비교하기 위해 실제로 설계되지 않았으므로 이러한 종류의 분석에는 적합하지 않습니다. –

답변

1

숫자의 첫 번째 발생 위치가 저장되는 사전 (C#) 또는지도 (C++) 구조를 저장할 수 있습니다.

그런 다음 모든 번호에 대해지도에 표시되는지 확인해야합니다. 그렇다면 - 이전에 발생한 최대 위치 차이와 위치 차이를 비교해야합니다. 그렇지 않으면지도에 번호와 위치를 저장해야합니다.

+0

당신의 아이디어는 가장 간단하고 여전히 효과적 일 것입니다. O (n * log n)에 대한 나에게 들립니다. – mafu

+0

사용 된 데이터 구조가 해시를 통해 구현되는 경우 O (n) 복잡도를 달성 할 수 있습니다. – DixonD

+0

실수로 합리적인 해시 함수를 사용하면 'O (n)'이됩니다. – mafu

0

SQL은 최적의 방법으로 처리하지는 않지만 열을 인덱싱하면 끔찍하지 않을 수 있습니다.

먼저 SQL의 주문에 대해 다른 컬럼이 있어야합니다. 그 열이 행 번호에 실제로 같다면 당신은 할 수 있습니다

SELECT DISTINCT 
    t1.number 
FROM 
    table t1, table t2 
WHERE 
    (t1.rownumber-t2.rownumber) <= @max_n AND 
    (t1.rownumber-t2.rownumber) >=1 AND 
    t1.number = t2.number AND 
관련 문제