지도와 사전의 차이점은 무엇입니까?


197

지도가 키를 값에 매핑하는 데이터 구조라는 것을 알고 있습니다. 사전이 같지 않습니까? 지도와 사전 1 의 차이점은 무엇입니까 ?


1. 나는 언어 X 또는 Y로 정의되는 방법을 묻지 않고 (일반적으로 사람들이 일반적으로 여기에서 요구하는 것처럼 보입니다), 이론상 차이점이 무엇인지 알고 싶습니다.


좋은 질문입니다!
NONAME

답변:


259

같은 것을위한 두 가지 용어 :

  • "Map" 은 Java, C ++에서 사용됩니다.
  • "사전" 은 .Net, Python에서 사용됩니다.
  • "연관 배열" 은 PHP에서 사용됩니다

"Map" 은 올바른 수학적 용어이지만 기능 프로그래밍 에서 별도의 의미를 갖기 때문에 피 합니다 .

일부 언어는 여전히 다른 용어 (Javascript에서 "Object", Ruby에서 "Hash", Lua에서 "Table") 를 사용하지만, 프로그래밍에서도 별도의 의미를 가지므로 피할 수 있습니다.

자세한 내용은 여기 를 참조 하십시오 .


7
JAVA에 맵과 사전이 모두 없습니까? 차이점은 무엇입니까?
vivek_jonam

35
@vivek_jonam : DictionaryJava에서 더 이상 사용되지 않습니다. Map인터페이스가 생성 되기 전에 사용되는 추상 클래스 입니다.
BlueRaja-Danny Pflughoeft

7
나는 질문이 언어에 구애받지 않는다는 것을 알고 있기 때문에 이것이 정답이다. 그러나 나는 자바가 둘 다 가진 이유를 찾기 위해 여기에서 끝났 으므로이 의견은 정말로 나에게 완벽한 것이었다.
GrandOpener

1
루아에는 "테이블"이 사용됩니다.
중복 제거기

1
JSON에서 다소 혼란스럽게도 "Object" 라고 불립니다 (JavaScript와 관련된 역사적인 이유로)
Aprillion

20

하나는 다른 하나의 오래된 용어입니다. 일반적으로 "사전"이라는 용어는 수학 용어 "지도"가 사용되기 전에 사용되었습니다. 또한 사전에는 키 유형의 문자열이있는 경향이 있지만 모든 곳에서 100 % 사실은 아닙니다.


9

내 2 센트

Dictionary는 Java의 추상 클래스 인 반면 Map은 인터페이스입니다. Java는 다중 상속을 지원하지 않기 때문에 클래스가 Dictionary를 확장하면 다른 클래스를 확장 할 수 없습니다.

따라서 맵 인터페이스가 도입되었습니다.

사전 클래스는 더 이상 사용되지 않으며 맵을 사용하는 것이 좋습니다.


9

프로그래머가 복잡하다이 질문에 대답하는 것은 그들이 사용했던 특정 언어 나 시스템의보다 구체적인 의미를 주어진 조건을 볼 수 있지만, 문제는 내 말을 데려 갈거야 "이론"언어 무신론자 비교를 요구 한 컴퓨팅 과학의 관점에서 .

용어 설명

컴퓨터 과학 의 옥스포드 대학 사전 목록 :

요소의 삽입 및 삭제를 지원하고 멤버쉽을 테스트 할 수있는 요소 세트를 나타내는 모든 데이터 구조 사전

  • 예를 들어 삽입 할 수 있고 삭제를 시작할 수있는 {A, B, C, D ...} 요소 세트가 있으며 "C가 있습니까?" 를 쿼리 할 수 ​​있습니다. .

의 컴퓨팅 과학 개념은 옥스포드 사전이 다음과 같이 정의 하는 수학 언어 용어 매핑을 기반으로합니다 .

