2012-07-09 6 views
1

먼저이 질문은 거기에 묻는 질문자를위한 Most efficient method to get key for a value in a dict의 복제본이 아닙니다. 또한 아래에 주어진 솔루션이 의미가 있는지 그리고 제대로 작동하는지 그런 문제.자바에서 값에서 키를 가져 오는 효율적인 방법

그래서, 나는 다음과 같은 자료 구조 다음 한의가 가정하자 :

{ 
    "one" : "1", 
    "two" : "2", 
    . 
    . 
    "hundred thousand" : "100000" 
} 

는 지금, 나는 (나는 다른 키에 같은 값이없는 것으로 가정) 특정 값에 대한 키를 얻을 수 싶어요. 한 가지 해결책은 우리가 우리의 데이터를 구조화하는 경우 우리의 코드가 될 수있는 데이터하지만 어떻게 효율적으로 반복하여 키를 얻을 수 있습니다 :

data = [ 
    { 
     "one" : "1", 
     "two" : "2", 
     . 
     . 
     "hundred thousand" : "100000" 
    }, 
    { 
     "1" : "one", 
     "2" : "two", 
     . 
     . 
     "100000" : "hundred thousand" 
    } 
    ] 

그래서, 지금 data[0]."two"이 두 가지의 값을 가져 오는 데 사용할 수 있습니다. 그러나 값을 999로 알고 그 키를 얻으려는 시나리오가 있다고 가정 해 data[1]."999"을 수행합니다. 즉 데이터 [1]에서 역 데이터를 사용합니다.

이 솔루션은 올바른 키를 찾기 위해 데이터를 반복하는 것보다 빠릅니다. 어떻게 생각해?

+2

표준 자바 스크립트에서이 작업을 수행하는 방법은 전체 요소 집합을 반복하지 않아도됩니다. 또한이 질문에서 Javascript에 대해 이야기하는 경우 위의 내용이 사전이 아니라 _ ​​개체 _ 배열임을 지적하는 것이 중요합니다. 이 질문을보십시오 : http://stackoverflow.com/questions/9907419/javascript-object-get-key-by-value –

+0

예를 들어 설명 된 것처럼 사전은 항상 정렬됩니까? –

+0

아니요, 꼭 그런 것은 아닙니다. – baltoro

답변

0

여러 키가 동일한 값을 가질 수 있으므로 문제에 대한 일반적인 해결책은 없습니다. 특정 예를 들어, 속도 측면에서 효율성에 대해 이야기하고 있다면 역방향지도를 사용하는 현재의 솔루션이이를 수행하는 가장 빠른 방법입니다 (역방향지도를 저장하기위한 추가 공간이 필요함).

+0

고마워요 @ 카사 블랑카, 나는 동일한 가치를 지닌 여러 개의 열쇠를 가지지 않을 것이라고 언급했습니다. – baltoro

2

모든 키를 반복하는 것이 비효율적이며 역방향 조회 해시를 유지하기 위해 제안한 방법이이 문제를 해결하기 위해 본 가장 일반적인 방법입니다. 물론 최상의 솔루션은 역방향 조회를 수행 할 필요가없는 디자인을 만드는 것입니다.

적은 수의 키를 저장하고이 조회를 자주 수행하지 않으면 O (n) 비용이들 것입니다. 물론이 경우 역방향 조회 해시는 유지 보수가 필요하지 않습니다. 다량 다치게한다). 또 다른 극단에서는 수백만 개의 키가 있고 역방향 조회 해시가 발생하는 메모리를 사용할 수없는 경우 블룸 필터와 같은 것을 사용하여 조회 비용을 줄일 수 있습니다.

+0

Bloom Filters는 특정 값이 세트에 "존재"하는지를 찾는 데 도움이됩니다. – baltoro

+0

@baltusaj 글쎄, 그들은 특정 값 _probably_가 세트에 존재하는지 알려주므로 거대한 세트가있는 경우 특정 최적화가 이루어지며 조회하려는 값의 대부분이 세트에 존재하지 않습니다 따라서 블룸 필터를 먼저 확인하고 긍정적 인 결과를 얻는 경우에만 조회를 수행 할 수 있습니다. 아마도 여기에는 관련이 없지만 나는 현명하게 들리고 싶었습니다. / –

관련 문제