SORU
29 Kasım 2008, CUMARTESİ


Nasıl Python'In Sözlükler Uygulanan İnşa edilir

Herkes python için yerleşik bir sözlük türü nasıl uygulanır biliyor mu? Benim anladığım karma tablo bir tür olduğunu, ancak kesin bir cevap her türlü bulmayı başaramadım.

CEVAP
26 Ocak 2012, PERŞEMBE


Burada bir araya koymak mümkün olduğunu Python dicts hakkında her şey (herkes bilmek ister; ama cevap kapsamlı olandan muhtemelen daha fazla).

  • Python sözlükleri olarak uygulanırhash tabloları.
  • Karma tablo için izin vermelidirkarma çarpışmalareğer iki farklı anahtar aynı hash değeri varsa bile, yani, tablonun uygulama eklemek için bir strateji var ve anahtar ve değer çiftleri açıkça almanız gerekir.
  • dict Python kullanıraçık adreslemekarma çarpışmalar (aşağıda açıklanmıştır) (dictobject.c:296-297) gidermek için.
  • Python karma tablo sadece bir ardışık bellek bloğuna (dizin tarafından O(1) Bir arama yapabilirsin, bunu bir dizi gibi).
  • Tablodaki her yuva tek bir giriş saklayabilirsiniz.Bu çok önemli.
  • Hergiriştablo aslında üç değeri bir arada:&; hash anahtarı lt, değer >. Bu C bir yapı (dictobject.h:51-56) olarak uygulanır.
  • Aşağıdaki şekil Python karma tablo mantıksal bir temsilidir. Aşağıdaki Şekil, 0, 1, ..., i, ... solda olan endeksyuvalarıkarma tablo (sadece görsel amaçlı ve tablo belli ki birlikte depolanan değil!).

    # Logical model of Python Hash table
    - ----------------- 
    0| <hash|key|value>|
    - ----------------- 
    1|      ...        |
    - ----------------- 
    .|      ...        |
    - ----------------- 
    i|      ...        |
    - ----------------- 
    .|      ...        |
    - ----------------- 
    n|      ...        |
    - ----------------- 
    
  • Yeni bir dict başlatıldığında 8 ile başlaryuvaları. (dictobject.h:49)

  • Tablo girdileri ekleyerek, anahtar hash dayalı bazı yuvası, i ile başlıyoruz. CPython başlangıçta i = hash(key) & mask kullanan mask = PyDictMINSIZE - 1, ama bu gerçekten önemli değil. Sadece işaretli olan ilk yuvası, ben, bağlı olduğunu unutmayınkarmaanahtar.
  • Eğer o slot boş ise, giriş (giriş, I, <hash|key|value>) demek yuvası eklenir. Ama eğer o slot işgal etmiş. Büyük olasılıkla başka bir girişe aynı hash (hash çarpışma!) var çünkü
  • Eğer slot dolu, CPython (ve hatta) PyPy bu karşılaştırırkarma VE anahtar(karşılaştırmak tarafından 9* *karşılaştırma is karşılaştırma değil yani) eklenecek geçerli giriş anahtarı karşı yuvasına girdi (dictobject.c:337,344-345). Eğerher ikisi demaç, daha sonra giriş zaten var, PES ve eklenecek bir sonraki giriş için hamle üzerine düşünüyor. Eğer ya da karma veya anahtar uymuyor diye, başlarsonda.
  • Sadece sonda yuvası yuvaları boş bir yuva bulmak için arama anlamına gelir. Teknik olarak sadece bir tane i 1, i 2, ... tek gidip uygun olanı (lineer prob) kullanabiliriz. Ama nedenleriyle açıkladı yorum güzel (dictobject.c:33-126), CPython kullanırsondalama rastgele. Rasgele yoklama, bir sonraki yuvası sözde rastgele bir sırayla çekilir. Giriş ilk boş yuvaya eklenir. Bu tartışma için, gerçek algoritma bir sonraki slot almak için kullanılan çok önemli (algılama algoritması dictobject.c:33-126) değil. Önemli olan ilk slot boş yuva bulunana kadar tanınacak.
  • Aynı şeyi aramalarında olur, ilk yuvası ile anahtarı karma üzerinde değişir) başlar. Eğer karma ve anahtarı her iki yuvaya girdi maç yok eğer doğru değilse, bir maç ile bir yuva bulana kadar sonda başlar. Eğer tüm kanalları tükendi, bir hata bildirdi.
  • BTW, dict eğer üçte ikisi dolu ise getirilecektir. Bu aramaları yavaşlatan engeller. (dictobject.h:64-65)

NOT: Python ile ilgili araştırma yaptım kendim için yanıt olarak Dict uygulama 20 ** dict çoklu girişler aynı karma değere sahip olabilir. Araştırma bu soru için çok uygun hepsi burada da çünkü cevabın biraz düzenlenmiş bir versiyonu yayınlanmıştır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GavinMichaelBooth

    GavinMichael

    26 AĞUSTOS 2006
  • Incredible Tutorials

    Incredible T

    27 EKİM 2006
  • knopik96

    knopik96

    7 Mayıs 2011