2014-03-14 4 views
4

해시 테이블에서 값을 검색하고 가장 작은 키를 반환하는 인터뷰 질문이 있습니다.가장 작은 키를 찾기위한 해시 테이블 역방향 조회

내 접근 방식은 해시 테이블을 키별로 정렬하고 검색된 값에 해당하는 키를 찾기 위해 반복합니다.

def smallestKey(x): 
    my_dict = {10:20, 5:30, -2:25, 1:20} 
    for key in sorted(dict.iterkeys()): 
     if (my_dict[key] == x): 
      print key 

더 나은 방법이 있나요 :

는 파이썬에서이 기능을 썼다? Java에서 어떻게 동일한 작업을 수행 할 수 있습니까?

+2

모든 키를 통해 선형 검색을 수행하고 정렬없이 최대 값을 기록하는 것이 좋습니다. 정렬은 'Theta (nlogn)'를 취하기 때문입니다. –

+1

[1] Java에서이 작업을 수행하려면 외부 라이브러리가 필요합니다. [1] : https://stackoverflow.com/questions/1670038/does-java-have-a-hashmap-with-reverse-lookup?rq=1 – Acapulco

+0

@ C.B. 거기에 요점이있다. – Acapulco

답변

1

만약 당신이 무엇을 검사하고 있는지, 그리고 어떤 유형의 키가 Number인지를 보장 할 수 있다면 기꺼이 할 수 있습니다.

다음은 코드 샘플입니다. 정렬 비용은 O (n log (n))이고 선형 검색은 O (n)이므로이 성능은 O (n log (n)) 정도입니다. 더 사용할 수있는 실제 사례가 될 수

public <K extends Number & Comparable<K>, V extends Number> K findSmallestKey(Map<K, V> values, V searchItem) { 
    // Grab the key set, and sort it. 
    List<K> keys = new ArrayList<>(values.keySet()); 
    Collections.sort(keys); 
    for(K key : keys) { 
     if(values.get(key).doubleValue() == searchItem.doubleValue()) { 
      return key; 
     } 
    } 
    return null; 
} 

구아바 offers BiMap; 그러나 중복 값을 덮어 쓰지 않고 중복 값을 허용하지 않습니다.

다음은 그 예입니다.

public <K extends Number, V extends Number> K findSmallestKeyWithBimap(BiMap<K, V> values, V searchItem) { 
    return values.inverse().get(searchItem); 
} 

그것은 많은 더 간결한, 그리고 이전 그랬던 것처럼 제네릭의 같은 종류를 필요로하지 않는다 (이 단지 Number하지 할 필요가 모두 NumberComparable). 또한 유연성이 훨씬 떨어 지므로 그 특성으로 인해 키와 값 사이에 일대일 매핑이 명시 적으로 보장됩니다.

+0

검색 항목이 가장 작은 키가 아니 었습니까? 이 경우 searchItem을 사용할 필요가 없습니다. 정렬 된 배열의 첫 번째 요소를 반환합니다 (가장 작은 배열에서 가장 큰 배열로 정렬 한 경우)? 반면에 특정 항목을 검색해야하는 경우 이진 검색은 이미 정렬 된 후에 더 빠릅니다. – Acapulco

+0

필요는 없습니다.BiMap을 사용하지 않고 두 값이 같은 경우, 첫 번째 발생 키를 찾아야합니다. 그것이 항상 첫 번째 요소임을 보장하지는 않습니다. 내 검색 항목이 300이고 키 번호 매기기가 127이고 133이면 127이 올바른 답입니다. – Makoto

+0

사실입니다. 하지만 선형 검색 대신 이진 검색을 사용하는 것이 어떻습니까? – Acapulco