Sobes.tech
Middle

როგორ მიმდინარეობს სლაისის ზომის გაზრდა Go-ში?

sobes.tech AI

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

Go-да կտորի չափի մեծացումը տեղի է ունենում հետևյալ ալգորիթմով append() ֆունկցիայի օգտագործման ժամանակ:

  1. Նոր կտորի պահանջվող ծավալը (capacity) որոշվում է:
  2. Եթե ընթացիկ ծավալը բավարար է նոր տարրերը տեղավորելու համար (cap(s) >= len(s) + len(elements)), ապա տարրերը պարզապես ավելացվում են ընթացիկ հիմնական զանգվածի վերջում, և նոր կտորը ցույց է տալիս այդ տարածքին:
  3. Եթե ընթացիկ ծավալը բավարար չէ, ապա հատկացվում է նոր հիմնական զանգված ավելի մեծ ծավալով։ Այս ծավալը որոշելու ալգորիթմը հետևյալն է.
    • Եթե պահանջվող ծավալը մեծ է հին ծավալի կրկնակի չափից (requiredCap > 2 * oldCap), ապա նոր ծավալը հավասար է պահանջվողին:
    • Եթե հին ծավալը փոքր է 1024-ից (oldCap < 1024), ապա ծավալը կրկնապատկվում է (newCap = oldCap * 2):
    • Եթե հին ծավալը մեծ է կամ հավասար 1024-ի (oldCap >= 1024), ապա ծավալը ավելացվում է 25%-ով (newCap = oldCap + oldCap/4) մինչև այն հասնի կամ գերազանցի պահանջվողը:
  4. Հին հիմնական զանգվածի տարրերը պատճենվում են նորին:
  5. Նոր տարրերը ավելացվում են նոր հիմնական զանգվածի վերջում:
  6. Նոր ծավալը կարող է փոքր-ինչ մեծ լինել հաշվարկված արժեքից՝ հիշողության հարթեցման պատճառով:
  7. append() ֆունկցիան վերադարձնում է նոր կտոր, որը ցույց է տալիս նոր հիմնական զանգվածին:

Բացի այդ, հին կտորը և նրա հիմնական զանգվածը կարող են հեռացվել գարշահավաքով, եթե այլ հղումներ չեն դրանց։