Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Bisect - อัลกอริธึมการแบ่งส่วนอาร์เรย์ใน Python


การดำเนินการเรียงลำดับหลังจากการแทรกทุกครั้งในรายการแบบยาวอาจมีราคาแพงในแง่ของเวลาที่ตัวประมวลผลใช้ไป โมดูลแบบแบ่งครึ่งช่วยให้มั่นใจได้ว่ารายการจะถูกจัดเรียงโดยอัตโนมัติหลังจากการแทรก เพื่อจุดประสงค์นี้ มันใช้อัลกอริธึมแบบสองส่วน โมดูลนี้มีฟังก์ชันดังต่อไปนี้:

bisect_left()

วิธีนี้จะระบุตำแหน่งจุดแทรกสำหรับองค์ประกอบที่กำหนดในรายการเพื่อรักษาลำดับการจัดเรียง หากมีอยู่แล้วในรายการ จุดแทรกจะอยู่ก่อน (ทางด้านซ้ายของ) รายการที่มีอยู่ ค่าที่ส่งคืนสามารถใช้เป็นพารามิเตอร์แรกในการ list.insert()

bisect_right()

เมธอดนี้คล้ายกับ bisect_left() แต่ส่งคืนจุดแทรกที่อยู่หลัง (ทางด้านขวาของ) รายการที่มีอยู่ของ x ใน a

bisect.insort_left()

วิธีนี้จะแทรกค่าที่กำหนดในลำดับที่เรียงลำดับ ซึ่งเทียบเท่ากับ a.insert(bisect.bisect_left(a, x, lo, hi), x)

bisect.insort_right()

bisect.insort()

วิธีการทั้งสองจะคล้ายกับ insort_left() แต่การแทรกค่าที่กำหนดในรายการหลังจากรายการที่มีอยู่ของค่าเดียวกัน

ตัวอย่าง

>>> nums = [45,21,34,87,56,12,5,98,30,63]
>>> nums.sort()
>>> nums
[5, 12, 21, 30, 34, 45, 56, 63, 87, 98]
>>> import bisect
>>> p = bisect.bisect_left(nums,50)
>>> p
6
>>> nums.insert(p,50)
>>> nums
[5, 12, 21, 30, 34, 45, 50, 56, 63, 87, 98]
>>> bisect.insort(nums, 29)
>>> nums
[5, 12, 21, 29, 30, 34, 45, 50, 56, 63, 87, 98]