2010-08-11 5 views
0

많은 계산을 수행하고 가장 안쪽 루프를 최적화하려고하는 프로그램을 마치고 있습니다.VB.NET에서는 최적의 성능을 위해 정수를 반환하므로 두 문자를 사용할 때 사용할 데이터 구조는 무엇입니까?

현재 계산 중 많은 수의 단어 쌍을 반복 계산하고 해당하는 문자 쌍 수의 테이블을 만듭니다. (

voice 
louse 

및 문자 쌍은 (V, l) (O, O)을 (I, U)를, (C, S), 그리고 것이다 : 예를 들어, 단어 한 쌍 수도 e, e)이 쌍들은 모두 1의 카운트를 갖는다. 조합 (v, l)이 다른 단어에서 다시 만나면, 그 카운트를 2로 증가시킬 것이다.

최고의 성능을 위해 어떤 데이터 구조를 사용해야합니까? 두 개의 문자가 주어지면 그 쌍의 수를 가져와야합니다. 같은 현재 내가 누구 선언 중첩 된 해시 테이블을 사용하고하는 모습이 데이터 구조를 사용

Dim data As New Dictionary(of String, Dictionary(of String, Integer)) 

, 프로그램은 검색 모든 정수 두 문자열을 해시해야합니다. 모든 문자 쌍에 대해 먼저 쌍이 해시 테이블에 있는지 확인하고 추가하지 않으면 추가 해시가 두 개 필요합니다. 또한 키가 "="vl "이고 값이 1 인 두 문자가 연결된 한 레벨 해시 테이블을 고려했습니다. 그러나이 문자열 연결은 VB에서 상대적으로 느립니다.

그럼, 내 질문은 : 어떻게 빠른 VB에서 사전

입니까? 4 개의 해시가 하나의 해시 및 문자열 연결 (두 수준 대 한 수준 해시 표)보다 빠릅니까?

빠른 추가 및 검색을 허용하는 이러한 종류의 데이터를 저장하는 더 나은 구조를 생각할 수 있습니까?

답변

4

하나의 옵션은 Dictionary(Of Integer, Integer)을 사용하는 것입니다. .NET 유니 코드 문자는 UTF-16 코드 단위이므로 부호없는 16 비트 정수로 변환 할 수 있습니다.

그런 다음 2 개의 부호없는 16 비트 정수를 32 비트 정수로 매우 쉽게 결합 할 수 있습니다.

int combination = (((int) char1) << 16) | ((int) char2); 

편집 : 또는, 당신은 단지 시작하고, 이동과 같은 방법 : 난 그냥 사용하는 거라고 C#에서

에 결합하는 32 비트 부호없는 정수로 각 코드 단위를 변환 할 수 있습니다 : jeroenh의 의견에 따르면, VB 동등한입니다 : 정수 =으로

Dim combination As Integer = (AscW(char1) << 16) Or AscW(char2) 
+1

'희미한 조합 (ASCW (char1을) << 16) 또는 ASCW (char2)는' – jeroenh

+0

@jeroenh : 감사합니다, 나는 그에서 편집했습니다. –

+0

우수! 이렇게하면 계산 속도가 약 3 배 빨라집니다. – davidscolgan

관련 문제