맵핑 주어진 세트 (도메인)의 각 요소를 두 번째 세트 (범위)의 하나 이상의 요소와 연관시키는 조작.

  • 이와 같이, 데이터 구조는 에서 " "로 알려진 주어진 세트의 요소에서 관련 " 값 (들) "으로 알려진 두 번째 세트에서 하나 이상의 요소 로 이동하는 방법을 제공합니다 .
  • "제 세트 ... 이상의 요소가" 형태는 구현에 의해 지원 될 수있는 것은 두 가지 방법이다 :
    • 많은 맵 구현은 키의 고유성을 강화하고 각 키를 하나의 값과 연관시킬 수 있지만이 값은 더 간단한 데이터 유형의 많은 값을 포함하는 데이터 구조 자체 일 수 있습니다 (예 : {{1, { "one" , "ichi"}, {2, { "two", "ni"}}}은 문자열 쌍으로 구성된 값을 보여줍니다.
    • 다른 맵 구현에서는 각 키가 동일하거나 다른 값으로 매핑되는 중복 키를 허용합니다. 이는 기능적으로 "associates ... each [key] 요소 ... with ... more [하나 이상의] [value] 요소"의 경우를 만족시킵니다. 예를 들어 {{1, "one"}, {1, "ichi"}, {2, "two"}, {2, "ni"}}입니다.

사전과지도 대조

따라서 위의 엄격한 Comp Sci 용어를 사용하여 인터페이스가 모든 사전에 필요하지 않은 추가 작업을 지원하는 경우 사전은 맵일뿐입니다 .

  • 고유 한 구성 요소로 요소를 저장하는 기능

  • 키만 주어진 값 을 검색 하는 기능

사소한 비틀기 :

  • 맵 인터페이스는 {key, value} 쌍이 컨테이너에 있는지 여부에 대한 테스트를 직접 지원하지 않을 수 있으며, 이는 요소가 {key, value} 쌍인 ​​사전의 요구 사항입니다. 맵에는 키를 테스트하는 기능이 없을 수도 있지만 최악의 경우 키별로 값 검색 시도가 성공 또는 실패했는지 확인할 수 있으며 관심이있는 경우 키가 예상 값을 검색했는지 확인할 수 있습니다.

청중에게 분명하게 의사 소통

⚠ 위의 모든 내용에도 불구하고 위에서 설명한 엄격한 컴퓨팅 과학의 의미로 사전 을 사용하는 경우 잠재 고객이 처음에 나를 따르거나 용어를 공유하고 방어 할 때 감동을받지 않을 것으로 기대하십시오. 이 질문에 대한 다른 답변 (및 그들의 투표)은 "사전"이 대부분의 프로그래머의 경험에서 "지도"와 동의어가 될 가능성을 보여줍니다 . 보다 광범위하고 명확하게 이해 될 수있는 용어를 선택하십시오. 예 :

  • 연관 컨테이너 : 키로 값을 검색하고 지우는 키 / 값 쌍을 저장하는 컨테이너
  • 해시 맵 : 연관 컨테이너의 해시 테이블 구현
  • 고유 키를 적용하는 해시 세트 : 요소 / 값을 별개의 키 / 값 구성 요소를 포함하는 것으로 취급하지 않고 요소 / 값을 저장하는 사전의 해시 테이블 구현. 요소의 복제본을 삽입 할 수 없음
  • 중복 키를 지원하는 균형 이진 트리 맵 : ...

특정 구현과의 상호 참조 Comp Sci 용어

C ++ 표준 라이브러리

  • 지도 : map, multimap, unordered_map,unordered_multimap
  • 다른 사전 : set, multiset, unordered_set,unordered_multiset
  • 참고 : 반복자를 사용하거나 std::find요소를 지우고 멤버 자격을 테스트 할 수 있습니다array , vector, list, deque요소를 찾는 것은 O (N)에서 화려 비효율적이기 때문에 등,하지만 컨테이너 인터페이스는 직접 어떤 경우에는 삽입 / 삭제에서입니다, 그것을 지원하지 않습니다 비효율적이며 이러한 작업을 지원하는 것은 컨테이너가 암시하는 의도적으로 제한된 API를 약화시킵니다. 예를 들어 deques는 일부 키의 관점이 아니라 앞 / 뒤의 지우기 / 팝만 지원해야합니다. 검색을 조정하기 위해 코드에서 더 많은 작업을 수행해야하므로 프로그래머는보다 효율적인 검색을 통해 컨테이너 데이터 구조로 전환 할 수 있습니다.

... 나중에 다른 언어를 추가하거나 편집 할 수 있습니다 ...


3

일반적으로 맵은 해시 테이블에 의해 지원된다고 가정합니다. 순서가없는 상점을 의미합니다. 사전은 주문 된 상점을 의미합니다.

Trie 라는 트리 기반 사전이 있습니다 있습니다.

Lisp에서 다음과 같이 보일 수 있습니다.

(a (n (d t)) n d )

다음 단어를 캡슐화합니다.

  • 개미
  • 기원 후

상단에서 잎까지 순회하면 단어가 나타납니다.


4
Dictionary.Net에서는 순서가 없습니다.
BlueRaja-대니 Pflughoeft

2
코코아 사전도 순서가 없습니다.
Ken

C ++는 std::map그것의 구현은이 표준에 지정되지 않은 주문한 std::unordered_map가 해시를 통해 구현되고, C ++ (11)에 도입 된
헤럴드 Scheirich을

3
@HaraldScheirich-C ++ 표준에서는 "적색 트리를 std::map사용하여 구현해야합니다"라고 명시되어 있지 않지만 다른 것을 사용해보십시오. AVL 트리가 작동하지 않습니다. 삽입 비용이 표준을 충족하지 않습니다. 해시는 작동하지 않습니다. 해시는 순서가 없으므로 표준을 충족하지 않습니다. 이 표준은 "빨간색 나무를 사용하여 std::map명시 적으로 말하지 않고 구현해야합니다 "라고 말합니다.
David Hammen

+1. 많은 플랫폼에서 사전이 정렬되지 않았지만 단어는 순서를 의미합니다. 나는 용어라는 용어를 더 좋아한다.
nawfal

2

실제로 같은 것은 아닙니다. 지도는 사전의 하위 집합입니다. 여기서 사전은 삽입, 삭제 및 찾기 기능을 갖는 것으로 정의 됩니다 . 자바에 의해 사용 (에 따라지도 )은 값에 대한 키 맵핑이 일대일 함수로 엄격하게 맵핑되어야하는 사전입니다. 사전은 트위터 해시 태그 검색과 같이 하나 이상의 키맵을 하나 이상의 값으로, 또는 하나의 키맵을 여러 값으로 묶을 수 있습니다 (서열 테이블의 연쇄 등).

좀 더 "실제"예를 들어, 사전에서 단어를 검색하면 동일한 단어에 대해 여러 가지 정의를 제공 할 수 있으며, 다른 항목 (다른 단어 참조)을 가리키는 항목을 찾은 경우 여러 단어 동일한 정의 목록에 대해 실제로는지도가 훨씬 넓어서 좌표의 이름이나 이름의 위치를 ​​가질 수 있지만 가장 가까운 이웃이나 다른 속성 (인구 등)을 찾을 수 있으므로 IMHO의 확장이 더 큰 논거가 될 수 있습니다 지도 유형은 그래프 기반 구현을 가질 수 있지만 항상 키-값 쌍만 가정하는 것이 가장 좋습니다. 특히 가장 가까운 이웃 및 값에 대한 다른 속성은 모두 값의 데이터 멤버 일 수 있기 때문입니다.

Java 맵은 일대일 요구 사항에도 불구하고 값이 컬렉션 자체로 일반화되거나 값이 다른 곳에 저장된 컬렉션에 대한 참조 인 경우 일반 사전과 같은 것을 구현할 수 있습니다.

Java 관리자는 ADT 정의의 관리자가 아니며 Java 결정은 특히 Java를위한 것임을 기억하십시오.


1

이 개념에 대한 다른 용어는 일반적으로 연관 배열 및 해시입니다.


1
해시는 이것과 관련이 없습니다. 객체가 다른지 여부를 빠르게 감지하는 방법입니다. 해시를 사용하여 맵 / 사전 작업을 수행하는 해시 맵을 생각하고 있습니다.
DJClayworth

5
@DJClayworth 아니요, 많은 프로그래밍 언어가 실제로 이러한 것들을 해시라고 부릅니다. Ruby를 참조하십시오 . 나는 그것을 디자인하지 않았고 그것을 부르지 않을 것이지만 메신저를 쏘지 마십시오.
행크 게이

1

예, 동일합니다. "Associative Array"를 믹스에 추가 할 수 있습니다.

사용 Hashtable 또는 Hashofter는 구현을 나타냅니다.


1

순전히 이론적 인 수준에서.

사전은 연결된 값을 찾는 데 사용할 수있는 값입니다. 맵은 다른 값을 찾는 방법에 대한 지침을 제공하는 값입니다

단순한 배열조차도 올바른 값으로 매핑되는 인덱스가 있기 때문에 비선형 액세스를 허용하는 모든 컬렉션 (즉, 첫 번째 만 가져 오기 또는 마지막으로 가져 오기)은 맵입니다. 따라서 사전은지도 유형이지만,지도는 훨씬 광범위한 기능을 수행 할 수 있습니다.

실제로는 일반적으로 이름을 정의하는 매핑 함수이므로 HashMap은 해싱 알고리즘을 사용하여 키를 값에 연결하는 매핑 된 데이터 구조입니다. 여기서 사전은 키가 값에 연결되는 방법을 지정하지 않습니다. 연결된 목록, 트리 또는 다른 알고리즘을 통해 저장할 수 있습니다. 사용법 끝에서 일반적으로 알고리즘이 작동하는 것만 신경 쓰지 않으므로 일반 사전을 사용하고 알고리즘 유형을 enfore해야 할 때만 다른 구조 중 하나로 만 전환하십시오.


-2

이들은 동일한 개념에 대한 두 가지 다른 용어입니다.
HashtableHashMap같은 개념을 참조하십시오.


3
실제로 Hashtable / Hashmap은 이름의 특정 구현을 의미합니다 (예 : C ++ std :: map에서 사용되는 균형 트리).
Joe

일반적으로 구현에 신경 쓰지 않아야합니다. (성능상의 이유를 제외하고) 또한 항상 그런 것은 아닙니다. 예를 들어 .Net을보십시오.
SLaks

-2

가장 큰 차이점은이다 지도 은 모든 항목 (값 및 키 쌍)에 고유 키가 있어야한다는 것입니다. 충돌이 발생하는 경우, 즉 새 항목에 이미 컬렉션에있는 항목과 동일한 키가있는 경우 충돌 처리가 필요합니다.

일반적으로 우리는 분리 체인을 사용하여 충돌을 처리 합니다. 또는 선형 프로빙 .

사전 에 여러 항목이 동일한 키에 링크 할 수 있습니다.

지도가 별도의 체인을 구현 한 경우 사전과 유사한 경향이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.