Tôi đang đọc một phân tích về mảng động (từ hướng dẫn thuật toán của Skiena).
Tức là khi chúng ta có một cấu trúc mảng và mỗi khi chúng ta hết dung lượng, chúng ta sẽ phân bổ một mảng mới có kích thước gấp đôi kích thước ban đầu.
Nó mô tả chất thải xảy ra khi mảng phải được thay đổi kích thước.
Nó nói rằng (n / 2) +1 đến n sẽ được di chuyển nhiều nhất một lần hoặc không. Điều này rõ ràng.
Sau đó, bằng cách mô tả rằng một nửa các phần tử di chuyển một lần, một phần tư các phần tử hai lần, v.v., tổng số chuyển động M được đưa ra bởi:
Điều này dường như với tôi rằng nó thêm nhiều bản sao hơn thực tế xảy ra.
Ví dụ
nếu chúng ta có những điều sau đây:
array of 1 element
+--+
|a |
+--+
double the array (2 elements)
+--++--+
|a ||b |
+--++--+
double the array (4 elements)
+--++--++--++--+
|a ||b ||c ||c |
+--++--++--++--+
double the array (8 elements)
+--++--++--++--++--++--++--++--+
|a ||b ||c ||c ||x ||x ||x ||x |
+--++--++--++--++--++--++--++--+
double the array (16 elements)
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
|a ||b ||c ||c ||x ||x ||x ||x || || || || || || || || |
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
Chúng ta có phần tử x được sao chép 4 lần, phần tử c được sao chép 4 lần, phần tử b được sao chép 4 lần và một phần tử được sao chép 5 lần nên tổng cộng là 4 + 4 + 4 + 5 = 17 bản sao / chuyển động.
Nhưng theo công thức, chúng ta nên có 1 * (16/2) + 2 * (16/4) + 3 * (16/8) + 4 * (16/16) = 8 + 8 + 6 + 4 = 26 bản sao của các phần tử để mở rộng mảng thành 16 phần tử.
Đây có phải là một số sai lầm hoặc mục đích của công thức là cung cấp một xấp xỉ giới hạn trên thô? Hay tôi đang hiểu sai một cái gì đó ở đây?
b
được sao chép 3 lần, mỗi c
lần hai lần và mỗi x
lần một lần. 15 bản.