Có tích hợp tìm kiếm nhị phân trong python không?

Công cụ sau đây trực quan hóa những gì máy tính đang làm từng bước khi nó thực thi chương trình nói trên

Trình chỉnh sửa mã Python

Đóng góp mã và nhận xét của bạn thông qua Disqus

Trước. Nhà bài tập tìm kiếm và sắp xếp Python.
Tiếp theo. Viết chương trình Python để tìm kiếm tuần tự.

Mức độ khó của bài tập này là gì?

Dễ dàng trung bình khó

Kiểm tra kỹ năng Lập trình của bạn với bài kiểm tra của w3resource



con trăn. Lời khuyên trong ngày

Vòng lặp for và other

Đối với việc xây dựng khác đôi khi gây nhầm lẫn ngay cả những lập trình viên Python dày dặn nhất. Nhưng nó thực sự không phức tạp chút nào

Mệnh đề khác được thực thi sau khi vòng lặp for kết thúc. Có thể khó biết liệu vòng lặp có hoàn thành thành công hay không, đặc biệt nếu có câu lệnh ngắt trong vòng lặp. Tuyên bố khác ở đây đảm bảo với chúng tôi rằng vòng lặp đã chạy thành công trong suốt

for j in range[6]:
    print[j]
else:
    print["No"]

đầu ra

0
1
2
3
4
5
No

Vì vậy, nó có vẻ dư thừa do đó có sự nhầm lẫn nhưng hãy nhìn nhận nó theo cách này. Điều gì sẽ xảy ra nếu có một câu lệnh ngắt trong vòng lặp

Mô-đun này cung cấp hỗ trợ để duy trì danh sách theo thứ tự được sắp xếp mà không cần phải sắp xếp danh sách sau mỗi lần chèn. Đối với danh sách dài các mục có thao tác so sánh tốn kém, đây có thể là một cải tiến so với cách tiếp cận phổ biến hơn. Mô-đun này được gọi là

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
2 vì nó sử dụng thuật toán chia đôi cơ bản để thực hiện công việc của mình. Mã nguồn có thể hữu ích nhất như một ví dụ hoạt động của thuật toán [các điều kiện biên đã đúng. ]

Các chức năng sau đây được cung cấp

chia đôi. bisect_left[a , x, lo=0, hi=len[a], *, key=None]

Xác định vị trí điểm chèn cho x trong a để duy trì thứ tự đã sắp xếp. Các tham số lo và hi có thể được sử dụng để chỉ định một tập hợp con của danh sách cần được xem xét; . Nếu x đã có trong a, điểm chèn sẽ ở trước [ở bên trái] bất kỳ mục nhập hiện có nào. Giá trị trả về phù hợp để sử dụng làm tham số đầu tiên cho

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
3 giả sử rằng a đã được sắp xếp

Điểm chèn được trả về i chia mảng a thành hai nửa sao cho _______24 cho vế trái và _______25 cho vế phải

chỉ định một chức năng khóa của một đối số được sử dụng để trích xuất khóa so sánh từ mỗi phần tử trong mảng. Để hỗ trợ tìm kiếm các bản ghi phức tạp, hàm key không được áp dụng cho giá trị x.

Nếu khóa là

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
6, các phần tử được so sánh trực tiếp mà không cần gọi hàm can thiệp

Đã thay đổi trong phiên bản 3. 10. Đã thêm tham số chính.

chia đôi. bisect_right[a , x . , lo=0, hi=len[a], *, key=None]bisect.chia đôi[a , x, lo=0, hi=len[a], *, key=None]

Tương tự như

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
0, nhưng trả về một điểm chèn xuất hiện sau [ở bên phải] bất kỳ mục nhập hiện có nào của x trong một

Điểm chèn trả về i chia mảng a thành hai nửa sao cho

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
1 cho bên trái và
>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
2 cho bên phải

chỉ định một chức năng khóa của một đối số được sử dụng để trích xuất khóa so sánh từ mỗi phần tử trong mảng. Để hỗ trợ tìm kiếm các bản ghi phức tạp, hàm key không được áp dụng cho giá trị x.

Nếu khóa là

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
6, các phần tử được so sánh trực tiếp mà không cần gọi hàm can thiệp

Đã thay đổi trong phiên bản 3. 10. Đã thêm tham số chính.

chia đôi. insort_left[a , x, lo=0, hi=len[a], *, key=None]

Chèn x vào một thứ tự được sắp xếp

Đầu tiên, chức năng này chạy

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
0 để xác định vị trí điểm chèn. Tiếp theo, nó chạy phương thức
>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
5 trên a để chèn x vào vị trí thích hợp để duy trì thứ tự sắp xếp

Để hỗ trợ chèn bản ghi vào bảng, hàm khóa [nếu có] được áp dụng cho x cho bước tìm kiếm nhưng không áp dụng cho bước chèn

Hãy nhớ rằng tìm kiếm

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
6 bị chi phối bởi bước chèn chậm O[n]

Đã thay đổi trong phiên bản 3. 10. Đã thêm tham số chính.

