HashMap<ArrayList<K>,V>
과 같은 것을 사용한다고 가정하면 다음과 같습니다. 작동 원리는 다음과 같습니다.
(키, 값) 쌍을 목록에 추가하면 키의 해시 코드가 계산됩니다. ArrayList
의 해시 코드는 목록의 모든 요소의 해시 코드를 확인하는 수식을 사용하여 계산됩니다. 따라서 요소가 동일한 두 개의 ArrayList
이있는 경우 (즉 요소의 equals()
메서드가 true를 반환하면 hashCode() 메서드가 동일한 값을 반환해야 함을 의미 함) ArrayList
은 hashCode
을 반환합니다. 이 해시 코드는 해시 배열의 인덱스로 변환되어 하나의 해시 버킷을 식별하고 키가 버킷의 키 목록에 추가됩니다. 일반적으로 해시 테이블은 키 길이가 1보다 길지 않도록 충분히 커야합니다.
키를 검색하면 HashMap
은 키의 해시 코드를 계산합니다. 위에서 언급했듯이 이것은 목록의 모든 요소를 조사하므로 O (N)입니다. 여기서 N은 목록의 길이입니다. 이것은 다시 하나의 해시 버킷을 식별하는 인덱스로 변환됩니다. 이 버킷에는 키 목록이 있습니다. 그런 다음 키는 equals()
을 사용하여 "버킷 목록"의 각 키와 비교됩니다 (더 나은 용어를 생각해 야합니다). equals()
은 두 키의 각 요소를 조사해야하며, 다른 O (N)입니다. 찾고있는 키를 찾으면 값을 검색 할 수 있습니다. 같지 않은 두 개의 목록이 동일한 해시 코드를 가질 수 있기 때문에 equals()
을 사용하는 키를 비교하지 않고서는 얻을 수 없습니다.
따라서 해시 검색은 키가 동일한지 확인하기 위해 ArrayList
의 모든 요소를 통과해야합니다. 실행중인 해시 코드를 유지하는 래퍼 클래스를 설정하여 해시 코드 계산을 상수로 만들 수도 있지만 일반적으로 모든 요소의 동등성을 검사하지 않는 것은 불가능합니다. 동일한 해시 코드가 같은 목록을 의미하도록 일대일 대응 인 해시 함수를 만들 수 있다면 해당 O (N)을 제거 할 수 있습니다.그러나 일반적으로 어떤 종류의 데이터가 목록에 포함될 것인가에 대한 심각한 제약이 없으면이 작업을 수행 할 수 없습니다. 이 경우 equals()
을 간단한 해시 코드 비교 방법으로 만들 수 있습니다. 그러나 그럴만 한 가치는 없을 것입니다. 목록이 짧으면 O (N)은 아무 것도 걱정할 필요가 없습니다. 길면 길 같은 기능을 생각해내는 것이 불가능해질 것입니다.
출처
2014-09-27 00:40:35
ajb
나는 이것이 옳다고 생각하지 않는다. 해시 배열에서 올바른 색인을 찾으려면 O (1) 시간이 걸릴 수 있습니다. 그러나 올바른 색인을 찾은 후에도 키를 비교할 필요가 있습니다. 색인만으로는 충분하지 않습니다. – ajb
각 목록에 자체 서명이 있다는 사실 때문에 동일한 요소가있는 다른 목록이 동일한 키로 작동하지 않습니까? – gravityplanx
@gravityplanx'HashMap'은'equals()'를 사용하여 키가 같은지 (올바른 버킷을 찾은 후) 결정하고, equals()는 두리스트의 모든 해당 요소가 동일하면'true'를 반환합니다. 이 답변이 "서명"으로 무엇을 의미하는지 모르겠습니다. – ajb