Odpowiedź na to pytanie jest skomplikowana, ponieważ programiści zauważyli, że terminy mają bardziej szczegółowe znaczenie w określonych językach lub systemach, których używali, ale pytanie wymaga porównania agnostycznego z językiem „teoretycznie”, co mam na myśli w terminologii obliczeniowej .
Wyjaśnienie terminologii
Słownik informatyki Oxford University wymienia:
słowniki dowolną strukturę danych reprezentującą zestaw elementów, które mogą obsługiwać wstawianie i usuwanie elementów, a także testować członkostwo
- Na przykład mamy zestaw elementów {A, B, C, D ...}, które udało nam się wstawić i możemy rozpocząć usuwanie, i możemy zapytać „czy C jest obecny?” .
Pojęcie mapy w dziedzinie informatyki opiera się na matematycznym mapowaniu terminów lingwistycznych , które Oxford Dictionary definiuje jako:
mapowanie Operacja, która wiąże każdy element danego zestawu (domeny) z jednym lub większą liczbą elementów drugiego zestawu (zakresu).
- Jako taka, struktura danych mapy zapewnia sposób przejścia od elementów danego zestawu - znane są „ klucze ” na mapie, do jednego lub większej liczby elementów w drugim zestawie - znanych jako powiązane „ wartości ”.
- W „... lub więcej elementów w drugim secie” aspekt może być obsługiwany za pomocą wdrożenia jest dwa odrębne sposób:
- Wiele implementacji map wymusza unikalność kluczy i zezwala na powiązanie każdego klucza z jedną wartością, ale ta wartość może być samą strukturą danych zawierającą wiele wartości prostszego typu danych, np. {{1, {"one" , „ichi”}, {2, {„two”, „ni”}}} ilustrują wartości składające się z par ciągów.
- Inne implementacje map pozwalają na duplikowanie kluczy przy każdym mapowaniu na te same lub różne wartości - co funkcjonalnie spełnia warunek „kojarzy… każdy element [klucz] ... z ... więcej [więcej niż jednym] elementem [wartość]”. Na przykład: {{1, „one”}, {1, „ichi”}, {2, „two”}, {2, „ni”}}.
Słownik i mapa skontrastowane
Tak więc, używając powyższej ścisłej terminologii Comp Sci, słownik jest mapą tylko wtedy, gdy interfejs obsługuje dodatkowe operacje, które nie są wymagane dla każdego słownika:
Trywialny zwrot akcji:
- interfejs mapy może nie obsługiwać bezpośrednio testu tego, czy para {klucz, wartość} znajduje się w kontenerze, co jest pedantycznie wymogiem słownika, w którym elementami są pary {klucz, wartość}; mapa może nawet nie mieć funkcji do testowania klucza, ale w najgorszym przypadku można sprawdzić, czy próba odzyskania wartości według klucza się powiedzie, czy nie, a jeśli to ważne, możesz sprawdzić, czy klucz odzyskał oczekiwaną wartość.
Komunikuj się jednoznacznie ze swoimi odbiorcami
⚠ Mimo wszystko powyższego, jeśli używasz słownika w ścisłym znaczeniu informatyki wyjaśnionym powyżej, nie spodziewaj się, że publiczność początkowo pójdzie za tobą lub nie zrobi na tobie wrażenia, gdy podzielisz się i bronisz terminologii. Inne odpowiedzi na to pytanie (i ich opinie) pokazują, jak prawdopodobne jest, że „słownik” będzie równoznaczny z „mapą” w odczuciu większości programistów. Spróbuj wybrać terminologię, która będzie szerzej i jednoznacznie zrozumiana: np
- kontener asocjacyjny : dowolny kontener przechowujący pary klucz / wartość z wyszukiwaniem wartości i usuwaniem według klucza
- mapa hash : implementacja tabeli hash powiązanego kontenera
- zestaw skrótów wymuszający unikalne klucze : implementacja tablicy hashowej przechowującej element / wartości słownika bez traktowania ich jako zawierających odrębne składniki klucza / wartości, w których nie można wstawić duplikatów elementów
- Bilansowa mapa drzewa binarnego obsługująca duplikat klucza : ...
Terminologia Crossreferencing Comp Sci z konkretnymi implementacjami
Biblioteka standardowa C ++
- mapy:
map
, multimap
, unordered_map
,unordered_multimap
- inne słowniki:
set
, multiset
, unordered_set
,unordered_multiset
- Uwaga: z iteratorów lub
std::find
można skasować element i wykonaj test dla członkostwa w array
, vector
, list
, deque
etc, ale interfejsy kontenerów nie bezpośrednio wspierać że ponieważ znalezienie element jest spektakularnie nieskuteczne w O (n), w niektórych przypadkach wkładka / skasowaniem jest nieefektywne, a wspieranie tych operacji podważa celowo ograniczony interfejs API, jaki sugeruje kontener - np. deque
s powinny obsługiwać tylko usuwanie / pop z przodu iz tyłu, a nie pod względem niektórych kluczy. Konieczność wykonania większej pracy w kodzie w celu uporządkowania wyszukiwania delikatnie zachęca programistę do przejścia do struktury danych kontenera z bardziej wydajnym wyszukiwaniem.
... może dodać inne języki później / możesz edytować w ...