2011-09-21 3 views
0

값이 a^j 인 해시 테이블이 있습니다. j는 키이고 a^j는 값입니다. 다른 값을^m으로 계산 중입니다. 기본적으로^m이 해시 테이블에 있는지 확인하려고합니다. ContainsValue fn을 사용했습니다. 값을 찾으십시오. 가치의 열쇠를 찾는 방법은 무엇입니까?해시 테이블에서 값의 키를 검색하는 중 C#

다음은 값 검색을 구현하려는 간단한 스 니펫입니다.

Dictionary<BigInteger, BigInteger> b = new Dictionary<BigInteger, BigInteger>(); 
    ***add a bunch of BigIntegers into b*** 
    for(int j=0; j < n; j++) 
    { 
     z = q* BigInteger.ModPow(temp,j,mod); 
     ***I want to implement to search for z in b here**** 
    } 

변경 사항이 있습니까? 사실 for 루프를 검색하는 중입니까?

+1

Y '사용하지 않습니까? – NullUserException

+0

사전을 사용하는 방법을 모르겠다. 적어도 해시 테이블에서 필요한 부분을 수행하는 방법을 이미 알고있다. BigIntegers의 해시 테이블을 사전으로 변환하는 것이 쉬울까요? – Nook

+0

그리고 키가 지수 인 경우, 키가 'm'인지 확인하십시오 (http://msdn.microsoft.com/en-us/library/system.collections.hashtable.containskey .aspx)? – NullUserException

답변

0

편집 : Dictionary<TKey, TValue>

Dictionary<TKey, TValue>IEnumerable<KeyValuePair<TKey, TValue>>이다 사용하도록 변경.직접 foreach을 수행하면 각 항목의 키와 값을 모두 얻을 수 있습니다. 당신은 닷넷 프레임 워크의 새로운 버전이있는 경우

class SomeType 
{ 
    public int SomeData = 5; 

    public override string ToString() 
    { 
     return SomeData.ToString(); 
    } 
} 

// ... 

var blah = new Dictionary<string, SomeType>(); 
blah.Add("test", new SomeType() { SomeData = 6 }); 

foreach (KeyValuePair<string, SomeType> item in blah) 
{ 
    if(e.Value.SomeData == 6) 
    { 
     Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value); 
    } 
} 

, 당신은 당신의 상대를 만나 Linq에를 사용하고, 자신의 컬렉션을 배치 할 수 있습니다. 다음은 약간의 Linq 구문을 보여주는 코드 샘플입니다.

using System; 
using System.Collections; 
using System.Linq; 

class SomeType 
{ 
    public int SomeData = 5; 

    public override string ToString() 
    { 
     return SomeData.ToString(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var blah = new Dictionary<string, SomeType>(); 
     blah.Add("test", new SomeType() { SomeData = 6 }); 

     // Build an enumeration of just matches: 

     var entriesThatMatchValue = blah 
      .Where(e => e.Value.SomeData == 6); 

     foreach (KeyValuePair<string, SomeType> item in entriesThatMatchValue) 
     { 
      Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value); 
     } 

     // or: ... 

     // Build a sub-enumeration of just keys from matches: 

     var keysThatMatchValue = entriesThatMatchValue.Select(e => e.Key); 

     // Build a list of keys from matches in-line, using method chaining: 

     List<string> matchingKeys = blah 
      .Where(e => e.Value.SomeData == 6) 
      .Select(e => e.Key) 
      .ToList(); 
    } 
} 
+0

해시 테이블에서 ... 거의 모든 사람이 제안한대로 사전을 변경했습니다. 자 이제 사전 b에서 값 v를 검색하는 방법을 바꿀까요? v의 열쇠를 찾았습니까? – Nook

+0

