빈 / 널 값이있는 HashMap에 데이터를 키로 저장하는 것이 좋은 생각입니까?
나는 원래를 작성하고 그것에 ArrayList고유 한 값 (예 : 사용자 이름 Strings)을 저장했습니다. 나중에 ArrayList사용자가 있는지 검색 하기 위해를 사용해야 했습니다. 그것은 O(n)검색을위한 것입니다.
내 기술 책임자는 그것을 a로 변경 HashMap하고 사용자 이름을 배열의 키로 저장하고 값을 비어 있기를 원했습니다 Strings.
따라서 Java에서-
hashmap.put("johndoe","");
나중에 실행하여이 사용자가 존재하는지 확인할 수 있습니다.
hashmap.containsKey("johndoe");
이것이 O(1)맞습니까?
내 리드는 이것이 이것을 수행하는 더 효율적인 방법이라고 말했고 나에게 의미가 있었지만 해시 맵의 값으로 null / empty를 넣고 요소를 키로 저장하는 것이 약간 벗어 보였습니다.
제 질문은 이것이 좋은 접근 방식입니까? 효율성 ArrayList#contains은 일반적으로 어레이 검색 보다 우수 합니다. 효과가있다. 내 걱정은 다른 사람이 검색 후 이렇게하는 것을 본 적이 없다는 것입니다. 어딘가에서 분명한 문제가 누락되었을 수 있지만 볼 수 없습니다.
고유 한 값 세트 Set가 있으므로 a 가 적절한 데이터 구조입니다. 인터페이스 HashSet구현 인에 값을 넣을 수 있습니다 Set.
내 리드는 이것이 이것을 수행하는 더 효율적인 방법이라고 말했고 나에게 의미가 있었지만 해시 맵의 값으로 null / empty를 넣고 요소를 키로 저장하는 것이 약간 벗어 보였습니다.
리드의 조언에 결함이 있습니다. Map이것에 대한 올바른 추상화가 아닙니다 Set. A Map는 키-값 쌍에 적합합니다. 하지만 값이없고 키만 있습니다.
사용 예 :
Set<String> users = new HashSet<>(Arrays.asList("Alice", "Bob"));
System.out.println(users.contains("Alice"));
// -> prints true
System.out.println(users.contains("Jack"));
// -> prints false
Map값의 유형이 무엇이어야하므로 a를 사용하는 것은 어색 할 것입니다. 키-값 쌍이 아닌 키만 있으므로이 질문은 사용 사례에서 의미가 없습니다. 를 사용하면 Set물어볼 필요가 없습니다. 사용법은 완벽하게 자연 스럽습니다.
이것은 O (1) 맞습니까?
예, a HashMap또는 a 에서 검색 하는 HashSet것은 O (1) 상각 된 최악의 경우이고, List또는 a에서 검색 하는 것은 O (n) 최악의 경우입니다.
일부 의견은 a HashSet가 HashMap. 그 추상화 수준에서는 괜찮습니다 . 당면한 작업의 추상화 수준에서 --- 고유 한 사용자 이름 모음을 저장하려면 집합을 사용하는 것이 자연스러운 선택이며 맵보다 더 자연 스럽습니다.
이것은 기본적으로 HashSet구현되는 방법 이므로 좋은 접근 방식이라고 말할 수 있습니다. HashSet대신 HashMap빈 값으로 사용할 수도 있습니다 .
예 :
HashSet의 구현 add은
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
여기서 map배면 인 HashMap및 PRESENT더미 값이다.
내 걱정은 다른 사람이 검색 후 이렇게하는 것을 본 적이 없다는 것입니다. 어딘가에서 분명한 문제가 누락되었을 수 있지만 볼 수 없습니다.
앞서 언급했듯이 JDK 개발자는 이와 동일한 접근 방식을 사용하고 있습니다.
'Nice programing' 카테고리의 다른 글
| 해시는 파이썬에서 무엇을합니까? (0) | 2020.11.23 |
|---|---|
| 텍스트 필드 iOS 8에 입력보기를 추가 할 때 오류 발생 (0) | 2020.11.23 |
| 파일 변경시 Firefox 자동 새로 고침을하려면 어떻게해야합니까? (0) | 2020.11.23 |
| C ++ : 임시 인수의 수명? (0) | 2020.11.23 |
| jQuery : 속성이 값보다 큰 모든 요소 선택 (0) | 2020.11.23 |