2011-10-31 2 views
1

한다고 가정 등 세배 내가 문자열의 큰 목록 (약 10,000 항목)이 있습니다가장 효율적인 자바 데이터 구조

car noun yes 
dog noun no 
effect noun yes 
effect verb no 

은 가정하자 내가 두 문자열을 제시하고있다 - 예를 들어, (효과, 동사) - 목록에서 신속하게 검색하여 쌍이 나타나는지 확인하고, 일치하는 경우 값이 예 또는 아니요인지 확인해야합니다. (이 예제에서는 double이 나타나고 값은 "no"입니다.)

목록을 저장하는 가장 효율적인 데이터 구조는 무엇이며 검색을 수행하는 가장 효율적인 방법은 무엇입니까? 나는 속도가 본질의 그래서이 수십만의 검색을 실행하고 있습니다.

감사합니다.

답변

5

HashMap<YourDouble, String>을 사용해보십시오. 검색은 O (1)가됩니다.

처음 두 값을 보유하는 YourDouble을 만들거나 값이 여전히 고유 한 경우 하나를 다른 것에 추가 할 수 있습니다. HashMap<String, String>을 사용할 수 있습니다.

+0

안녕하세요, 키를 만들기 위해 처음 두 문자열을 연결해야한다는 의미입니까? – Andrew

+0

나는 그것이 당신을위한 선택일지도 모른다고 말하고 있습니다. 결과 키가 여전히 고유하다는 것을 보증 할 수 있다면. 그것은 당신의 데이터에 달려 있습니다. 대신 String을 사용하면 YourDouble 객체를 만들지 않아도됩니다. –

+0

모든 해답이 도움이되었으며 HashMap을 제안합니다. HashMap 으로 작업하겠습니다. – Andrew

1

내가 원하는 검색 유형마다 HashMultimap을 만들 것입니다. "모두 3 개", "각 쌍"및 "각 단일 필드". 목록을 작성할 때 모든 다른 맵을 채우면 u 리에 적합한 맵에서 가져올 수 있습니다.

(단점은 적어도 "단일 필드"맵에는 String 만 사용하고 두 필드 맵에는 Pair을 사용하고 3 필드 맵에는 Triple을 사용하는 것입니다. 현장지도.)

+0

첫 번째 쌍만 검색해야하므로 HashMap with Pair가 가장 쉬운 솔루션입니다. – Andrew

1

당신은 키가 처음 두 문자열은 조회에 사용할 수 있습니다, 사람의 연결입니다 HashMap를 사용할 수 있으며, 값은 yesno 문자열을 나타내는 부울입니다.

또는 두 번째 열의 단어가 카테고리를 나타내므로 적은 것으로 보입니다. HashMap<String, HashMap<String, Boolean>>을 가질 수 있습니다. "명사", "동사"등. "자동차", "개", "효과", 귀하의 부울로 이동합니다. 이것은 아마도 더 공간 효율적인 것입니다.

+0

두 개의 첫 번째 문자열을 포함하는 키와 equals 및 hashCode (즉, Pair )를 다시 정의하는 HashMap을 사용하는 것이 어떨까요? 이것은 병합 및지도 맵보다 훨씬 낫습니다. –

+0

연결이 잘못된 것 같습니다. 맞습니다. 그러나지도의지도에는 이점이있을 수 있습니다. 제가 말했듯이, 그는 두 번째 열에 많은 뚜렷한 문자열을 가지고 있지 않습니다. – Vlad

+0

네, 두 번째 열에는 단지 5 가지 가능성이 있습니다 – Andrew

1

10k는 나에게 커 보이지 않습니다. DB를 사용해 보셨습니까?

이와 같은 정보를 찾는 곳은 Semantic Web입니다. 많은 프로젝트가이 유형의 Triple Stores에서 작동합니다. Triple Store 페이지 하단에 구현 목록이 있습니다.

자바에 관한 한 귀하의 알고리즘은 언어 의존성이 거의 확실하며, C에서 구현 된 좋은 알고리즘을 발견하면 자바 포트도 빠를 것입니다.

또한 데이터 세트는 어떤 모양입니까? 주제와 동사가 종종 같은 2 개의 일치가 많이 있습니까? 얼마나 많은 성냥을 원하십니까? MapReduce는 10k에서 하나의 일치 항목을 찾기 위해 잘 작동하지만 쿼리를 쉽게 분할 할 수없는 10k의 8k를 반환하는 쿼리를 수행하지는 않습니다.

이 문제에 대해서만 작성된 검색어가 있습니다 : SPARQL. bigdata blog에는 좋은 통찰력이 있지만, 다시 말해서 10k는 그다지 크지 않습니다.

관련 문제