chia đôi. insort_right[a , x . , lo=0, hi=len[a], *, key=None]bisect.sắp xếp[a , x, lo=0, hi=len[a], *, key=None]

Tương tự như

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
7, nhưng chèn x vào sau bất kỳ mục nhập hiện có nào của x

Đầu tiên, chức năng này chạy

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
8 để xác định vị trí điểm chèn. Tiếp theo, nó chạy phương thức
>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
5 trên a để chèn x vào vị trí thích hợp để duy trì thứ tự sắp xếp

Để hỗ trợ chèn bản ghi vào bảng, hàm khóa [nếu có] được áp dụng cho x cho bước tìm kiếm nhưng không áp dụng cho bước chèn

Hãy nhớ rằng tìm kiếm

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
6 bị chi phối bởi bước chèn chậm O[n]

Đã thay đổi trong phiên bản 3. 10. Đã thêm tham số chính.

Ghi chú hiệu suất¶

Khi viết mã nhạy cảm với thời gian bằng cách sử dụng bisect[] và insort[], hãy ghi nhớ những suy nghĩ này

  • Chia đôi có hiệu quả để tìm kiếm phạm vi giá trị. Để định vị các giá trị cụ thể, từ điển hiệu quả hơn

  • Các hàm insort[] là

    0
    1
    2
    3
    4
    5
    No
    21 vì bước tìm kiếm logarit bị chi phối bởi bước chèn thời gian tuyến tính

  • Các chức năng tìm kiếm là không trạng thái và loại bỏ các kết quả của chức năng chính sau khi chúng được sử dụng. Do đó, nếu các hàm tìm kiếm được sử dụng trong một vòng lặp, thì hàm chính có thể được gọi đi gọi lại trên cùng một phần tử mảng. Nếu chức năng chính không nhanh, hãy xem xét gói nó bằng

    0
    1
    2
    3
    4
    5
    No
    22 để tránh tính toán trùng lặp. Ngoài ra, hãy xem xét việc tìm kiếm một dãy các khóa được tính toán trước để định vị điểm chèn [như minh họa trong phần ví dụ bên dưới]

Xem thêm

  • Bộ sưu tập được sắp xếp là một mô-đun hiệu suất cao sử dụng chia đôi cho các bộ sưu tập dữ liệu được sắp xếp được quản lý

  • Công thức SortedCollection sử dụng bisect để xây dựng một lớp bộ sưu tập đầy đủ tính năng với các phương thức tìm kiếm đơn giản và hỗ trợ cho hàm khóa. Các phím được tính toán trước để lưu các cuộc gọi không cần thiết đến chức năng của phím trong quá trình tìm kiếm

Tìm kiếm danh sách được sắp xếp¶

Các hàm

0
1
2
3
4
5
No
23 ở trên rất hữu ích để tìm các điểm chèn nhưng có thể phức tạp hoặc khó sử dụng cho các tác vụ tìm kiếm thông thường. Năm chức năng sau đây cho thấy cách chuyển đổi chúng thành tra cứu tiêu chuẩn cho danh sách được sắp xếp

0
1
2
3
4
5
No
5

Ví dụ¶

Hàm

0
1
2
3
4
5
No
23 có thể hữu ích cho việc tra cứu bảng số. Ví dụ này sử dụng
0
1
2
3
4
5
No
23 để tra cứu điểm chữ cái cho điểm bài kiểm tra [giả sử] dựa trên một tập hợp các điểm ngắt số theo thứ tự. 90 trở lên là 'A', 80 đến 89 là 'B', v.v.

>>> def grade[score, breakpoints=[60, 70, 80, 90], grades='FDCBA']:
..     i = bisect[breakpoints, score]
..     return grades[i]
...
>>> [grade[score] for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']

Các hàm

0
1
2
3
4
5
No
23 và
0
1
2
3
4
5
No
27 cũng hoạt động với danh sách các bộ dữ liệu. Đối số chính có thể dùng để trích xuất trường được sử dụng để sắp xếp thứ tự các bản ghi trong bảng

0
1
2
3
4
5
No
2

Nếu chức năng khóa đắt tiền, có thể tránh các cuộc gọi chức năng lặp lại bằng cách tìm kiếm danh sách các khóa được tính toán trước để tìm chỉ mục của bản ghi

Tìm kiếm nhị phân được thực hiện như thế nào trong Python?

Cách hoạt động của tìm kiếm nhị phân – Chia để trị .
Thuật toán chia danh sách thành hai phần. bên trái và bên phải, được phân tách bằng phần tử ở giữa
Nó tạo một biến để lưu trữ giá trị của mục cần tìm kiếm
Nó chọn ra phần tử ở giữa và so sánh nó với phần tử cần tìm

Hai chức năng tìm kiếm nhị phân Python có sẵn là gì?

Ghi chú. Python có hai cấu trúc dữ liệu tích hợp, cụ thể là set và dict , dựa vào hàm băm để tìm các phần tử.

Chủ Đề