Middle+
Python-da siyahıya bənzər məlumat strukturu olmasaydı, onu necə həyata keçirərdiniz?
sobes.tech Süni İntellekt
AI-dan cavab
Mən onu dinamik massiv əsasında həyata keçirərdim.
Əsas prinsiplər:
- Elementləri saxlamaq üçün sabit ölçülü massivdən istifadə etmək.
- Massivin tutumu dolduqda, daha böyük ölçülü yeni massiv yaratmaq (adətən 1.5-2 dəfə böyük) və bütün elementləri ora köçürmək.
- Mövcud elementlərin sayını saxlamaq.
- Əlavə etmək, silmək, indekslə giriş, təkrarlama və uzunluğu müəyyən etmək üçün metodlar təmin etmək.
Əsas struktur nümunəsi:
class MyList:
def __init__(self, capacity=10):
self._capacity = capacity # Maksimum tutum
self._size = 0 # Mövcud element sayı
self._array = [None] * self._capacity # Daxili massiv
def _resize(self, new_capacity):
new_array = [None] * new_capacity
for i in range(self._size):
new_array[i] = self._array[i]
self._array = new_array
self._capacity = new_capacity
def append(self, item):
if self._size == self._capacity:
self._resize(self._capacity * 2) # Ölçünü 2 dəfə artır
self._array[self._size] = item
self._size += 1
def __len__(self):
return self._size
def __getitem__(self, index):
if 0 <= index < self._size:
return self._array[index]
raise IndexError("indeks xaricində")
def __setitem__(self, index, item):
if 0 <= index < self._size:
self._array[index] = item
else:
raise IndexError("indeks xaricində")
def __iter__(self):
for i in range(self._size):
yield self._array[i]
# Digər metodlar: insert, pop, remove, index və s. əlavə oluna bilər.
Bu yanaşmanın üstünlükləri:
- İndeksə görə giriş (get/set) orta hesabla O(1).
- Sonuna sürətli əlavə (append) orta hesabla O(1) (yaddaşın yenidən ayrılması xərclərinin amortizasiyası sayəsində).
- Təkrarlama O(n), burada n elementlərin sayı.
Çətinliklər və kompromisslər:
- Ortadakı elementlərin əlavə olunması və ya silinməsi O(n) vaxt alır.
- Yaddaşın yenidən ayrılması və köçürmə bahalı əməliyyatlar ola bilər, lakin nadir hallarda baş verir və çoxlu əlavə əməliyyatlarına paylanır (amortizasiya analizi).
list ilə tam analoq üçün, insert, pop, remove, index, dilimlər və s. çox sayda digər metodların da həyata keçirilməsi lazımdır, bu isə standart əməliyyatların səmərəliliyini qoruyur.