2014-03-04 2 views
-1

Java에서 Set 또는 Map과 같은 범용 데이터 구조를 사용하고자 할 때마다 HashSet 및 HashMap이 제공되었습니다. 이것들에 대해 더 자세히 살펴보면, 해시 테이블에 대한 정보를 읽었습니다. 그래서 키를 해당 값으로 매핑하기 위해 해시 함수를 사용한다는 것을 알았습니다.
내 질문은 : 단순한 인덱스 별 서신을 사용하지 않는 이유는 무엇입니까?
은 나 자신에 대답하려고 노력하지만 장점의 정확성의 확실하지 않다 : 어떤 계산이
+ 충돌이없는
별 해시
+ 메모리 포함되지 거기에 있기 때문에,
에 의해 인덱스
+ 빠른 왜냐하면 세 번째 배열은 키와 값을 상호 연관시켜야하기 때문이다.HashMap의 키 - 값 매핑

그러나 나는 항상 몇 개의 퍼가 몇 바이트보다 더 소중하다고 생각했다. 어쨌든, 나는 단순한 IndexMap처럼 Java DS에 그런 DS가 있다고 생각하지 않습니까? 내가 여기서 무엇을 놓치고 있니?

EDIT : I 의미로 인덱스바이
이 : 배열이 정렬 된 구조가이 인덱스를 갖는 구조로이고; 말하자면, keys []와 values ​​[]를 연관 짓는 2 개의 배열을 가지는 것은 keys [i]가 values ​​[i]에 해당 함을 의미합니다. 따라서 관계 함수가 필요하지 않습니다. 나는 분명히 여기에 뭔가 빠졌고 무엇을보고 싶습니다.

+2

"ThisIsMyKey"키의 인덱스는 무엇입니까? 또한 여기에는 부동 소수점이 없으므로 "플립"이 포함되지 않습니다. 당신은 _ 기본적인 데이터 구조를 재검토 할 필요가 있습니다. 귀하의 질문은 귀하가 몇 가지 기본 개념을 놓치고 있음을 나타냅니다. –

+0

"by-index"란 무엇을 의미합니까? 리스트에 대해 말하는거야? – 2rs2ts

+0

아마 당신이 말하는 것에 대한 어떤 링크. 아마도 해시 테이블을 트리 구조와 비교하는 것일까? –

답변

0

왜 간단한 인덱스 별 통신을 사용하지 않습니까?

이렇게하면 특정 구현에 대한 Set 계약이 깨질 수 있습니다. Set에서 모든 값은 정의 된 기준에 따라 고유해야합니다. HashSet에서 이것은 객체의 동일성 (.equals()/.hashCode())입니다.

또한 Set에는 계약에 의한 반복 보증이 없습니다. 따라서 을 알고 있더라도 Set에있는 항목을 찾으려면 색인을 사용할 수 없습니다. 원하는대로 보이는 List과 달리 Set에는 .get() 메서드가 없음을 알 수 있습니다.

Map의 키는 Set입니다. Map의 키는 고유합니다.

해시 테이블을 사용하는 또 다른 이점은 검색 작업 속도입니다 (.contains()에서와 같이).

+0

OP는 "by-index correspondence"가 의미하는 바를 설명하지 못했습니다 ... –

+0

OP가 묻는 것에서의 추측은 왜 모든지도가 'EnumMap'과 같지 않습니다. enums. –

+0

글쎄요,'IdentityHash {Set, Map} '가 있습니다 만 그 용도는 독특합니다 – fge

2

HashMap은 인덱스가 임의의 개체 (키) 일 수 있고 다른 개체 (값)에 매핑되는 인덱스 맵이라고 생각할 수 있습니다. 당신의 의미에서 IndexMap은 List 일 뿐이며, List는 int 인덱스를 Object에 매핑합니다. 그러나 목록의 색인은 객체가 될 수 없습니다.

+3

이것은 대답이 아닌 주석이어야합니다. –

+0

왜 그런가요? 나 한테 대답하는 것 같아. –

+0

나는 더 나은 대답을 내놓으려고 애썼지 만,이 설명이 머리에 못을 박는다고 생각합니다. – Tyler

0

나는 당신이 묻고 자하는 것에 찌르기를 갈 것입니다. Java HashMap이 EnumMap 또는 해시가 필요하지 않은 다른 특수 해시 테이블 콜렉션 (해시가 사전 계산되어 있기 때문에)과 다른 이유는 무엇입니까?

왜냐하면 HashMap은 모든 개체를 저장할 수있는 일반 컬렉션이기 때문입니다. 더 빠른 HashMap (즉, 빠른 해시)을 원할 경우 맵에 저장하는 데이터에 대해 특정 가정 (예 : EnumMap)을 작성해야합니다.

+0

나는 왜 그 열쇠가 pre-the-fly에서 첫 번째 장소에서 해쉬 되어야만하는지 감탄 했습니까?이것이 전체 요점입니다. 나는 2 개의 배열을 취하고 요소를 인덱스와 상관시키는 일종의 Map을 기대했습니다. 어떤 유형의 키 []의 임의의 객체와 다른 유형의 임의의 객체 [] – mireazma

0

나는 올바른 방향을 취하고 있지만 데이터 구조에서 수행 할 수있는 몇 가지 조치를 더 고려해야합니다.

해시 기반 데이터 구조와 동일한 o (1)에 액세스하지만 해시 기반 구조에서 여전히 동일한 o (1) 인 배열에서 검색은 매우 비용이 많이 드는 o (n) 일 수 있습니다.

응용 프로그램에 적합한 데이터 구조를 결정할 때 해당 데이터 구조에서 수행 할 작업에 따라 달라집니다.

http://simplenotions.wordpress.com/2009/05/13/java-standard-data-structures-big-o-notation/

는 희망이 도움이 : 더 참고로 다른 데이터 구조에 다른 작업의 요약이 포함이 페이지를 확인하십시오.

+0

링크를 제공해 주셔서 감사합니다. 내가 이해한다면, contains()와 같은 검색은 배열 O (n)의 해시 콜렉션 O (1)보다 비용이 많이들 것입니까? 이게 옳은 거니? – mireazma

+0

예, 당신은 절대적으로 맞습니다 :) – Mak