지도가 키를 값에 매핑하는 데이터 구조라는 것을 알고 있습니다. 사전이 같지 않습니까? 지도와 사전 1 의 차이점은 무엇입니까 ?
1. 나는 언어 X 또는 Y로 정의되는 방법을 묻지 않고 (일반적으로 사람들이 일반적으로 여기에서 요구하는 것처럼 보입니다), 이론상 차이점이 무엇인지 알고 싶습니다.
지도가 키를 값에 매핑하는 데이터 구조라는 것을 알고 있습니다. 사전이 같지 않습니까? 지도와 사전 1 의 차이점은 무엇입니까 ?
1. 나는 언어 X 또는 Y로 정의되는 방법을 묻지 않고 (일반적으로 사람들이 일반적으로 여기에서 요구하는 것처럼 보입니다), 이론상 차이점이 무엇인지 알고 싶습니다.
답변:
같은 것을위한 두 가지 용어 :
"Map" 은 올바른 수학적 용어이지만 기능 프로그래밍 에서 별도의 의미를 갖기 때문에 피 합니다 .
일부 언어는 여전히 다른 용어 (Javascript에서 "Object", Ruby에서 "Hash", Lua에서 "Table") 를 사용하지만, 프로그래밍에서도 별도의 의미를 가지므로 피할 수 있습니다.
Dictionary
Java에서 더 이상 사용되지 않습니다. Map
인터페이스가 생성 되기 전에 사용되는 추상 클래스 입니다.
프로그래머가 복잡하다이 질문에 대답하는 것은 그들이 사용했던 특정 언어 나 시스템의보다 구체적인 의미를 주어진 조건을 볼 수 있지만, 문제는 내 말을 데려 갈거야 "이론"언어 무신론자 비교를 요구 한 컴퓨팅 과학의 관점에서 .
컴퓨터 과학 의 옥스포드 대학 사전 목록 :
요소의 삽입 및 삭제를 지원하고 멤버쉽을 테스트 할 수있는 요소 세트를 나타내는 모든 데이터 구조 사전
맵 의 컴퓨팅 과학 개념은 옥스포드 사전이 다음과 같이 정의 하는 수학 언어 용어 매핑을 기반으로합니다 .
맵핑 주어진 세트 (도메인)의 각 요소를 두 번째 세트 (범위)의 하나 이상의 요소와 연관시키는 조작.
따라서 위의 엄격한 Comp Sci 용어를 사용하여 인터페이스가 모든 사전에 필요하지 않은 추가 작업을 지원하는 경우 사전은 맵일뿐입니다 .
고유 한 키 및 값 구성 요소로 요소를 저장하는 기능
키만 주어진 값 을 검색 하는 기능
사소한 비틀기 :
⚠ 위의 모든 내용에도 불구하고 위에서 설명한 엄격한 컴퓨팅 과학의 의미로 사전 을 사용하는 경우 잠재 고객이 처음에 나를 따르거나 용어를 공유하고 방어 할 때 감동을받지 않을 것으로 기대하십시오. 이 질문에 대한 다른 답변 (및 그들의 투표)은 "사전"이 대부분의 프로그래머의 경험에서 "지도"와 동의어가 될 가능성을 보여줍니다 . 보다 광범위하고 명확하게 이해 될 수있는 용어를 선택하십시오. 예 :
map
, multimap
, unordered_map
,unordered_multimap
set
, multiset
, unordered_set
,unordered_multiset
std::find
요소를 지우고 멤버 자격을 테스트 할 수 있습니다array
, vector
, list
, deque
요소를 찾는 것은 O (N)에서 화려 비효율적이기 때문에 등,하지만 컨테이너 인터페이스는 직접 어떤 경우에는 삽입 / 삭제에서입니다, 그것을 지원하지 않습니다 비효율적이며 이러한 작업을 지원하는 것은 컨테이너가 암시하는 의도적으로 제한된 API를 약화시킵니다. 예를 들어 deque
s는 일부 키의 관점이 아니라 앞 / 뒤의 지우기 / 팝만 지원해야합니다. 검색을 조정하기 위해 코드에서 더 많은 작업을 수행해야하므로 프로그래머는보다 효율적인 검색을 통해 컨테이너 데이터 구조로 전환 할 수 있습니다.... 나중에 다른 언어를 추가하거나 편집 할 수 있습니다 ...
일반적으로 맵은 해시 테이블에 의해 지원된다고 가정합니다. 순서가없는 상점을 의미합니다. 사전은 주문 된 상점을 의미합니다.
Trie 라는 트리 기반 사전이 있습니다 있습니다.
Lisp에서 다음과 같이 보일 수 있습니다.
(a (n (d t)) n d )
다음 단어를 캡슐화합니다.
상단에서 잎까지 순회하면 단어가 나타납니다.
Dictionary
.Net에서는 순서가 없습니다.
std::map
그것의 구현은이 표준에 지정되지 않은 주문한 std::unordered_map
가 해시를 통해 구현되고, C ++ (11)에 도입 된
std::map
사용하여 구현해야합니다"라고 명시되어 있지 않지만 다른 것을 사용해보십시오. AVL 트리가 작동하지 않습니다. 삽입 비용이 표준을 충족하지 않습니다. 해시는 작동하지 않습니다. 해시는 순서가 없으므로 표준을 충족하지 않습니다. 이 표준은 "빨간색 나무를 사용하여 std::map
명시 적으로 말하지 않고 구현해야합니다 "라고 말합니다.
실제로 같은 것은 아닙니다. 지도는 사전의 하위 집합입니다. 여기서 사전은 삽입, 삭제 및 찾기 기능을 갖는 것으로 정의 됩니다 . 자바에 의해 사용 (에 따라지도 이 )은 값에 대한 키 맵핑이 일대일 함수로 엄격하게 맵핑되어야하는 사전입니다. 사전은 트위터 해시 태그 검색과 같이 하나 이상의 키맵을 하나 이상의 값으로, 또는 하나의 키맵을 여러 값으로 묶을 수 있습니다 (서열 테이블의 연쇄 등).
좀 더 "실제"예를 들어, 사전에서 단어를 검색하면 동일한 단어에 대해 여러 가지 정의를 제공 할 수 있으며, 다른 항목 (다른 단어 참조)을 가리키는 항목을 찾은 경우 여러 단어 동일한 정의 목록에 대해 실제로는지도가 훨씬 넓어서 좌표의 이름이나 이름의 위치를 가질 수 있지만 가장 가까운 이웃이나 다른 속성 (인구 등)을 찾을 수 있으므로 IMHO의 확장이 더 큰 논거가 될 수 있습니다 지도 유형은 그래프 기반 구현을 가질 수 있지만 항상 키-값 쌍만 가정하는 것이 가장 좋습니다. 특히 가장 가까운 이웃 및 값에 대한 다른 속성은 모두 값의 데이터 멤버 일 수 있기 때문입니다.
Java 맵은 일대일 요구 사항에도 불구하고 값이 컬렉션 자체로 일반화되거나 값이 다른 곳에 저장된 컬렉션에 대한 참조 인 경우 일반 사전과 같은 것을 구현할 수 있습니다.
Java 관리자는 ADT 정의의 관리자가 아니며 Java 결정은 특히 Java를위한 것임을 기억하십시오.
이 개념에 대한 다른 용어는 일반적으로 연관 배열 및 해시입니다.
순전히 이론적 인 수준에서.
사전은 연결된 값을 찾는 데 사용할 수있는 값입니다. 맵은 다른 값을 찾는 방법에 대한 지침을 제공하는 값입니다
단순한 배열조차도 올바른 값으로 매핑되는 인덱스가 있기 때문에 비선형 액세스를 허용하는 모든 컬렉션 (즉, 첫 번째 만 가져 오기 또는 마지막으로 가져 오기)은 맵입니다. 따라서 사전은지도 유형이지만,지도는 훨씬 광범위한 기능을 수행 할 수 있습니다.
실제로는 일반적으로 이름을 정의하는 매핑 함수이므로 HashMap은 해싱 알고리즘을 사용하여 키를 값에 연결하는 매핑 된 데이터 구조입니다. 여기서 사전은 키가 값에 연결되는 방법을 지정하지 않습니다. 연결된 목록, 트리 또는 다른 알고리즘을 통해 저장할 수 있습니다. 사용법 끝에서 일반적으로 알고리즘이 작동하는 것만 신경 쓰지 않으므로 일반 사전을 사용하고 알고리즘 유형을 enfore해야 할 때만 다른 구조 중 하나로 만 전환하십시오.