ที่จริงฉันเขียนโพสต์บล็อกในหัวข้อ 2 เดือนที่ผ่านมา บทความนี้ใช้สำหรับ C # List<T>
แต่ Java ArrayList
มีการใช้งานที่คล้ายกันมาก เนื่องจากArrayList
มีการใช้งานโดยใช้อาร์เรย์แบบไดนามิกจึงเพิ่มขนาดตามความต้องการ ดังนั้นเหตุผลสำหรับตัวสร้างกำลังการผลิตเพื่อวัตถุประสงค์ในการเพิ่มประสิทธิภาพ
เมื่อหนึ่งในการดำเนินการปรับขนาดเหล่านี้เกิดขึ้น ArrayList จะคัดลอกเนื้อหาของอาร์เรย์ลงในอาร์เรย์ใหม่ที่มีความจุเป็นสองเท่าของอาร์เรย์เก่า การดำเนินการนี้วิ่งในO (n)เวลา
ตัวอย่าง
นี่คือตัวอย่างของการArrayList
เพิ่มขนาด:
10
16
25
38
58
... 17 resizes ...
198578
297868
446803
670205
1005308
ดังนั้นรายการเริ่มต้นที่มีความจุ10
เมื่อรายการที่ 11 จะมีการเพิ่มมันคือการเพิ่มขึ้นโดยการ50% + 1
16
ในรายการที่ 17 ArrayList
จะเพิ่มขึ้นอีกครั้งเพื่อ25
ๆ 1000000
ตอนนี้พิจารณาตัวอย่างที่เรากำลังสร้างรายการที่มีความจุที่ต้องการเป็นที่รู้จักกันอยู่แล้วเป็น การสร้างตัวสร้างแบบArrayList
ไม่มีขนาดจะเรียกArrayList.add
1000000
เวลาที่ใช้O (1)ตามปกติหรือO (n)ในการปรับขนาด
1000000 + 16 + 25 + ... + 670205 + 1005308 = 4015851
เปรียบเทียบนี้ใช้สร้างแล้วโทรArrayList.add
ซึ่งรับประกันได้ว่าจะทำงานในO (1)
1000000 + 1000000 = 2000000 การดำเนินการ
Java เทียบกับ C #
Java เป็นข้างต้นเริ่มต้นที่ 10
50% + 1
และเพิ่มขึ้นในแต่ละที่ปรับขนาด C # เริ่มต้น4
และเพิ่มขึ้นอย่างก้าวร้าวมากขึ้นเป็นสองเท่าในการปรับขนาดแต่ละครั้ง 1000000
เพิ่มตัวอย่างจากข้างต้นสำหรับ C # ใช้3097084
การดำเนินงาน
อ้างอิง