Apakah ada struktur data untuk mempertahankan daftar yang diurutkan yang mendukung operasi berikut dalam waktu diamortisasi?
GetElement (k) : Mengembalikan elemen ke- dari daftar.
InsertAfter (x, y) : Masukkan elemen baru y ke dalam daftar segera setelah x.
Hapus (x) : Hapus x dari daftar.
Untuk dua operasi terakhir, Anda dapat mengasumsikan bahwa x diberikan sebagai pointer langsung ke struktur data; InsertElement mengembalikan pointer yang sesuai untuk y. SisipkanAfter (NULL, y) memasukkan y di awal daftar.
Misalnya, dimulai dengan struktur data kosong, operasi berikut memperbarui daftar yang dipesan seperti yang ditunjukkan di bawah ini:
- InsertAfter (NULL, a) [Sebuah]
- SisipkanSetelah (NULL, b) [b, a]
- SisipkanSetelah (b, c) [b, c, a]
- SisipkanSetelah (a, d) [b, c, a, d]
- Hapus (c) [buruk]
Setelah lima pembaruan ini, GetElement (2) akan kembali d, dan GetElement (3) akan mengembalikan kesalahan.
Jawaban:
TIDAK.
Fredman dan Saks membuktikan bahwa setiap struktur data yang mendukung operasi ini memerlukan setidaknya waktu diamortisasi per operasiΩ(logn/loglogn) . (Ini adalah referensi [1] dalam makalah oleh Dietz yang Anda sebutkan dalam komentar pertama Anda.) Batas bawah berlaku dalam model perhitungan sel probe yang sangat kuat, yang hanya mempertimbangkan jumlah alamat memori berbeda yang diakses oleh pembaruan dan kueri algoritma.
Tanpa beberapa asumsi tambahan tentang operasi pembaruan dan kueri, struktur data Dietz adalah yang terbaik (setidaknya hingga faktor konstan).
sumber
[1] Patrascu, Mihai, dan Erik D. Demaine. "Batas Bawah Logaritmik dalam Model Sel-Probe." SIAM J. Comput. 35, tidak. 4 (April 2006): 932–963. doi: 10.1137 / S0097539705447256.
sumber