Kas yra žymuo ir kaip jis naudojamas Python žodynuose?
sobes.tech AI
Atsakymas iš AI
Žemėlapis (arba žemėlapio reikšmė) yra fiksuoto ilgio skaitinė reikšmė, apskaičiuota remiantis objekto turiniu naudojant žemėlapio funkciją. Geras žemėlapio funkcija užtikrina deterministiškumą (t. y. tas pats objektas visada duoda tą patį žemėlapio reikšmę) ir siekia vienodai paskirstyti žemėlapius skirtingiems objektams.
Python'e žodynai (dict tipas) naudoja žemėlapį efektyviam raktų-vertės porų saugojimui ir paieškai. Raktai turi būti žemėlapio funkcijos, t. y. turėti __hash__() metodą ir būti nekeičiami arba turėti __eq__() ir __hash__() įgyvendinimą, kuris užtikrina, kad lygūs objektai turės tą patį žemėlapio reikšmę.
Žemėlapio su žemėlapiais procesas:
- Įterpimas: Kai įdedama pora (raktas, reikšmė), apskaičiuojamas rakto žemėlapio reikšmė. Remiantis žemėlapiu, nustatoma apytikslė vieta (krepšelis arba "bakas") šiai porai saugoti atmintyje. Jei keli raktai turi tą patį žemėlapio reikšmę (kolizija), šios poros saugomos tame bakelyje, dažnai kaip susietas sąrašas arba kitas kolizijų sprendimo mechanizmas.
- Paieška: Paieškos metu apskaičiuojama perduoto rakto žemėlapio reikšmė. Naudojant žemėlapį, greitai randama atitinkama bakelis. Tada šio bakelio viduje atliekamas rakto palyginimas (
__eq__()), siekiant rasti reikiamą raktą ir gauti su juo susietą reikšmę.
Žemėlapio naudojimo privalumai:
- Efektyvumas: Vidutiniškai įterpimo, ištrynimo ir paieškos operacijos vykdomos su pastovia laiko sudėtingumu O(1), nepriklausomai nuo žodyno dydžio.
- Greitas prieinamumas: Žemėlapis leidžia greitai pereiti prie numanomos duomenų saugojimo vietos, apeinant visus elementus.
Apribojimai ir ypatybės:
- Žemėlapio raktai: Kaip minėta, raktai turi būti žemėlapio funkcijos. Keičiamų tipų, tokių kaip sąrašai (
list) ir rinkiniai (set), pagal numatytuosius nustatymus nėra žemėlapio funkcijos ir jų negalima naudoti kaip raktus. - Kolizijos: Nors žemėlapio funkcijos siekia minimalizuoti kolizijas, jos gali įvykti, kas gali šiek tiek sulėtinti operacijas blogiausiu atveju (veikia kaip O(1) konstanta).
- Eiliškumas: Iki Python 3.7, žodyno elementų tvarka priklausė nuo įdėjimo tvarkos ir žemėlapio reikšmių. Nuo 3.7, žodynai išlaiko įdėjimo tvarką kaip šalutinį efektą, bet tai nėra žemėlapio mechanizmo dalis.
Pavyzdys žemėlapio ir ne žemėlapio objektų:
# Žemėlapio objektas (nekeičiama)
string_key = "hello"
int_key = 123
tuple_key = (1, 2)
print(hash(string_key))
print(hash(int_key))
print(hash(tuple_key))
# Ne žemėlapio objektas (keičiama)
list_key = [1, 2]
# print(hash(list_key)) # Tai sukels TypeError
# Pavyzdys naudojimo žodyne
my_dict = {
string_key: "world",
int_key: 456,
tuple_key: "tupelis"
}
print(my_dict[string_key])
print(my_dict[int_key])
print(my_dict[tuple_key])
Taigi, žemėlapis yra pagrindinis mechanizmas, leidžiantis Python žodynams pasiekti aukštą našumą operacijų, pagrįstų greitu rakto skaitmeniniu vaizdavimu, vykdymu.