สรุป Big-O สำหรับการใช้งาน Java Collections Framework? [ปิด]


164

ฉันอาจกำลังสอน "Java crash-course" ในไม่ช้า ในขณะที่มันอาจจะปลอดภัยที่จะสมมติว่าสมาชิกผู้ชมจะได้รู้จักสัญลักษณ์ Big-O แต่ก็อาจไม่ปลอดภัยที่จะสมมติว่าพวกเขาจะรู้ว่าลำดับของการดำเนินการต่างๆในการใช้งานคอลเลกชันต่างๆคืออะไร

ฉันอาจต้องใช้เวลาในการสร้างเมทริกซ์สรุปด้วยตนเอง แต่ถ้ามันมีอยู่แล้วในโดเมนสาธารณะที่ไหนสักแห่งฉันก็อยากจะนำมันกลับมาใช้ใหม่ (ด้วยเครดิตที่เหมาะสมแน่นอน)

ใครมีพอยน์เตอร์บ้าง?


นี่คือลิงค์ที่ฉันพบว่ามีประโยชน์เมื่อพูดคุยเกี่ยวกับออบเจ็กต์ Java ทั่วไปและค่าใช้จ่ายในการดำเนินการโดยใช้สัญกรณ์ Big-O objectissues.blogspot.com/2006/11/…
Nick

แม้ว่าจะไม่ได้อยู่ในโดเมนสาธารณะ แต่Java Generics and Collections ที่ยอดเยี่ยมโดย Maurice Naftalin และ Philip Wadler จะแสดงรายการภาพรวมข้อมูลรันไทม์ในบทของมันในคลาสการเก็บรวบรวมที่แตกต่างกัน
Fabian Steeg

1
มาตรฐานประสิทธิภาพการทำงานนี้จะเป็นประโยชน์หรือไม่?
ThreaT

คำตอบ:


149

เว็บไซต์นี้ค่อนข้างดี แต่ไม่เฉพาะกับ Java: http://bigocheatsheet.com/ นี่คือรูปภาพในกรณีที่ลิงก์นี้ใช้งานไม่ได้


27
และนี่คือเหตุผลที่เราไม่ใช้ URL เป็นคำตอบ ไม่สามารถใช้เอกสาร / เซิร์ฟเวอร์นั้นได้อีกต่อไป!
Jason Mock

1
@Ben J Links ไม่ทำงานอีกต่อไป
Vikas V

ลิงก์ที่เก็บถาวรบนเว็บก็ใช้งานไม่ได้เช่นกัน
MikeFHay

ดูเหมือนว่าจะเพิ่ม URL ทำงานใหม่ ขอบคุณสำหรับความพยายามมันมีประโยชน์มาก
Tejas C

1
@AndreaZilio LinkedList.remove (Object) เป็นเวลาคงที่โดยสมมติว่าคุณรู้จักเพื่อนบ้านอยู่แล้ว หากคุณไม่รู้จักเพื่อนบ้านมันถึงเวลาที่จะหามันก่อน
Paul Evans

217

หนังสือJava Generics และ Collectionsมีข้อมูลนี้ (หน้า: 188, 211, 222, 240)

การใช้งานรายการ:

                      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)

ชุดการใช้งาน:

                      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)

การใช้งานแผนที่:

                      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)

การใช้งานคิว:

                      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)

ด้านล่างของ javadoc สำหรับแพ็คเกจjava.utilมีลิงค์ที่ดี:


3
คุณต้องระบุว่าสถานการณ์กรณีใดเป็นตัวเลขเหล่านั้นตัวอย่างเช่นการลบออกจาก Arraylist อาจใช้ O (n) หากคุณลบองค์ประกอบที่อยู่ตรงกลางหรือตอนท้ายของอาร์เรย์
Popeye

@ popeye ไม่ใช่ O เป็นกรณีที่แย่ที่สุด?
Yassin Hajaj

ตามที่ระบุไว้โดย @Popeye ควรมีคำอธิบายที่ชัดเจนเกี่ยวกับกรณีที่คำตอบนั้นเกี่ยวกับ กรณีอาจเป็นค่าเฉลี่ย / แย่ที่สุดสำหรับความซับซ้อนของเวลา ดูเหมือนว่าคำตอบจะอ้างอิงถึงกรณี "เฉลี่ย" สำหรับ DS ทั้งหมด
Yashwin Munsadwala

12

