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


46

Arasındaki fark nedir Hashve Dictionary?

Bir komut dosyası arka planından gelince, benzer olduklarını hissediyorum, ancak kesin farklılıkları bulmak istedim. Googling bana pek yardımcı olmadı.

Yanıtlar:


92

Hashprogramcının arayüzle uygulama ile karıştığı ( ve tam adını yazmak için çok tembel olan, yani HashTablebunun yerine bir kısaltmaya başvurdu Hash) , oldukça zayıf adlandırılmış bir veri yapısıdır .

Dictionaryolan “doğru” adı arayüzü (= bir ADT ), yani, bir birleştirici kabının (zorunlu olarak benzersiz) değerlerine harita (genellikle benzersiz) anahtarlar.

Bir hash tablodur biri (çalışmak açısından) oldukça iyi erişim özellikleri sağlar ve bu nedenle sık sık varsayılan uygulamadır böyle bir sözlüğü olası uygulama.

Böyle bir uygulamanın iki önemli özelliği vardır:

  1. anahtarların birbirine has ve eşit olması gerekir .
  2. girişler sözlükte belirli bir sırada görünmez.

(Bir anahtarın bağlanabilir olması için, daha sonra bir dizide indeks olarak kullanılan bir anahtardan sayısal bir değer hesaplayabileceğimiz anlamına gelir.)

Anahtarlar üzerinde bir emir veren sözlük veri yapısının alternatif uygulamaları vardır - buna genellikle sıralanmış bir sözlük denir (ve diğer etkili uygulamalar olsa da, genellikle bir arama ağacı açısından uygulanır).


Özetle: Sözlük , anahtarları değerlere eşleyen bir ADT'dir. Bu ADT'nin karma tablosundan biri olan birkaç olası uygulaması vardır . Hashbir yanlıştır, ancak bağlamda bir karma tablo açısından uygulanan bir sözlüğe eşdeğerdir.


4
C ++ 'da bir örnek vermek gerekirse, bir sonraki standart etkin bir şekilde karma tablolara sahip olacak olmasına rağmen, standart ilişkisel konteyner şablonları karma olarak uygulanamadı. unordered_mapNe olduklarından ziyade ne yaptıklarını göstermek için çağrılırlar .
David Thornley

6
Hangi otoriteye göre “doğru”? Ruby ve Perl gibi bazı dillerde, resmi - “doğru” okundu - bu yapıların adı “karma” dır.
nohat

11
@nohat: Tırnakları kullandığımı fark et. Dahası, ben var adı kötü seçilir neden açıkladı, duymadım? Öyleyse bir otoriteye ihtiyacınız varsa, o zaman bunun teorik bilgisayar bilimi polisinin otoritesi tarafından olduğunu söyleyeceğim.
Konrad Rudolph

9
İlginçtir ki, Ruby 1.9'da Hashbir karma tabloyla sınıfı uygulamak aslında mümkün değildir , çünkü Ruby 1.9 Hashes bir karma tabloyu değilken ekleme sırasını korur. Yani, Ruby 1.9'da, isim Hashartık uygulamayı yansıtmıyor bile.
Jörg W Mittag

7
@ hippietrail Yanlışsınız - önce bunlar objektif açıklamalar. Ne de olsa, adlamanın neden zayıf ve yanlış bir isim verdiğine inanıyorum (aşağıya bakınız). “Çok tembel” benim tarafımdan sanatsal lisans, ancak asıl nokta, adı kısaltmanın nedeninin içsel olduğu, yani adı kısaltmaktan başka kısa bir ad kullanmanın bir nedeni olmadığı yönünde. Ve “sözlük” konusunda yanılıyorsun: bu sadece veri yapısının resmi adı . “Sözlük” tanımınız bilgisayar bilimi bağlamında yanlıştır ve adı Python'u on yıllardan önce yutmaktadır.
Konrad Rudolph

8

"Sözlük" kavramının adıdır. Bir karma tablo olası bir uygulamadır.


1
Hash ayrıca bir ADT'dir. HashTable, bir karma uygulamasının gerçekleştirilmesidir
Sairam,

3
@ Sairam 'karma' için karma tablodan ziyade karma fonksiyon anlamına geldiğini düşünüyorum.
jk.

@jk Aslında "karma", bazı girdilere "karma işlevi / algoritma" uygulamasının sonucudur. Bir "hash tablosu" veya "hash haritası" omehoe, bazı nesnelerle (hassastır, genel bir formda nesne, OOP ile sınırlı değil) ilişkilidir ve nesneyi ilişkilendirir
johannes

Yalnızca karma işlev işleminden ziyade sözlük türündeki bir yapıya başvurmak için 'Hash' kullanan diller var. Örneğin Ruby .
Sean Burton,

7

Sözlük, hızlı aramalar / eklemeler için kullanılan herhangi bir veri yapısı uygulaması için verilen toplu terimdir. Bu, karma tablo, atlama listeleri, rb ağacı vb. Gibi çeşitli veri yapıları kullanılarak gerçekleştirilebilir / uygulanabilir. Karma tablo, bir sözlük uygulamak da dahil olmak üzere birçok amaç için yararlı olan spesifik bir veri yapısıdır.


Hash ayrıca bir ADT'dir. Hash ve Dictionary ADT arasında belirli bir fark var mı?
Sairam

2
@ Sairam: Hayır, karma belirli bir algoritma çıktısıdır (karma işlevi).

5

Bir sözlük bir doğrudan içinde referans değerine bir anahtarı kullanır ilişkisel dizi .

yani (KEY => VALUE)

Bir karma daha sık , değerin olacağı bellekteki (veya daha kolay bir şekilde bir dizinin) konumunu hesaplamak için bir karma işlevini kullanan bir karma tablosu olarak tanımlanır . Karma, KEY'i girdi olarak alır ve çıktı olarak bir değer verir. Ardından bu değeri hafızaya veya dizi indeksine takın.

yani KEY => HASH FUNCTION => VALUE

Sanırım biri doğrudan diğeri değil. Karma işlevler de mükemmel olmayabilir ve bazen yanlış değeri gösteren bir dizin sağlayabilir. Ancak bu düzeltilebilir.

Bakılacak en iyi yer: Wikipedia ( ilişkisel dizi ve karma tablo )

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.