Saya membaca analisis tentang array dinamis (dari manual algoritma Skiena).
Yaitu ketika kita memiliki struktur array dan setiap kali kita kehabisan ruang, kita mengalokasikan array baru dua kali lipat ukuran aslinya.
Ini menjelaskan pemborosan yang terjadi ketika array harus diubah ukurannya.
Dikatakan bahwa (n / 2) +1 hingga n akan dipindahkan paling banyak satu kali atau tidak sama sekali. Ini jelas.
Kemudian dengan menjelaskan bahwa separuh elemen bergerak satu kali, seperempat elemen dua kali, dan seterusnya, jumlah total gerakan M diberikan oleh:
Bagi saya ini menambah lebih banyak salinan daripada yang sebenarnya terjadi.
Misalnya
jika kita memiliki yang berikut ini:
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 || || || || || || || || |
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
Kami memiliki elemen x disalin 4 kali, elemen c disalin 4 kali, elemen b disalin 4 kali dan elemen disalin 5 kali sehingga totalnya adalah 4 + 4 + 4 + 5 = 17 salinan / gerakan.
Tetapi menurut rumus kita harus memiliki 1 * (16/2) + 2 * (16/4) + 3 * (16/8) + 4 * (16/16) = 8 + 8 + 6 + 4 = 26 salinan dari elemen untuk pembesaran array menjadi 16 elemen.
Apakah ini beberapa kesalahan atau tujuan dari formula ini adalah untuk memberikan perkiraan batas atas kasar? Atau apakah saya salah memahami sesuatu di sini?
b
disalin 3 kali, masing-masing c
dua kali, dan masing-masing satu x
kali. 15 salinan.