3622
правки
Изменения
→Добавление элементов
*Самый интересный случай {{---}} когда главный массив и все листья заполнены. Cначала вычислим нужный размер (массивы <tex>top</tex> и <tex>leaf</tex> увеличиваются в <tex>2</tex> раза, то есть <tex>power = power \cdot 2 </tex>), затем скопируем элементы в новую структуру HAT, освобождая старые листья и распределяя новые листья(размер листа изменился, а значит количество элементов в листе и количество используемых листьев так же изменится).
Такой подход к расширению помогает избежать избыточного перекопирования, используемого во многих реализациях массивов переменной длины, потому что увеличения размеров всех массивов происходит редко (как будет видно ниже). Копировать элементы мы будем только тогда, когда главный массив полон (достигли соответствующей степени двойки, то есть <tex> N = (2 \cdot 2)^k</tex>, где <tex>k</tex> {{---}} натуральное число), тогда общая сумма перекопирования будет равна <tex>1+4+16+64+256+...+N</tex>. Воспользуемся тождеством: <tex>(x^{n+1} -1)=(x-1)(1+x+x^2+x^3+... + x^k)</tex>, тогда для нашего случая: <tex>1 +4+4^2+4^3+...+4^k = (4^{k+1} -1)/(4-1) = (4N-1)/3</tex>, или около <tex>4N/3</tex>. Это означает, что среднее число дополнительных операций копирования {{---}} <tex>O(N)</tex> для последовательного добавления N элементов, а не <tex>O(N^2)</tex>. Мы получили <tex>4N/3</tex> против <tex>2N</tex> в обычном динамическом массиве, то есть константа уменьшилась.
[[Файл:AlgoF2.gif|400px]]