ความซับซ้อนของเวลาของโครงสร้างข้อมูลต่างๆคืออะไร?


87

ฉันกำลังพยายามแสดงรายการความซับซ้อนของเวลาในการดำเนินการของโครงสร้างข้อมูลทั่วไปเช่น Arrays, Binary Search Tree, Heap, Linked List เป็นต้นและโดยเฉพาะอย่างยิ่งฉันหมายถึง Java เป็นเรื่องธรรมดามาก แต่ฉันเดาว่าพวกเราบางคนไม่มั่นใจ 100% เกี่ยวกับคำตอบที่แน่นอน ความช่วยเหลือใด ๆ โดยเฉพาะการอ้างอิงจะได้รับการชื่นชมอย่างมาก

เช่นสำหรับรายการที่เชื่อมโยงแบบเดี่ยว: การเปลี่ยนองค์ประกอบภายในคือ O (1) คุณทำได้อย่างไร? คุณต้องค้นหาองค์ประกอบก่อนที่จะเปลี่ยนแปลง นอกจากนี้สำหรับ Vector การเพิ่มองค์ประกอบภายในจะได้รับเป็น O (n) แต่ทำไมเราไม่สามารถตัดจำหน่ายในเวลาคงที่โดยใช้ดัชนีได้? โปรดแก้ไขฉันหากฉันขาดอะไรไป

ฉันกำลังโพสต์สิ่งที่ค้นพบ / การคาดเดาเป็นคำตอบแรก


2
ความซับซ้อนของเวลาและอวกาศสำหรับโครงสร้างข้อมูลทั้งหมดBig O cheat sheet
Vbp

1
ในกรณีที่มีคนอื่นเข้ามาตรวจสอบลิงก์นี้ด้วย: infotechgems.blogspot.gr/2011/11/…
vefthym

คำตอบ:


246

อาร์เรย์

  • ตั้งค่าตรวจสอบองค์ประกอบที่ดัชนีเฉพาะ: O (1)
  • การค้นหา : O (n)ถ้าอาร์เรย์ไม่ถูกเรียงลำดับและO (log n)ถ้าอาร์เรย์ถูกจัดเรียงและใช้บางอย่างเช่นการค้นหาแบบไบนารี
  • ตามที่ระบุไว้โดยAiveanไม่มีDeleteการดำเนินการใดๆ ใน Arrays เราสามารถลบองค์ประกอบในเชิงสัญลักษณ์ได้โดยตั้งค่าเป็นค่าเฉพาะบางอย่างเช่น -1, 0 เป็นต้นขึ้นอยู่กับความต้องการของเรา
  • ในทำนองเดียวกันInsertสำหรับอาร์เรย์นั้นโดยพื้นฐานแล้วSetตามที่กล่าวไว้ในตอนต้น

ArrayList:

  • เพิ่ม : ตัดจำหน่าย O (1)
  • ลบ : O (n)
  • ประกอบด้วย : O (n)
  • ขนาด : O (1)

รายการที่เชื่อมโยง:

  • การแทรก : O (1)ถ้าทำที่หัว O (n)ถ้าที่อื่นเนื่องจากเราต้องไปถึงตำแหน่งนั้นโดยการเดินทางไปยังรายการที่เชื่อมโยงเป็นเส้นตรง
  • การลบ : O (1)ถ้าทำที่หัว O (n)ถ้าที่อื่นเนื่องจากเราต้องไปถึงตำแหน่งนั้นโดยการเดินทางไปยังรายการที่เชื่อมโยงแบบเชิงเส้น
  • ค้นหา : O (n)

รายการที่เชื่อมโยงแบบทวีคูณ:

  • การแทรก : O (1)ถ้าทำที่หัวหรือท้ายO (n)ถ้าที่อื่นเนื่องจากเราต้องไปถึงตำแหน่งนั้นโดยการเลื่อนรายการที่เชื่อมโยงเป็นเส้นตรง
  • การลบ : O (1)ถ้าทำที่หัวหรือท้ายO (n)ถ้าที่อื่นเนื่องจากเราต้องไปถึงตำแหน่งนั้นโดยการเดินทางไปยังรายการที่เชื่อมโยงแบบเชิงเส้น
  • ค้นหา : O (n)

