Middle
როგორ მიმდინარეობს სლაისის ზომის გაზრდა Go-ში?
sobes.tech AI
პასუხი AI-სგან
Go-да կտորի չափի մեծացումը տեղի է ունենում հետևյալ ալգորիթմով append() ֆունկցիայի օգտագործման ժամանակ:
- Նոր կտորի պահանջվող ծավալը (capacity) որոշվում է:
- Եթե ընթացիկ ծավալը բավարար է նոր տարրերը տեղավորելու համար (
cap(s) >= len(s) + len(elements)), ապա տարրերը պարզապես ավելացվում են ընթացիկ հիմնական զանգվածի վերջում, և նոր կտորը ցույց է տալիս այդ տարածքին: - Եթե ընթացիկ ծավալը բավարար չէ, ապա հատկացվում է նոր հիմնական զանգված ավելի մեծ ծավալով։ Այս ծավալը որոշելու ալգորիթմը հետևյալն է.
- Եթե պահանջվող ծավալը մեծ է հին ծավալի կրկնակի չափից (
requiredCap > 2 * oldCap), ապա նոր ծավալը հավասար է պահանջվողին: - Եթե հին ծավալը փոքր է 1024-ից (
oldCap < 1024), ապա ծավալը կրկնապատկվում է (newCap = oldCap * 2): - Եթե հին ծավալը մեծ է կամ հավասար 1024-ի (
oldCap >= 1024), ապա ծավալը ավելացվում է 25%-ով (newCap = oldCap + oldCap/4) մինչև այն հասնի կամ գերազանցի պահանջվողը:
- Եթե պահանջվող ծավալը մեծ է հին ծավալի կրկնակի չափից (
- Հին հիմնական զանգվածի տարրերը պատճենվում են նորին:
- Նոր տարրերը ավելացվում են նոր հիմնական զանգվածի վերջում:
- Նոր ծավալը կարող է փոքր-ինչ մեծ լինել հաշվարկված արժեքից՝ հիշողության հարթեցման պատճառով:
append()ֆունկցիան վերադարձնում է նոր կտոր, որը ցույց է տալիս նոր հիմնական զանգվածին:
Բացի այդ, հին կտորը և նրա հիմնական զանգվածը կարող են հեռացվել գարշահավաքով, եթե այլ հղումներ չեն դրանց։