Bir harita ve sözlük arasındaki fark nedir?


199

Bir haritanın anahtarları değerlerle eşleştiren bir veri yapısı olduğunu biliyorum. Sözlük aynı değil mi? Bir harita ile sözlük 1 arasındaki fark nedir ?


1. X veya Y dillerinde nasıl tanımlandıklarını sormuyorum (ki bu genellikle insanların burada SO'ya sorduğu gibi görünüyor), teoride farklılıklarının ne olduğunu bilmek istiyorum.


Harika bir soru!
NoName

Yanıtlar:


262

Aynı şey için iki terim:

  • "Harita" Java, C ++ tarafından kullanılır
  • "Sözlük" .Net, Python tarafından kullanılır
  • "İlişkilendirilebilir dizi" PHP tarafından kullanılır

"Harita" doğru matematiksel terimdir, ancak işlevsel programlamada ayrı bir anlamı olduğu için önlenir .

Bazı diller hala başka terimler kullanır (Javascript'te "Nesne", Ruby'de "Hash", Lua'da "Table") , ancak bunların hepsinin programlamada da ayrı anlamları vardır, bu yüzden onlardan kaçınırım.

Daha fazla bilgi için buraya bakın .


7
JAVA'da hem Harita hem de Sözlük yok mu? Oradaki farklar neler?
vivek_jonam

36
@vivek_jonam: DictionaryJava'da kullanılmıyor. MapArayüz oluşturulmadan önce kullanılan soyut bir sınıftır .
BlueRaja - Danny Pflughoeft

7
Sorunun dil agnostik olduğunu biliyorum, bu yüzden bu doğru cevap, ama burada Java'nın her ikisine de sahip olmasının nedenini aradım, bu yüzden bu yorum benim için gerçekten mükemmel bir şeydi.
GrandOpener

1
lua'da "table" kullanılır.
Tekilleştirici

1
ayrıca
JSON'da

20

Biri diğeri için daha eski bir terimdir. Tipik olarak "sözlük" terimi, "harita" matematiksel terimi kullanılmadan önce kullanılmıştır. Ayrıca, sözlükler önemli bir dize türüne sahip olma eğilimindedir, ancak bu her yerde% 100 doğru değildir.


10

Benim 2 sentim.

Sözlük Java'da soyut bir sınıf iken Harita bir arayüzdür. Java, birden fazla devralmayı desteklemediğinden, bir sınıf Sözlük'ü genişletirse, başka bir sınıfı genişletemez.

Bu nedenle, Harita arayüzü tanıtıldı.

Sözlük sınıfı kullanılmıyor ve Harita kullanımı tercih ediliyor.


9

Bu soruyu cevaplamak, programcıların kullandıkları belirli dillerde veya sistemlerde daha belirgin anlamlar verildiğini gören karmaşıktır, ancak soru , Bilişim Bilimi terimlerinde ifade ettiğim "teoride" bir dil agnostik karşılaştırması ister. .

Açıklanan terminoloji

Oxford Üniversitesi Bilgisayar Bilimi Sözlüğü şunları listeler:

öğelerin eklenmesini ve silinmesini destekleyebilecek bir dizi öğeyi temsil eden herhangi bir veri yapısını sözlüklendirebilir ve üyelik testi yapabilir

  • Örneğin, ekleyebildiğimiz ve silmeye başlayabildiğimiz bir dizi {A, B, C, D ...} öğemiz var ve "C var mı?" .

Bilişim Bilimleri kavramı haritası olsa matematiksel dilsel terim dayanmaktadır haritalama , Oxford Sözlüğü tanımlar gibidir:

eşleme Belirli bir kümenin (etki alanı) her öğesini ikinci bir kümenin (aralık) bir veya daha fazla öğesiyle ilişkilendiren işlem.

  • Bu haliyle, bir harita veri yapısı, haritadaki " anahtarlar " olarak bilinen belirli bir kümenin öğelerinden, ilişkili olan " değerler " olarak bilinen ikinci kümedeki bir veya daha fazla öğeye gitmenin bir yolunu sağlar .
  • "İkinci sette ... veya daha fazla öğe" yönü bir uygulama tarafından desteklenen iki ayrı yoludur:
    • Birçok harita uygulaması, anahtarların benzersizliğini zorunlu kılar ve her anahtarın yalnızca bir değerle ilişkilendirilmesine izin verir, ancak bu değer, daha basit bir veri türünün birçok değerini içeren bir veri yapısı olabilir, örneğin, {{1, {"one" , "ichi"}, {2, {"iki", "ni"}}}, dize çiftlerinden oluşan değerleri gösterir.
    • Diğer harita uygulamaları, her eşlemenin aynı veya farklı değerlere yinelenen tuşlara izin verir - bu da işlevsel olarak "her bir [anahtar] öğeyi ... ... birden fazla [[]] öğeyle" ilişkilendirir. Örneğin, {{1, "bir"}, {1, "ichi"}, {2, "iki"}, {2, "ni"}}.

Sözlük ve harita kontrastlı

Bu nedenle, yukarıdaki sıkı Comp Sci terminolojisini kullanarak sözlük, yalnızca arayüz her sözlük için gerekli olmayan ek işlemleri destekliyorsa bir haritadır :

  • farklı anahtar ve değer bileşenlerine sahip öğeleri saklama yeteneği

  • yeteneği almak değer (ler) sadece anahtarı verildi

Önemsiz bir bükülme:

  • bir harita arayüzü, bir {key, value} çiftinin kap içinde olup olmadığını test etmeyi doğrudan desteklemeyebilir; bir haritanın bir anahtarı test etme işlevi bile olmayabilir, ancak en kötüsü, anahtar ile değer geri alma girişiminin başarılı olup olmadığını veya başarısız olup olmadığını görebilirsiniz, o zaman umursanız anahtarın beklenen bir değeri alıp almadığını kontrol edebilirsiniz.

Kitlenizle net bir şekilde iletişim kurun

All Yukarıdakilerin hepsine rağmen, yukarıda açıklanan katı Bilgi İşlem Bilimi anlamında sözlük kullanıyorsanız , kitlenizin sizi ilk başta takip etmesini beklemeyin veya terminolojiyi paylaştığınızda ve savunduğunuzda etkilenmeyin. Bu sorunun diğer cevapları (ve onların oyları) , çoğu programcının deneyiminde "sözlük" ün "harita" ile eşanlamlı olma olasılığını gösterir . Daha geniş ve açık bir şekilde anlaşılacak olan terminolojiyi seçmeye çalışın: ör.

  • çağrışımsal kapsayıcı : anahtar / değer çiftlerini değer alma ve anahtarla silmeyi içeren herhangi bir kapsayıcı
  • karma haritası : ilişkilendirme konteynerinin karma tablosu uygulaması
  • hash set benzersiz anahtarları zorlayan : ayrı bir anahtar / değer bileşenleri içerdiğinden işlem yapmadan bir sözlük saklama elemanının / değerlerinin bir karma tablo uygulaması, buradaki elemanların kopyaları eklenemez
  • yinelenen anahtarı destekleyen denge ikili ağaç haritası : ...

Özel uygulamalar ile çapraz referans Comp Sci terminolojisi

C ++ Standart Kütüphanesi

  • haritalar: map, multimap, unordered_map,unordered_multimap
  • Diğer sözlükler: set, multiset, unordered_set,unordered_multiset
  • not: adım adım elde veya std::findsize üyelik için bir element ve testi silebilir array, vector, list, dequeöğenin bulunmasını O (N) de olağanüstü verimsiz olduğu için vs, ama konteyner arayüzleri doğrudan bazı durumlarda ekleme / silme is içinde, yani desteklemez verimsizdir ve bu işlemleri desteklemek, kabın gerektirdiği kasıtlı olarak sınırlı API'yı zayıflatır; örneğin deque, bazı anahtarlar açısından değil, yalnızca önden ve arkadan silme / pop'u desteklemesi gerekir. Aramayı yavaşça düzenlemek için kodda daha fazla iş yapmak zorunda kalmak, programcıyı daha verimli bir arama ile bir konteyner veri yapısına geçmeye teşvik eder.

... daha sonra başka diller ekleyebilir /


3

Tipik olarak bir haritanın karma tablo ile desteklendiğini varsayıyorum; sıralanmamış bir mağazayı ifade eder. Sözlükler sıralı bir mağazayı ifade eder.

Trie adı verilen ağaç tabanlı bir sözlük var .

Lisp'de şöyle görünebilir:

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

Hangi kelimeleri kapsar:

  • bir
  • ve
  • karınca
  • bir
  • ilan

Üstten yapraktan çaprazlama bir kelime verir.


4
DictionaryNet sıralanmamış.
BlueRaja - Danny Pflughoeft

2
Kakao sözlükleri de sıralanmamış.
Ken

C ++ std::mapuygulaması standartta belirtilmemiş, std::unordered_mapc ++ 11'de tanıtıldı, bir karma yoluyla uygulandı
Harald Scheirich

3
@HaraldScheirich - C ++ standardı özellikle "uygulamak için kırmızı-siyah bir ağaç kullanacaksınız" demese de std::map, başka bir şey kullanmayı deneyin. Bir AVL ağacı çalışmaz; ekleme maliyetleri standardı karşılamıyor. Bir karma işe yaramaz; bir karma sıralanmamıştır ve dolayısıyla standardı karşılamamaktadır. Standart hemen hemen " std::mapaçıkça uygulamak için kırmızı-siyah bir ağaç kullanacaksınız " diyor.
David Hammen

+1. Sözlükler birçok platformda sıralı olmamasına rağmen, sözcük bir düzeni ifade eder. Harita terimini daha çok seviyorum.
nawfal

2

Aslında aynı şey değil. Haritalar sözlüğün bir alt kümesidir. Sözlük burada ekleme, silme ve bulma işlevlerine sahip olarak tanımlanır . Java tarafından kullanıldığı gibi (uygun Harita Bu ) değerlerine eşleme anahtarları kesinlikle bire-bir fonksiyonu olarak eşlenir bu şartı ile bir sözlük olduğunu. Bir sözlüğün bir değere birden fazla anahtar eşlemesi ya da birden fazla değere bir anahtar eşlemesi olabilir (bir hasthtable'da zincirleme gibi), örneğin Twitter hashtag aramaları.

Daha "gerçek bir dünya" örneği olarak, sözlükte bir kelimeye bakmak bize aynı kelime için birkaç tanım verebilir ve bizi başka bir girişe (başka bir kelimeye bakın), birkaç kelimeye işaret eden bir giriş bulduğumuzda aynı tanım listesi için. Gerçek dünyada, haritalar çok daha geniştir, bu da koordinatlar için adlar veya adlar için konumlara sahip olmamıza izin verir, ancak aynı zamanda en yakın komşu veya diğer nitelikleri (nüfuslar, vb.) Bulabiliriz, bu nedenle IMHO, harita türünün muhtemelen grafik tabanlı uygulamalara sahip olması gerekir, ancak her zaman yalnızca anahtar / değer çiftini varsaymak en iyisi olacaktır, çünkü özellikle en yakın komşu ve değere ilişkin diğer özelliklerin tümü değerin veri üyeleri olabilir.

java haritaları, bire bir gereksinime rağmen, değer bir koleksiyonun kendisi olarak genelleştirilmişse veya değerler yalnızca başka bir yerde saklanan koleksiyonlara başvuruyorsa, genelleştirilmiş bir sözlük gibi bir şey uygulayabilir.

Java destekleyicilerinin ADT tanımlarının koruyucuları olmadığını ve Java kararlarının özellikle Java için olduğunu unutmayın.


1

Bu kavram için oldukça yaygın olan diğer terimler: ilişkisel dizi ve karma.


1
Hash bununla bir ilgisi yok. Nesnelerin farklı olup olmadığını hızlı bir şekilde tespit etme yöntemidir. Harita / Sözlük işini yapmak için bir karma kullanan bir hashmap düşünüyorsunuz.
DJClayworth

5
@DJClayworth Hayır, birçok programlama dili aslında bu şeylere karma denir. Bkz. Ruby . Ben tasarlamadım, ve ben böyle demezdim, ama elçiyi vurma.
Hank Gay

1

Evet, aynılar, karışıma "İlişkisel Dizi" ekleyebilirsiniz.

Hashtable veya bir Hashofter kullanmak uygulamaya atıfta bulunur.


1

yani tamamen teorik düzeyde.

Sözlük, Bağlı Değeri bulmak için kullanılabilecek bir değerdir. Harita, başka bir değerin nasıl bulunacağına ilişkin talimatlar sağlayan bir Değerdir

basit bir Dizi bile doğru değere eşlenen bir dizine sahip olduğundan, doğrusal olmayan erişime izin veren tüm koleksiyonlar (yani yalnızca ilk alma veya son alma) bir Harita'dır. Dolayısıyla, Sözlük bir tür Harita iken, haritalar çok daha geniş bir olası işlev aralığıdır.

Pratikte, genellikle adı tanımlayan eşleme işlevidir, bu nedenle HashMap, anahtarı değere bağlamak için bir karma algoritma kullanan eşlenmiş bir veri yapısıdır; burada Sözlük olarak anahtarların bir değere nasıl bağlandığını belirtmez bu yüzden bağlantılı bir liste, ağaç veya başka bir algoritma ile saklanabilir. kullanım sonunda genellikle hangi algoritmanın çalıştığını umursamazsınız, böylece genel bir sözlük kullanırsınız ve yalnızca algoritma türünü enfore etmeniz gerektiğinde diğer yapılardan birine geçersiniz


-1

Bunlar aynı kavram için iki farklı terimdir.
Hashtableve HashMapaynı kavramı ifade eder.


3
Aslında Hashtable / Hashmap adlarında belirli bir uygulama gerektirir (örneğin, C ++ std :: haritasında kullanılan dengeli bir ağaç diyelim).
Joe

Genel olarak, uygulamayı önemsememelisiniz. (Performans nedenleri hariç) Ayrıca, bu her zaman doğru değildir; Örneğin .Net'e bakın.
SLaks

-2

Temel fark, bir Harita , tüm girişler (değer ve anahtar çifti) benzersiz bir anahtara sahip olmasını gerektirir. Çarpışmalar meydana gelirse, yani yeni bir giriş koleksiyonda bulunan bir girişle aynı tuşa sahipse, çarpışma yönetimi gerekir.

Genellikle, ayrı zincirleme kullanarak çarpışmalarla başa çıkıyoruz . Veya Doğrusal Problama .

Bir sözlük Birden fazla giriş aynı anahtar ile bağlantılı olduğu için izin verir.

Bir Harita Ayrı Zincirleme uyguladığında, bir Sözlüğe benzeme eğilimindedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.