ซ้อนกัน:

  • กด : O (1)
  • ป๊อป : O (1)
  • ด้านบน : O (1)
  • การค้นหา (บางอย่างเช่นการค้นหาเป็นการดำเนินการพิเศษ): O (n) (ฉันเดาอย่างนั้น)

คิว / Deque / Circular Queue:

  • แทรก : O (1)
  • ลบ : O (1)
  • ขนาด : O (1)

ต้นไม้ค้นหาแบบไบนารี:

  • แทรกลบและค้นหา : กรณีเฉลี่ย: O (บันทึก n)กรณีที่เลวร้ายที่สุด: O (n)

ต้นไม้สีแดง - ดำ:

  • แทรกลบและค้นหา : กรณีเฉลี่ย: O (บันทึก n)กรณีที่เลวร้ายที่สุด: O (บันทึก n)

Heap / PriorityQueue (ต่ำสุด / สูงสุด):

  • ค้นหาต่ำสุด / ค้นหาสูงสุด : O (1)
  • แทรก : O (บันทึก n)
  • ลบต่ำสุด / ลบสูงสุด : O (บันทึก n)
  • ดึงข้อมูล Min / Extract Max : O (log n)
  • ค้นหาลบ (ถ้ามีให้): O (n)เราจะต้องสแกนองค์ประกอบทั้งหมดเนื่องจากไม่ได้เรียงลำดับเหมือน BST

HashMap / Hashtable / HashSet:

  • แทรก / ลบ : O (1)ตัดจำหน่าย
  • Re-size / แฮช : O (n)
  • ประกอบด้วย : O (1)

3
การแทรกองค์ประกอบลงใน Array (และโดยการแทรกฉันหมายถึงการเพิ่มองค์ประกอบใหม่ลงในตำแหน่งการเลื่อนองค์ประกอบทั้งหมดไปทางขวา) จะใช้ O (n) เหมือนกันสำหรับการลบ การแทนที่องค์ประกอบที่มีอยู่เท่านั้นที่จะใช้ O (n) นอกจากนี้ยังเป็นไปได้ว่าคุณผสมกับการเพิ่มองค์ประกอบใหม่ให้กับอาร์เรย์ที่ปรับขนาดได้ (มีการตัดจำหน่าย O (1) ครั้ง)
Aivean

นอกจากนี้โปรดทราบว่าสำหรับการแทรกและการลบรายการที่เชื่อมโยงเป็นทวีคูณทั้งส่วนหัวและส่วนท้ายจะใช้ O (1) (คุณกล่าวถึงเฉพาะส่วนหัว)
Aivean

และบันทึกสุดท้ายแผนภูมิการค้นหาที่สมดุล (ตัวอย่างเช่นต้นไม้สีแดง - ดำที่ใช้จริงสำหรับ TreeMap ใน Java) ได้รับประกันเวลา O (ln n) ที่เลวร้ายที่สุดสำหรับการดำเนินการทั้งหมด
Aivean

@Aivean: ฉันแค่พยายามแสดงรายการการดำเนินการมาตรฐานสำหรับโครงสร้างข้อมูลมาตรฐาน สำหรับอาร์เรย์: การเปลี่ยนองค์ประกอบในขณะที่เพิ่ม / ลบไม่ใช่การดำเนินการมาตรฐาน นอกจากนี้การแทนที่องค์ประกอบที่มีอยู่จะใช้ O (1) โดยใช้ดัชนีไม่ใช่ O (n) สำหรับรายการที่เชื่อมโยงแบบทวีคูณ: คุณพูดถูกฉันกำลังทำการแก้ไข สำหรับต้นไม้แดง - ดำ: อีกครั้งคุณพูดถูก แต่ฉันได้ระบุเพียง BST ซึ่งไม่จำเป็นต้องมีความสมดุล ดังนั้นฉันจะเพิ่มรายการใหม่สำหรับต้นไม้แดง - ดำ ขอบคุณสำหรับความคิดเห็น!
Bhushan

1
@SuhailGupta: ความซับซ้อนของ Set ถูกกำหนดให้เป็นจุดสุดท้ายแล้ว
Bhushan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.