2009-03-13 7 views
5

클래스 중 하나에 인스턴스 멤버로 조회 테이블을 저장해야합니다. 객체가 생성되면 테이블이 초기화됩니다. 나는 어느 StringKey 또는 EnumKey에 의해 조회를 수행하기위한 최상의 성능을 얻을 것입니다 데이터 구조를 선택 할이 메모리 내 룩업 테이블을위한 최상의 데이터 구조는 무엇입니까?

StringKey (e.g., "car") 
EnumKey (e.g., LookupKeys.Car) 
Value (e.g, "Ths is a car.") 

: 각 "행"3 "열"을해야합니다.

동일한 사전 값에 대해 2 개의 키가있는 것은 다소 어색합니다. 전에는 이런 일이 발생하지 않았으므로 이런 종류의 일에 대한 표준이 무엇인지 궁금합니다.

키/값/값 대신 키/값/값 구조를 만들 수 있지만 성능에 어떤 영향을 미치는지 궁금합니다.

나는이 모든 잘못에 대해 생각하고 있습니까?

답변

4

두 개의 해시 맵이 있습니다.

  • 하나는 StringKey에서 값까지입니다.

  • 하나는 EnumKey에서 값까지입니다.

모든 Value 인스턴스를 복제 할 필요가 없으며 두 개체가 두 해시 맵간에 공유 될 수 있습니다.

많은 항목이 있다면 두 개의 해시 맵 대신 두 개의 트리 맵을 사용할 수 있습니다. 그러나 필수 원칙 ("가치 공유")은 두 가지 구조 모두에 적용됩니다. 두 개의 맵을 갖는 하나의 값 집합.

+0

예 - "value instances"는 문자열입니다. 값이 동일한 문자열 참조 변수를 포함하는 두 개의 사전 (하나는 StringKey, 하나는 EnumKey)을 만들겠습니다. 그게 맞는 것 같니? –

+0

정확하게. 파이썬에서는 그게 전부입니다. Java에는 모든 intern() 문자열이 일반적인 문자열 풀로 축소되어 가능한 중복을 제거하도록 보장하는 string.intern()이 있습니다. –

+0

C#을 사용하고 있습니다 ... .NET에서 각 사전에 추가 할 때 문자열 복사본을 만들지 알고 있습니까? –

5

음 ... "잘못"은 가혹한 방식입니다. 가장 일반적인 사전은 "가치있는 단일 키"이기 때문에 그 (지도)에 효율적인 데이터 구조를 제공하기 위해 많은 노력이 필요하다고 생각합니다. 그 중 두 가지를 사용하여 값에 대한 메모리를 공유하는 것이 가장 좋습니다. if 가능하면.

1

키의 두 가지 유형 모두를 사용하여 동일한 구조를 실제로 입력해야합니까? 복잡한 데이터 구조를 직접 재구성 할 필요는 없습니다. 조회 테이블에 대해 일종의 캡슐화를 수행하여 메모리가 문제가되지 않는다면 실제로 두 개의 조회 테이블을 가질 수 있습니다. 이 캡슐화 구조를 사용하여 두 가지 키 유형 중 하나를 사용하여 "같은"구조의 값을 추출 할 수 있습니다.

또는

는 열거 값 만 조회 테이블의 한 유형을 갖는 그 길을 갈 수 문자열 키 사이에 매핑 할 수있는 방법이 있다면.

0

LINQ의 ILookup (TKey, TElement) 인터페이스가 도움이 될 수 있습니다.

Dictionary<carKey, carValue> cars; 

당신은 사용할 수 있습니다 : 당신의 사전을 가정하면 같은이

ILookUp<carValue, carKey> lookup = cars.ToLookup(x => x.Value, x => x.Key); 

(... 사실은 내가 질문을 오해 약간있을 수 있습니다 생각 -하지만 iLookup으로 여전히 법안에 맞게 수 있지만 키/값 세트가 키와 enum 일 필요가 있습니다.)

0

두 값 모두에서 모든 값에 액세스 할 수 있으면 다른 유형의 키를 다른 값으로 변환하는 것이 좋습니다. 예를 들어 :

public Value getValue(String key) 
{ 
    dictionary.get(key); // normal way 
} 

public Value getValue(Enum enumKey) 
{ 
    String realKey = toKey(enumKey); 
    getValue(realKey); // use String key 
} 

당신은 당신의 열거가 문자열 키를 반환, 아니면 문자열 대응에 열거 값을 매핑 다른 사전을 가지고 toKey를() 메소드를 구현있을 수 있습니다.