Sobes.tech
Junior

გააზიარეთ ჰეშ სია და მათი ძირითადი მუშაობის პრინციპი.

sobes.tech AI

პასუხი AI-სგან

ჰეშ-ცხრილი (ჰეშ-მაპი) — ეს მონაცემთა სტრუქტურაა, რომელიც განახორციელებს ასოციაციურ მასივს და მიანიჭებს გასაღებს მნიშვნელობებს.

ძირითადი მუშაობის პრინციპი:

  1. ჰეშირება: თითოეულ გასაღზე გამოითვლება ჰეშ-კოდი — რიცხვითი მნიშვნელობა ფიქსირებული ზომის ჰეშ-ფუნქციის საშუალებით. კარგი ჰეშ-ფუნქცია თანაბრად განაწილებს ჰეშ-კოდებს მთელ გამოსავალში.
  2. ინექსირება: გამოთვლილი ჰეშ-კოდი გამოიყენება ინდექსის განსაზღვრაში (პოზიცია) მასივში, სადაც შეინახება შესაბამისი მნიშვნელობა. ხშირად ჰეშ-კოდი მოდულით მასივის ზომაზე (hash(key) % array_size) იძლევა საბოლოო ინდექსს.
  3. შენახვა: მასივში გამოთვლილი ინდექსზე ინახება (გასაღები, მნიშვნელობა) წყვილი.
  4. ძებნა: მნიშვნელობის პოვნისთვის, კვლავ გამოითვლება გასაღების ჰეშ-კოდი, განსაზღვრის ინდექსი და ამ ინდექსიდან მიიღება მნიშვნელობა.
  5. კოლიზიები: წარმოიქმნება, როდესაც სხვადასხვა გასაღებს აქვს ერთიდაიგივე ჰეშ-კოდი. არსებობს სხვადასხვა მეთოდები კოლიზიების გადაჭრისთვის:
    • საფეხურების მეთოდი (Separate Chaining): თითოეულ მასივის ინდექსზე ინახება სია (ან სხვა მონაცემთა სტრუქტურა), რომელიც შეიცავს ყველა (გასაღები, მნიშვნელობა) წყვილს, ჰეშ-კოდები რომლებსაც მიიყვანა ამ ინდექსამდე.
    • გახსნილი მისამართის მეთოდი (Open Addressing): კოლიზიის დროს ეძებს სხვა თავისუფალ ადგილს მასივში გარკვეული წესით (გრძივი სონდომირება, კვადრატული სონდომირება, ორმაგი ჰეშირება).

უპირატესობები:

  • საშუალოდ ოპერაციები ჩასმა, წაშლა და ძიება აქვს სირთულე O(1), თუ ჰეშ-ფუნქცია კარგი და კოლიზიები იშვიათია.

მოხერხებულობა:

  • ყველაზე უარესი შემთხვევა შეიძლება იყოს O(n), თუ ყველა გასაღები ჰეშტდება ერთსა და იმავე ინდექსზე (მაგალითად, ცუდი ჰეშ-ფუნქციის ან დიდი კოლიზიების დროს).
  • საჭიროებს დამატებით მეხსიერებას მასივისთვის და შესაძლოა კოლიზიების გადაჭრისთვის.

Swift-ში ჰეშ-ცხრილები განახორციელებულია Dictionary ტიპით:

// Swift-ში Dictionary-ის გამოყენების მაგალითი
var myDictionary: [String: Int] = ["apple": 1, "banana": 2, "orange": 3]

// წვდომა გასაღებით
let value = myDictionary["banana"] // მიიღებს Optional(2)

// დამატება/განახლება
myDictionary["grape"] = 4 // დაამატებს ახალ წყვილს
myDictionary["apple"] = 10 // განაახლებს მნიშვნელობას "apple" გასაღებისთვის

// წაშლა
myDictionary["orange"] = nil // წაშლის "orange" წყვილს