Javadocs จาก Sun สำหรับแต่ละคลาสคอลเลคชันจะบอกคุณอย่างชัดเจนว่าคุณต้องการอะไร HashMapตัวอย่างเช่น:

การใช้งานนี้ให้ประสิทธิภาพเวลาคงที่สำหรับการดำเนินงานขั้นพื้นฐาน (รับและวาง) โดยสมมติว่าฟังก์ชันแฮชกระจายองค์ประกอบอย่างเหมาะสมระหว่างถัง การวนซ้ำในมุมมองคอลเล็กชันต้องใช้เวลาตามสัดส่วนกับ "ความจุ" ของอินสแตนซ์ HashMap (จำนวนที่เก็บข้อมูล) บวกกับขนาด (จำนวนการแม็พคีย์ - ค่า)

แผนผังเว็บไซต์ :

การใช้งานนี้มีการรับประกันค่าใช้จ่ายบันทึกเวลา (n) เวลาสำหรับการดำเนินการ containKey, รับ, ใส่และลบ

ชุดต้นไม้ :

การใช้งานนี้มีการรับประกันต้นทุนการบันทึกเวลา (n) เวลาสำหรับการดำเนินการขั้นพื้นฐาน (เพิ่มลบและมี)

(เน้นที่เหมือง)


ฉันไม่เห็นด้วยกับส่วน HashMap ฉันรู้ว่าตำแหน่งของซัน แต่ ... ตัวอย่างเช่นต้องเรียก obj.equals (คีย์) ซึ่งอาจเป็นเส้นตรงตามขนาดของวัตถุที่มี พิจารณาว่าโดยปกติคุณจะต้องอ่านฟิลด์สำหรับการเปรียบเทียบนี้ ข้อยกเว้นจะเป็นจำนวนเต็มหรือสตริง (ฝึกงาน) ???
overflown

ก่อนอื่นถ้าพวกเขาผิดมันไม่ควรยากเกินไปสำหรับคุณที่จะสร้างกรณีทดสอบที่หักล้างการแสดงเวลาคงที่? ประการที่สองถ้าคุณดูซอร์สโค้ดสำหรับ HashMap มันจะไม่เรียกเท่ากับ () เทียบกับแต่ละคีย์ในแผนที่ - เฉพาะเมื่อ hashcodes เท่ากัน
matt b

5
หากคุณอ่านคำพูดข้างต้นก็บอกว่ามันเป็นเวลาคงที่ "สมมติว่าฟังก์ชั่นแฮชกระจายองค์ประกอบอย่างถูกต้องในถัง" จากทฤษฎี CS ตารางแฮชมีการดำเนินการเวลาคงที่เมื่อฟังก์ชันแฮช "ดี" (ซึ่งเกิดขึ้นโดยเฉลี่ย) แต่อาจใช้เวลาเชิงเส้นในกรณีที่เลวร้ายที่สุด
newacct

4
@Overflown - ในทางเทคนิคมันไม่สำคัญว่า obj.equals () จะใช้เวลานานแค่ไหนจากมุมมองที่ซับซ้อนเนื่องจากเป็นเพียงส่วนหนึ่งของ "ค่าคงที่" ที่สัมพันธ์กับจำนวนรายการในคอลเลกชัน
mikera

6

คนที่แต่งตัวประหลาดข้างต้นให้การเปรียบเทียบสำหรับ HashMap / HashSet กับ TreeMap / TreeSet

ฉันจะพูดเกี่ยวกับ ArrayList กับ LinkedList:

ArrayList:

  • O (1) get()
  • ค่าตัดจำหน่าย O (1) add()
  • หากคุณแทรกหรือลบองค์ประกอบที่อยู่ตรงกลางโดยใช้ListIterator.add()หรือIterator.remove()จะเป็น O (n) เพื่อเลื่อนองค์ประกอบต่อไปนี้ทั้งหมด

LinkedList:

  • บน) get()
  • O (1) add()
  • หากคุณแทรกหรือลบองค์ประกอบที่อยู่ตรงกลางโดยใช้ListIterator.add()หรือIterator.remove()จะเป็น O (1)

1
if you insert or delete an element in the middle using ListIterator.add() or Iterator.remove(), it will be O(1) ทำไม? ก่อนอื่นเราต้องหาองค์ประกอบตรงกลางแล้วทำไมมันไม่ใช่ O (n)?
MyTitle

@ MyTitle: อ่านอีกครั้ง "ใช้ListIterator.add()หรือIterator.remove()" เรามีตัววนซ้ำ
newacct
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.