python bisect 二分查找 網易答題 牛牛選工作

python bisect使用,總結一下三條:

1. Python中的bisect用於操作排序的數組,比如你可以在向一個數組插入數據的同時進行排序。
2. 用來查找某值大於等於、小於等於、等於列表中元素位置下標。 解決牛牛找工作問題。
3. 實現查找,效率比較是:遞歸 < 二分查找 < bisect  ,另外 numpy.searchsorted搜索numpy.ndarray類型的元素是很快。
代碼如下:
1.
import bisect
import random
random.seed(1)
ls= []
r = random.randint(1, 100)
position = bisect.bisect_left(ls, r)   # 其目的在於查找該數值將會插入的位置並返回,而不會插入。

bisect.insort(ls, r)  # 在ls相應位置插入值r,可以不先bisect,但是調用bisect的方法,前提是ls已經是有序的了,會改變ls內容

# --------------------------------------------------------------------------------------------------------------------------

2.在python中使用字典,元素是(難易程度,薪資),然後根據難易程度排序,修改第i個人薪資爲排序後前i個人最大薪資值;
選取鍵中滿足find_le(a, x)的下標的值,就是某人已知難易程度,得到獲得的最大薪資值下標。根據下標就可以找到薪資了。完美的代替了java中的treemap
def index(a, x):
    'Locate the leftmost value exactly equal to x'
    i = bisect.bisect_left(a, x)
    if i != len(a) and a[i] == x:
        return i
    raise ValueError


def find_lt(a, x):
    'Find rightmost value less than x'
    i = bisect.bisect_left(a, x)
    if i:
        return a[i-1]
    raise ValueError


def find_le(a, x):
    'Find rightmost value less than or equal to x'
    i = bisect.bisect_right(a, x)
    if i:
        return a[i-1]
    raise ValueError


def find_gt(a, x):
    'Find leftmost value greater than x'
    i = bisect.bisect_right(a, x)
    if i != len(a):
        return a[i]
    raise ValueError


def find_ge(a, x):
    'Find leftmost item greater than or equal to x'
    i = bisect.bisect_left(a, x)
    if i != len(a):
        return a[i]

    raise ValueError

# -----------------------------------------------------------------

3. python 的列表(list)內部實現是一個數組,也就是一個線性表。在列表中查找元素可以使用 list.index() 方法,其時間複雜度爲O(n)。對於大數據量,則可以用二分查找進行優化。
# 我們可以用 bisect 模塊實現二分查找:
def binary_search_bisect(lst, x):
    from bisect import bisect_left
    i = bisect_left(lst, x)
    if i != len(lst) and lst[i] == x:
        return i
    return None
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章