Struktur data dengan pencarian, masukkan dan hapus dalam waktu diamortisasi


25

Apakah ada struktur data untuk mempertahankan daftar yang diurutkan yang mendukung operasi berikut dalam waktu diamortisasi?O(1)

  • GetElement (k) : Mengembalikan elemen ke- dari daftar.k

  • 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.


2
Dalam Optimal Algoritma untuk Daftar Indexing dan Subset Ranking (1989) saya menemukan solusi untuk masalah ini. Ω(log nlog log n)
PADA

2
@ Raphael: Saya pikir maksudnya elemen yang akan disebut jika struktur data adalah sebuah array. Array mendukung operasi pertama dalam O ( 1 ) waktu tetapi bukan yang kedua; daftar tertaut mendukung operasi kedua dalam O ( 1 ) waktu tetapi bukan yang pertama. A[k]O(1)O(1)
JeffE

2
Juga, pohon biner seimbang mendukung kedua operasi dalam waktu . O(logn)
JeffE

1
@ Raphael: Diedit untuk memperjelas.
JeffE

2
@JeffE array dinamis mendukung dua yang pertama dalam waktu diamortisasi ( cs.uwaterloo.ca/research/tr/1999/09/CS-99-09.pdf )O(1)
Diego

Jawaban:


33

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).


3
@AT: Ikatan itu tidak pernah "terbukti salah". Ada situasi di mana itu tidak berlaku, tetapi itu adalah pernyataan yang sama sekali berbeda!
Raphael

5
@ AT: Pengurutan batas bawah terbukti dalam model komputasi yang jauh lebih lemah, yaitu pohon keputusan biner. Batas itu "terbukti salah" dengan mengembangkan algoritma lebih cepat yang tidak dapat digambarkan sebagai pohon keputusan biner. Untuk membuktikan kesalahan batas bawah Fredman dan Saks, Anda harus merancang algoritme yang lebih cepat yang tidak mengakses memori . Semoga berhasil.
JeffE

@ Jeff dan Raphael; tinjau jawaban saya yang lain dan konfirmasikan / tolak hasil saya ketika Anda mendapat kesempatan. Terima kasih.
PADA

6

1
Ω(logn/loglogn)

Memang. Juga, dapatkah Anda mengonfirmasi bahwa batasan ini berlaku untuk masalah representasi daftar dengan kata-kata berukuran konstan?
PADA

1
Θ(logn/loglogn), dan karenanya tidak Ω(logn).
jbapple
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.