2009-02-18 25 views
124

Tôi có thể dạy sớm "khóa học về sự cố Java". Mặc dù có thể giả định rằng các thành viên khán giả sẽ biết ký hiệu Big-O, có thể không an toàn để giả định rằng họ sẽ biết thứ tự của các hoạt động khác nhau trên các triển khai bộ sưu tập khác nhau là gì.Tóm tắt Big-O cho Bộ sưu tập Java Triển khai khung?

tôi có thể mất nhiều thời gian để tạo ra một ma trận tóm tắt bản thân mình, nhưng nếu nó đã ra khỏi đó trong phạm vi công cộng ở đâu đó, tôi chắc chắn muốn tái sử dụng nó (với tín dụng thích hợp, tất nhiên.)

Bất cứ ai cũng có bất kỳ con trỏ?

+1

Liệu [điểm chuẩn hiệu suất] này (https://github.com/ThreaT/Java-Collections-Benchmark) có được sử dụng không? – ThreaT

+0

Đây là một liên kết tôi thấy hữu ích khi thảo luận một số đối tượng Java rất phổ biến và chi phí hoạt động của chúng bằng cách sử dụng ký hiệu Big-O. http://objectissues.blogspot.com/2006/11/big-o-notation-and-java-constant-time.html – Nick

+0

Mặc dù không thuộc phạm vi công cộng, tuyệt vời [Java Generics and Collections] (http: // oreilly.com/catalog/9780596527754/) của Maurice Naftalin và Philip Wadler liệt kê các tổng quan về thông tin thời gian chạy trong các chương của nó trên các lớp sưu tập khác nhau. –

Trả lời

114

Trang web này khá tốt nhưng không cụ thể đối với Java: http://bigocheatsheet.com/ Here is an image in case this link won't work

+21

Và đây là lý do tại sao chúng tôi không sử dụng URL làm câu trả lời. Tài liệu/máy chủ đó, theo như tôi có thể nói, không còn có sẵn nữa! –

+1

@Ben J Links không còn hoạt động –

+0

Các liên kết lưu trữ web hiện cũng bị hỏng. – MikeFHay

11

Javadocs từ Sun cho mỗi lớp thu sẽ thường cho bạn biết chính xác những gì bạn muốn. HashMap, ví dụ:

thực hiện này cung cấp liên tục thời gian hiệu suất cho các thao tác cơ bản (get và put), giả định các hàm băm phân tán các yếu tố đúng trong xô. Lặp lại các khung nhìn bộ sưu tập yêu cầu tỷ lệ thời gian với "dung lượng" của thể hiện HashMap (số lượng nhóm) cộng với kích thước của nó (số ánh xạ khóa-giá trị).

TreeMap:

thực hiện này cung cấp đảm bảo log (n) thời gian chi phí cho containsKey, có được, đặt và gỡ bỏ các hoạt động.

TreeSet:

thực hiện này cung cấp chi phí đảm bảo log (n) thời gian cho các thao tác cơ bản (thêm, xóa và chứa).

(tôi nhấn mạnh)

+0

Tôi không đồng ý với phần HashMap. Tôi biết vị trí của Sun, nhưng ... lấy ví dụ phải gọi obj.equals (key), có thể là tuyến tính trong kích thước của các đối tượng chứa. Hãy xem xét rằng bạn thường phải đọc các trường cho so sánh này. Các ngoại lệ sẽ là số nguyên hoặc chuỗi (interned) ??? – Overflown

+0

Trước hết, nếu chúng sai, nó không phải là quá khó khăn cho bạn để tạo ra một trường hợp thử nghiệm mà disproves hiệu suất liên tục thời gian? Thứ hai, nếu bạn nhìn vào mã nguồn cho HashMap, nó không gọi bằng() đối với mỗi khóa trong bản đồ - chỉ khi các hashcodes bằng nhau. –

+4

Nếu bạn đọc báo giá ở trên, nó nói đó là hằng số thời gian "giả sử hàm băm phân tán các phần tử đúng trong số các nhóm". Từ lý thuyết CS, các bảng băm có các hoạt động thời gian không đổi khi hàm băm "tốt" (xảy ra trên trung bình), nhưng có thể mất thời gian tuyến tính trong trường hợp xấu nhất. – newacct

151

Cuốn sách Java Generics and Collections có thông tin này (trang: 188, 211, 222, 240).

Danh sách triển khai:

     get add contains next remove(0) iterator.remove 
ArrayList    O(1) O(1) O(n)  O(1) O(n)  O(n) 
LinkedList   O(n) O(1) O(n)  O(1) O(1)  O(1) 
CopyOnWrite-ArrayList O(1) O(n) O(n)  O(1) O(n)  O(n) 

Set triển khai:

     add  contains next  notes 
HashSet    O(1)  O(1)  O(h/n) h is the table capacity 
LinkedHashSet   O(1)  O(1)  O(1) 
CopyOnWriteArraySet O(n)  O(n)  O(1) 
EnumSet    O(1)  O(1)  O(1) 
TreeSet    O(log n) O(log n) O(log n) 
ConcurrentSkipListSet O(log n) O(log n) O(1) 

Bản đồ triển khai:

     get  containsKey next  Notes 
HashMap    O(1)  O(1)  O(h/n) h is the table capacity 
LinkedHashMap   O(1)  O(1)  O(1) 
IdentityHashMap  O(1)  O(1)  O(h/n) h is the table capacity 
EnumMap    O(1)  O(1)  O(1) 
TreeMap    O(log n) O(log n) O(log n) 
ConcurrentHashMap  O(1)  O(1)  O(h/n) h is the table capacity 
ConcurrentSkipListMap O(log n) O(log n) O(1) 

triển khai Queue:

     offer peek poll  size 
PriorityQueue   O(log n) O(1) O(log n) O(1) 
ConcurrentLinkedQueue O(1)  O(1) O(1)  O(n) 
ArrayBlockingQueue O(1)  O(1) O(1)  O(1) 
LinkedBlockingQueue O(1)  O(1) O(1)  O(1) 
PriorityBlockingQueue O(log n) O(1) O(log n) O(1) 
DelayQueue   O(log n) O(1) O(log n) O(1) 
LinkedList   O(1)  O(1) O(1)  O(1) 
ArrayDeque   O(1)  O(1) O(1)  O(1) 
LinkedBlockingDeque O(1)  O(1) O(1)  O(1) 

Đáy của javadoc cho gói java.util chứa một số liên kết tốt:

+1

Bạn phải xác định trường hợp nào là các số liệu đó, ví dụ: xóa khỏi Arraylist có thể lấy O (n), nếu bạn xóa phần tử ở giữa hoặc cuối mảng. – Popeye

6

Anh chàng ở trên đã so sánh cho HashMap/HashSet so với TreeMap/TreeSet.

tôi sẽ nói về ArrayList vs LinkedList:

ArrayList:

  • O (1) get()
  • khấu hao O (1) add()
  • nếu bạn chèn hoặc xóa một phần tử trong giữa sử dụng ListIterator.add() hoặc Iterator.remove(), sẽ là O (n) để dịch chuyển tất cả các phần tử sau

LinkedList:

  • O (n) get()
  • O (1) add()
  • nếu bạn chèn hoặc xóa một yếu tố ở giữa sử dụng ListIterator.add() hoặc Iterator.remove(), nó sẽ là O (1)
+1

'nếu bạn chèn hoặc xóa một phần tử ở giữa bằng cách sử dụng ListIterator.add() hoặc Iterator.remove(), nó sẽ là O (1)' tại sao? đầu tiên chúng ta cần tìm phần tử ở giữa, vậy tại sao nó không phải là O (n)? – MyTitle

+0

@MyTitle: đọc lại. "sử dụng' ListIterator.add() 'hoặc' Iterator.remove() '" Chúng ta có một trình lặp. – newacct

Các vấn đề liên quan