@ Nook :이 답변에서 솔루션을 사용할 수 있습니다. 캐스트를 제거하면됩니다. 'Dictionary '는 IEnumerable > '이고,'Hashtable'은 일반'IEnumerable' ('DictionaryEntry' 타입의'object' 인스턴스를 반환합니다)입니다. 나는이 변화를 반영하기 위해 답을 편집 할 것이다 ... –

+0

고마워! 그러나 나는 또한 내가 Nook

0
private object GetKeyByValue(object searchValue) 
{ 
    foreach (DictionaryEntry entry in myHashTable) 
    { 
     if (entry.Value.Equals(searchValue)) 
     { 
      return entry.Key; 
     } 
    } 

    return null; 
} 
1

가장 빠른 방법은 다시 당신에게 키를 제공 값을 찾기 위해 해시 테이블의 DictionaryEntry 항목을 반복하는 아마. 어떻게 해야할지 모르겠다.

1

첫째, 당신이 절대적으로 Dictionary<TKey, TValue> 대신 Hashtable를 사용한다 - 당신이 .NET 4에서 BigInteger를 사용하는 경우, 모든 곳에서 당신이 할 수있는을 일반적인 컬렉션 를 사용하지 않을 이유가 없습니다. 사용 방법에 차이가없는 부분은 대부분 다음과 같습니다.

Dictionary<BigInteger, BigInteger> map = 
    new Dictionary<BigInteger, BigInteger>(); 

으로 시작하는 것이 가장 좋습니다. 주의해야 할 점은 키가지도에없는 경우 인덱서가 예외를 throw한다는 것입니다. TryGetValue이 있으면 값을 가져오고 을 사용하면 이되었는지 여부를 나타낼 수 있습니다.

값으로 키를 찾는 방법은 없습니다. Dictionary에서 효율적으로 수행 할 방법이 없습니다. 당신은 쉽게 LINQ와 함께 수행하는 모든 항목을 검색 할 수 있습니다

var key = map.Where(pair => pair.Value == value) 
      .Select(pair => pair.Key) 
      .First(); 

을하지만 일치하는 항목을 찾을 때까지 그 전체 사전을 반복 할 것이다, 그래서는 O (N) 작업입니다. a^j-a에서 하나 a^j에서 a 한 - 당신이 효율적으로이 작업을 수행하려면

, 두 개의 사전을 유지해야합니다. 항목을 추가 할 때 두 방법을 모두 추가하십시오. 어딘가에 스택 오버플로 내가 당신을 위해 이것을 수행하는 클래스의 몇 가지 샘플 코드를 가지고 있지만 쉽게 찾을 수 있을지 의심 스럽다. 편집 : 거기에 여러 매핑을 가진 하나의 here; "단일 매핑"버전이 그 아래에 있습니다.

어쨌든, 각 방향으로 하나씩 두 개의 사전이 있으면 쉽습니다. 두 번째 사전에서 a^m을 키로 검색하면 원래 값을 찾을 수 있습니다. 이 원래의 키가 같은 값으로 끝낼 수 있도록 당신이 그것을 가능 여부를 고려해야합니다

주 - 그 시점에서 당신은 분명 하나의 역 사전에 모두 매핑을 할 수 없을 것이다 (이것은하지 않는 한 Dictionary<BigInteger, List<BigInteger>> 또는 이와 비슷한 것).

+0

잘 값 a^m은 내가 질문에 넣은 것입니다. 프로그램에서 q = j * BigInteger.ModPow (a (inverse), j, mod)이고 for 루프는 0 Nook

+0

이전 대답은 다음과 같습니다. http://stackoverflow.com/ 질문/255341/get-of-generic-of-generic-dictionary 사전 –

+0

@Nook : 그건 상관 없어요. 기본적으로 키를 가지고 있고 값에 매핑됩니다. 다른 방법으로가는 효율적인 방법을 원하면 다른 매핑을 만들어야합니다. 이 조회가 O (n) 인 것에 신경 쓰지 않는다면 대신 반복 할 수 있습니다. –

관련 문제