Độ phức tạp về thời gian của các cấu trúc dữ liệu khác nhau là gì?


86

Tôi đang cố gắng liệt kê sự phức tạp về thời gian của các hoạt động của cấu trúc dữ liệu phổ biến như Mảng, Cây tìm kiếm nhị phân, Heap, Danh sách được liên kết, v.v. và đặc biệt tôi đang đề cập đến Java. Chúng rất phổ biến, nhưng tôi đoán một số người trong chúng ta không tự tin 100% về câu trả lời chính xác. Bất kỳ trợ giúp nào, đặc biệt là tài liệu tham khảo, được đánh giá rất cao.

Ví dụ: Đối với danh sách liên kết đơn: Thay đổi một phần tử bên trong là O (1). Làm thế nào bạn có thể làm điều đó? Bạn để tìm kiếm nguyên tố này trước khi thay đổi nó. Ngoài ra, đối với Vector, việc thêm một phần tử bên trong được cho là O (n). Nhưng tại sao chúng ta không thể làm điều đó trong thời gian cố định được phân bổ bằng cách sử dụng chỉ mục? Xin vui lòng sửa cho tôi nếu tôi thiếu một cái gì đó.

Tôi đăng những phát hiện / phỏng đoán của mình như là câu trả lời đầu tiên.


2
Thời gian và không gian Sự phức tạp cho tất cả các cấu trúc dữ liệu Big O cheat sheet
VBP

1
Trong trường hợp ai đó bước khác vào đây, dành vài phút để kiểm tra cũng liên kết này: infotechgems.blogspot.gr/2011/11/...
vefthym

Câu trả lời:


244

Mảng

  • Đặt, Kiểm tra phần tử tại một chỉ mục cụ thể: O (1)
  • Tìm kiếm : O (n) nếu mảng không được sắp xếp và O (log n) nếu mảng được sắp xếp và một cái gì đó giống như tìm kiếm nhị phân được sử dụng,
  • Như đã chỉ ra bởi Aivean , không có Deletehoạt động nào khả dụng trên Mảng. Chúng tôi có thể xóa một phần tử một cách tượng trưng bằng cách đặt nó thành một số giá trị cụ thể, ví dụ -1, 0, v.v. tùy thuộc vào yêu cầu của chúng tôi
  • Tương tự, Insertđối với mảng về cơ bản Setnhư đã đề cập ở phần đầu

Lập danh sách:

  • Thêm : Phân bổ O (1)
  • Loại bỏ : O (n)
  • Chứa : O (n)
  • Kích thước : O (1)

Danh sách liên kết:

  • Chèn : O (1) , nếu được thực hiện ở đầu, O (n) nếu ở bất kỳ đâu khác vì chúng ta phải đạt được vị trí đó bằng cách duyệt tuyến tính danh sách liên kết.
  • Xóa : O (1) , nếu được thực hiện ở đầu, O (n) nếu ở bất kỳ đâu khác vì chúng ta phải đạt được vị trí đó bằng cách duyệt tuyến tính danh sách liên kết.
  • Tìm kiếm : O (n)

Danh sách được liên kết kép:

  • Chèn : O (1) , nếu được thực hiện ở đầu hoặc đuôi, O (n) nếu ở bất kỳ đâu khác vì chúng ta phải đạt được vị trí đó bằng cách duyệt tuyến tính danh sách liên kết.
  • Xóa : O (1) , nếu được thực hiện ở đầu hoặc đuôi, O (n) nếu ở bất kỳ nơi nào khác vì chúng ta phải đạt được vị trí đó bằng cách duyệt tuyến tính danh sách liên kết.
  • Tìm kiếm : O (n)

Cây rơm:

  • Đẩy : O (1)
  • Pop : O (1)
  • Hàng đầu : O (1)
  • Tìm kiếm (Một cái gì đó giống như tra cứu, như một phép toán đặc biệt): O (n) (Tôi đoán vậy)

Hàng đợi / Deque / Hàng đợi hình tròn:

  • Chèn : O (1)
  • Loại bỏ : O (1)
  • Kích thước : O (1)

Cây tìm kiếm nhị phân:

  • Chèn, xóa và tìm kiếm : Trường hợp trung bình: O (log n) , Trường hợp xấu nhất: O (n)

Cây đỏ đen:

  • Chèn, xóa và tìm kiếm : Trường hợp trung bình: O (log n) , Trường hợp xấu nhất: O (log n)

Heap / PriorityQueue (tối thiểu / tối đa):

  • Tìm Min / Tìm Max : O (1)
  • Chèn : O (log n)
  • Xóa Tối thiểu / Xóa Tối đa : O (log n)
  • Trích xuất Min / Extract Max : O (log n)
  • Tra cứu, Xóa (nếu được cung cấp): O (n) , chúng tôi sẽ phải quét tất cả các phần tử vì chúng không được sắp xếp theo thứ tự như BST

HashMap / Hashtable / HashSet:

  • Chèn / Xóa : O (1) được khấu hao
  • Kích thước lại / băm : O (n)
  • Chứa : O (1)

3
Chèn một phần tử vào Mảng (và bằng cách chèn, tôi có nghĩa là thêm phần tử mới vào vị trí, dịch chuyển tất cả các phần tử sang phải) sẽ lấy O (n). Tương tự cho việc xóa. Chỉ thay thế phần tử tồn tại sẽ lấy O (n). Ngoài ra, có thể bạn đã trộn nó với việc thêm phần tử mới vào mảng có thể thay đổi kích thước (nó đã phân bổ theo thời gian O (1)).
Aivean

Cũng xin lưu ý rằng đối với danh sách được liên kết kép, việc chèn và xóa ở cả phần đầu và phần đuôi sẽ lấy O (1) (bạn chỉ đề cập đến phần đầu).
Aivean

Và lưu ý cuối cùng, cây tìm kiếm cân bằng (ví dụ, cây đỏ-đen thực sự được sử dụng cho TreeMap trong Java) đã đảm bảo thời gian trong trường hợp xấu nhất là O (ln n) cho tất cả các hoạt động.
Aivean

@Aivean: Tôi chỉ đang cố gắng liệt kê các hoạt động tiêu chuẩn cho cấu trúc dữ liệu tiêu chuẩn. Đối với Mảng: Dịch chuyển các phần tử trong khi thêm / xóa không phải là một thao tác chuẩn. Ngoài ra, việc thay thế phần tử hiện có sẽ lấy O (1) sử dụng chỉ mục, không phải O (n). Đối với danh sách được liên kết kép: Bạn nói đúng, tôi đang sửa chữa. Đối với Cây Đỏ-Đen: Một lần nữa, bạn đúng. Nhưng tôi chỉ liệt kê một BST, không cần cân đối. Vì vậy, tôi sẽ thêm mục mới cho Red-Black Trees. Cảm ơn những ý kiến ​​đóng góp!
Bhushan

1
@SuhailGupta: Độ phức tạp cho Set đã được đưa ra là điểm cuối cùng.
Bhushan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.