Apa kompleksitas waktu dari berbagai struktur data?

87

Saya mencoba membuat daftar kerumitan waktu dari operasi struktur data umum seperti Array, Pohon Pencarian Biner, Heap, Daftar Tertaut, dll. Dan terutama saya mengacu pada Java. Mereka sangat umum, tetapi saya rasa beberapa dari kita tidak 100% yakin tentang jawaban yang tepat. Bantuan apa pun, terutama referensi, sangat dihargai.

Misalnya Untuk daftar tertaut tunggal: Mengubah elemen internal adalah O (1). Bagaimana kamu melakukannya? Anda HARUS mencari elemen sebelum mengubahnya. Juga, untuk Vektor, menambahkan elemen internal diberikan sebagai O (n). Tetapi mengapa kita tidak dapat melakukannya dalam waktu konstan diamortisasi menggunakan indeks? Harap perbaiki saya jika saya melewatkan sesuatu.

Saya memposting temuan / tebakan saya sebagai jawaban pertama.

Bhushan
sumber
2
Kompleksitas Ruang dan Waktu untuk semua struktur data Lembar contekan Big O
Vbp
1
Jika ada orang lain yang melakukan ini, luangkan waktu sebentar untuk juga memeriksa tautan ini: infotechgems.blogspot.gr/2011/11/…
vefthym

Jawaban:

246

Array

  • Set, Periksa elemen pada indeks tertentu: O (1)
  • Pencarian : O (n) jika array tidak diurutkan dan O (log n) jika array diurutkan dan sesuatu seperti pencarian biner digunakan,
  • Seperti yang ditunjukkan oleh Aivean , tidak ada Deleteoperasi yang tersedia di Array. Kami secara simbolis dapat menghapus elemen dengan menyetelnya ke beberapa nilai tertentu, misalnya -1, 0, dll. Tergantung pada kebutuhan kami
  • Demikian pula, Insertuntuk array pada dasarnya Setseperti yang disebutkan di awal

ArrayList:

  • Tambahkan : Amortisasi O (1)
  • Hapus : O (n)
  • Berisi : O (n)
  • Ukuran : O (1)

Daftar Tertaut:

  • Memasukkan : O (1) , jika dilakukan di kepala, O (n) jika di mana saja karena kita harus mencapai posisi itu dengan melintasi linkedlist secara linier.
  • Menghapus : O (1) , jika dilakukan di kepala, O (n) jika di tempat lain karena kita harus mencapai posisi itu dengan melintasi linkedlist secara linier.
  • Mencari : O (n)

Daftar Tertaut Ganda:

  • Memasukkan : O (1) , jika dilakukan di head atau tail, O (n) jika ada di tempat lain karena kita harus mencapai posisi itu dengan melintasi linkedlist secara linier.
  • Menghapus : O (1) , jika dilakukan di head atau tail, O (n) jika ada di tempat lain karena kita harus mencapai posisi itu dengan melintasi linkedlist secara linier.
  • Mencari : O (n)

Tumpukan:

  • Dorong : O (1)
  • Pop : O (1)
  • Atas : O (1)
  • Pencarian (Sesuatu seperti pencarian, sebagai operasi khusus): O (n) (Saya rasa begitu)

Antrian / Deque / Circular Queue:

  • Masukkan : O (1)
  • Hapus : O (1)
  • Ukuran : O (1)

Pohon Pencarian Biner:

  • Masukkan, hapus dan cari : Kasus rata-rata: O (log n) , Kasus Terburuk: O (n)

Pohon Merah-Hitam:

  • Masukkan, hapus dan cari : Kasus rata-rata: O (log n) , Kasus Terburuk: O (log n)

Heap / PriorityQueue (min / max):

  • Temukan Min / Temukan Maks : O (1)
  • Masukkan : O (log n)
  • Hapus Min / Hapus Maks : O (log n)
  • Ekstrak Min / Ekstrak Max : O (log n)
  • Cari, Hapus (jika tersedia): O (n) , kita harus memindai semua elemen karena tidak diurutkan seperti BST

HashMap / Hashtable / HashSet:

  • Sisipkan / Hapus : O (1) diamortisasi
  • Ukuran ulang / hash : O (n)
  • Berisi : O (1)
Bhushan
sumber
3
Memasukkan elemen ke dalam Array (dan dengan menyisipkan maksud saya menambahkan elemen baru ke posisinya, menggeser semua elemen ke kanan) akan mengambil O (n). Sama untuk penghapusan. Hanya mengganti elemen yang ada akan mengambil O (n). Juga mungkin Anda mencampurnya dengan menambahkan elemen baru ke array yang dapat diubah ukurannya (itu telah diamortisasi O (1) kali).
Aivean
Juga harap dicatat, bahwa untuk daftar yang ditautkan-ganda, memasukkan dan menghapus kedua kepala dan ekor akan mengambil O (1) (Anda hanya menyebutkan kepala).
Aivean
Dan catatan terakhir, pohon pencarian yang seimbang (misalnya, pohon Merah-hitam yang sebenarnya digunakan untuk TreeMap di Java) telah menjamin waktu kasus terburuk O (ln n) untuk semua operasi.
Aivean
@ Aivean: Saya hanya mencoba membuat daftar operasi standar untuk struktur data standar. Untuk Array: Menggeser elemen sambil menambah / menghapus bukanlah operasi standar. Juga, mengganti elemen yang ada membutuhkan O (1) menggunakan indeks, bukan O (n). Untuk Daftar Tertaut Ganda: Anda benar, saya sedang melakukan koreksi. Untuk Pohon Merah-Hitam: Sekali lagi, Anda benar. Tetapi saya hanya mencantumkan BST, yang tidak perlu diseimbangkan. Jadi, saya akan menambahkan entri baru untuk Pohon Merah-Hitam. Terima kasih atas komentarnya!
Bhushan
1
@SuhailGupta: Kompleksitas untuk Set sudah diberikan sebagai poin terakhir.
Bhushan