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 Show 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. 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àyVò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. 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
Xem thêm
Tìm kiếm danh sách được sắp xếp¶Các hàm 0 1 2 3 4 5 No23 ở 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 No5 Ví dụ¶Hàm 0 1 2 3 4 5 No23 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 No23 để 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 No23 và 0 1 2 3 4 5 No27 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 No2 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ử. |