Sobes.tech
Middle

რა დონით იზრდება slice-ის ზომა append ფუნქციის გამოყენებისას?

sobes.tech AI

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

სლაისის ზომა შეიძლება განსხვავებული გზებით გაიზარდოს, დამოკიდებულია მიმდინარე მოცულობაზე cap(slice):

  1. თუ მოცულობა არ არის საკმარისი: ახალი მოცულობა იქნება მინიმუმ ორჯერ მეტი მიმდინარე მოცულობის, თუ ეს ნაკლებია 1024-ზე. თუ მეტი, ახალი მოცულობა გაიზრდება დაახლოებით 25%-ით მიმდინარე მოცულობიდან, სანამ არ გახდება საკმარისი. შემდეგ შეიძლება იყოს განახლებული ზევით.
  2. თუ მოცულობა საკმარისია: სლაისის ზომა ზუსტად გაიზრდება დამატებული ელემენტების რაოდენობით, ხოლო მოცულობა დარჩება უცვლელი.
// მაგალითი append-ის ქცევაზე, როდესაც მოცულობა არ არის საკმარისი
s := make([]int, 0, 0) // ზომა 0, მოცულობა 0
s = append(s, 1)       // ზომა 1, მოცულობა 1. (0 -> 1)
s = append(s, 2)       // ზომა 2, მოცულობა 2. (1 -> 2)
s = append(s, 3)       // ზომა 3, მოცულობა 4. (2 -> 4)
s = append(s, 4)       // ზომა 4, მოცულობა 4
s = append(s, 5)       // ზომა 5, მოცულობა 8. (4 -> 8)

s2 := make([]int, 0, 1025) // ზომა 0, მოცულობა 1025
s2 = append(s2, make([]int, 500)...) // ზომა 500, მოცულობა 1025 (საკმარისია)
s2 = append(s2, make([]int, 1000)...) // ზომა 1500, დაახლოებით 1025 + 1025*0.25 + epsilon

კონკრეტული ალგორითმი მოცულობის ზრდისთვის მდებარეობს runtime-ის შიგნით და შეიძლება განსხვავდებოდეს Go-ის ვერსიებს შორის. თუმცა, ზოგადი წესები (ორმაგი ზრდა 1024-მდე, დაახლოებით 25%-იანი ზრდა შემდეგ) რჩება ძალაში.