2009-11-17 1 views
0

구문 분석 중이며 데이터를 추출하려고하는 xml이 있습니다. 입력 XML 파일을 구문 분석 한 결과 데이터 세트에 (2) 테이블이 있다고 가정 해 보겠습니다..NET DataSet 쿼리 효율성

표 1은 IP 주소와 기본 키를 포함합니다. 표 # 2에는 포트 번호와 일치하는 기본 키가 들어 있습니다.

두 테이블을 모두 살펴보고 IP 주소와 포트가 일치하는 개체를 생성하려고합니다. 기본적으로 동일한 기본 키를 공유하는 두 테이블의 데이터를 병합합니다.

지금 저는 foreach 루프를 다른 foreach 루프 내에 중첩 시켰습니다. 바깥 쪽은 각 IP 주소를 통과하고 내부 IP 주소는 각 포트를 통과하고 동일한 기본 키와 일치합니다.

결과는 작동하지만 O (n^2)입니다. 이 작업을 수행하는 더 빠른 방법이 있습니까?

BTW, 난 당신이 적절한 열을 각 DataTablePrimaryKey 속성을 설정했는지 확인

답변

1

우선 C#을 사용하고 있습니다. 그런 다음 내부 루프 대신 table.Rows.Find(primaryKeyValue)을 사용하여 두 번째 DataTable에서 적절한 행을 꺼냅니다. NT와 Compact 프레임 워크 모두에서 이것은 내부적으로 red-black tree 인덱스를 생성하고 사용하여 O (n log n) 시간을줍니다.

O (n)을 얻으려면 두 번째 테이블의 행 중 Dictionary (내부적으로는 hash table)을 작성하고 이에 대한 조회를 수행해야합니다. 삽입 중에 크기를 조정할 필요가없는 을 충분히 capacity으로 만들어야합니다.

+0

이 "사전"을 처음 생성하는 프로세스가 적어도 O (n) 시간이 아니겠습니까? 사전을 사용하려면 추가 시간이 필요합니다. 어떻게 전체 프로세스에 대한 O (n)입니까? – Nick

+0

두 경우 모두 인덱스를 작성하려면 루프를 수행해야합니다. 'DataTable'의 경우 루프는 코드 대신 System.Data 어셈블리에 있으므로 표시되지 않습니다. 또한 big-O 표기법은 계수를 무시합니다. O (n) == O (2 * n) - 대략적으로 두 개의 반복은 계수 2에서 곱하는 것을 의미합니다. http://en.wikipedia.org/wiki/ Big_O_notation –