Python中的二等分算法函数
Bisect 算法的目的是在列表中找到需要插入元素以保持列表排序的位置。
Python在其定义中提供了使用模块“ bisect ”的 bisect 算法,该模块允许在插入每个元素后保持列表的排序顺序。这是必不可少的,因为这减少了在插入每个元素后一次又一次地对列表进行排序所需的开销时间。
重要的二分函数
1. bisect(list, num, beg, end) :- 该函数返回排序列表中的位置,传入参数的数字可以放置在哪里,以保持结果列表的排序顺序。如果元素已经存在于列表中,则返回必须插入元素的最右边的位置。此函数有 4 个参数,必须使用的列表、要插入的数字、要考虑的列表中的起始位置、必须考虑的结束位置。
2. bisect_left(list, num, beg, end) :- 该函数返回排序列表中的位置,传入参数的数字可以放置在哪里,以保持结果列表的排序顺序。如果元素已经存在于列表中,则返回必须插入元素的最左侧位置。此函数有 4 个参数,必须使用的列表、要插入的数字、要考虑的列表中的起始位置、必须考虑的结束位置。
3. bisect_right(list, num, beg, end) :- 这个函数的作用类似于上面提到的“ bisect() ”。
# Python code to demonstrate the working of
# bisect(), bisect_left() and bisect_right()
# importing "bisect" for bisection operations
import bisect
# initializing list
li = [1, 3, 4, 4, 4, 6, 7]
# using bisect() to find index to insert new element
# returns 5 ( right most possible index )
print ("The rightmost index to insert, so list remains sorted is : ", end="")
print (bisect.bisect(li, 4))
# using bisect_left() to find index to insert new element
# returns 2 ( left most possible index )
print ("The leftmost index to insert, so list remains sorted is : ", end="")
print (bisect.bisect_left(li, 4))
# using bisect_right() to find index to insert new element
# returns 4 ( right most possible index )
print ("The rightmost index to insert, so list remains sorted is : ", end="")
print (bisect.bisect_right(li, 4, 0, 4))
输出:
The rightmost index to insert, so list remains sorted is : 5
The leftmost index to insert, so list remains sorted is : 2
The rightmost index to insert, so list remains sorted is : 4
时间复杂度:
O(log(n)) -> Bisect method works on the concept of binary search
4. insort(list, num, beg, end) :- 该函数在适当的位置插入数字后返回排序后的列表,如果元素已经存在于列表中,则将元素插入到最右边的可能位置。此函数有 4 个参数,必须使用的列表、要插入的数字、要考虑的列表中的起始位置、必须考虑的结束位置。
5. insort_left(list, num, beg, end) :- 该函数在适当的位置插入数字后返回排序后的列表,如果元素已经存在于列表中,则将元素插入到最左边的可能位置。此函数有 4 个参数,必须使用的列表、要插入的数字、要考虑的列表中的起始位置、必须考虑的结束位置。
6. insort_right(list, num, beg, end) :- 这个函数的作用类似于上面提到的“insort()”。
# Python code to demonstrate the working of
# insort(), insort_left() and insort_right()
# importing "bisect" for bisection operations
import bisect
# initializing list
li1 = [1, 3, 4, 4, 4, 6, 7]
# initializing list
li2 = [1, 3, 4, 4, 4, 6, 7]
# initializing list
li3 = [1, 3, 4, 4, 4, 6, 7]
# using insort() to insert 5 at appropriate position
# inserts at 6th position
bisect.insort(li1, 5)
print ("The list after inserting new element using insort() is : ")
for i in range(0, 7):
print(li1[i], end=" ")
# using insort_left() to insert 5 at appropriate position
# inserts at 6th position
bisect.insort_left(li2, 5)
print("\r")
print ("The list after inserting new element using insort_left() is : ")
for i in range(0, 7):
print(li2[i], end=" ")
print("\r")
# using insort_right() to insert 5 at appropriate position
# inserts at 5th position
bisect.insort_right(li3, 5, 0, 4)
print ("The list after inserting new element using insort_right() is : ")
for i in range(0, 7):
print(li3[i], end=" ")
输出:
The list after inserting new element using insort() is :
1 3 4 4 4 5 6
The list after inserting new element using insort_left() is :
1 3 4 4 4 5 6
The list after inserting new element using insort_right() is :
1 3 4 4 5 4 6
时间复杂度:
O(n) -> Inserting an element in sorted array requires traversal