Mô tả dự án
Chương trình Python để trực quan hóa hành vi của tìm kiếm nhị phân upper_bound và Lower_bound
Giới hạn trên Giới hạn dướiTìm kiếm nhị phân trực quan Giới hạn trên Giới hạn dưới_______0int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = 0, r = array.size[] - 1; while [l fruits = ['orange', 'plum', 'banana', 'apple'] >>> fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list0
>>> fruits = ['orange', 'plum', 'banana', 'apple']
>>> fruits.index['banana']
2
>>> fruits.index['blueberry']
Traceback [most recent call last]:
File "", line 1, in
ValueError: 'blueberry' is not in list
1Một sẽ chứa danh sách các tên có được bằng cách cắt bỏ cột thứ hai khỏi tệp TSV gốc
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = 0, r = array.size[] - 1; while [l >> fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list2 trên chuỗi kết quả sẽ xóa ký tự dòng mới ở cuối mỗi dòng. Thay vào đó, bạn có thể gọi
>>> fruits = ['orange', 'plum', 'banana', 'apple']
>>> fruits.index['banana']
2
>>> fruits.index['blueberry']
Traceback [most recent call last]:
File "", line 1, in
ValueError: 'blueberry' is not in list
3, nhưng điều đó sẽ giữ lại các dòng mới không mong muốnĐo thời gian thực hiện
Để đánh giá hiệu suất của một thuật toán cụ thể, bạn có thể đo thời gian thực hiện của thuật toán đó dựa trên bộ dữ liệu IMDb. Điều này thường được thực hiện với sự trợ giúp của các mô-đun
>>> fruits = ['orange', 'plum', 'banana', 'apple']
>>> fruits.index['banana']
2
>>> fruits.index['blueberry']
Traceback [most recent call last]:
File "", line 1, in
ValueError: 'blueberry' is not in list
4 hoặc >>> fruits = ['orange', 'plum', 'banana', 'apple']
>>> fruits.index['banana']
2
>>> fruits.index['blueberry']
Traceback [most recent call last]:
File "", line 1, in
ValueError: 'blueberry' is not in list
5 tích hợp sẵn, rất hữu ích để định thời gian cho một khối mãBạn cũng có thể xác định một trình trang trí tùy chỉnh để tính thời gian cho một chức năng nếu bạn muốn. Mã mẫu được cung cấp sử dụng
>>> fruits = ['orange', 'plum', 'banana', 'apple']
>>> fruits.index['banana']
2
>>> fruits.index['blueberry']
Traceback [most recent call last]:
File "", line 1, in
ValueError: 'blueberry' is not in list
6, được giới thiệu trong Python 3. 7, vì nó mang lại độ chính xác cao tính bằng nano giâyHiểu các thuật toán tìm kiếm
Tìm kiếm là phổ biến và nằm ở trung tâm của khoa học máy tính. Bạn có thể đã thực hiện một số tìm kiếm trên web ngày hôm nay, nhưng bạn đã bao giờ tự hỏi tìm kiếm thực sự có nghĩa là gì chưa?
Các thuật toán tìm kiếm có nhiều dạng khác nhau. Ví dụ, bạn có thể
- Thực hiện tìm kiếm toàn văn
- Kết hợp các chuỗi với tìm kiếm mờ
- Tìm đường đi ngắn nhất trong đồ thị
- Truy vấn cơ sở dữ liệu
- Tìm giá trị nhỏ nhất hoặc lớn nhất
Trong hướng dẫn này, bạn sẽ tìm hiểu về cách tìm kiếm một phần tử trong danh sách các mục được sắp xếp, chẳng hạn như danh bạ điện thoại. Khi bạn tìm kiếm một yếu tố như vậy, bạn có thể hỏi một trong những câu hỏi sau
Câu hỏi Trả lời Có ở đó không? Có Nó ở đâu? Ở trang thứ 42. Đó là ai? Một người tên là John Doe
Câu trả lời cho câu hỏi đầu tiên cho bạn biết liệu một phần tử có trong bộ sưu tập hay không. Nó luôn đúng hoặc sai. Câu trả lời thứ hai là vị trí của một phần tử trong bộ sưu tập, có thể không khả dụng nếu phần tử đó bị thiếu. Cuối cùng, câu trả lời thứ ba là chính yếu tố đó hoặc thiếu yếu tố đó
Ghi chú. Đôi khi có thể có nhiều hơn một câu trả lời đúng do các mục trùng lặp hoặc tương tự. Ví dụ: nếu bạn có một vài địa chỉ liên hệ có cùng tên thì tất cả chúng sẽ phù hợp với tiêu chí tìm kiếm của bạn. Vào những thời điểm khác, có thể chỉ có một câu trả lời gần đúng hoặc không có câu trả lời nào cả
Trong trường hợp phổ biến nhất, bạn sẽ tìm kiếm theo giá trị, so sánh các phần tử trong bộ sưu tập với phần tử chính xác mà bạn cung cấp làm tham chiếu. Nói cách khác, tiêu chí tìm kiếm của bạn là toàn bộ phần tử, chẳng hạn như một số, một chuỗi hoặc một đối tượng như một người. Ngay cả sự khác biệt nhỏ nhất giữa hai yếu tố được so sánh cũng không dẫn đến kết quả trùng khớp
Mặt khác, bạn có thể chi tiết hơn với các tiêu chí tìm kiếm của mình bằng cách chọn một số thuộc tính của một phần tử, chẳng hạn như họ của một người. Điều này được gọi là tìm kiếm theo khóa vì bạn chọn một hoặc nhiều thuộc tính để so sánh. Trước khi bạn đi sâu vào tìm kiếm nhị phân trong Python, hãy xem nhanh các thuật toán tìm kiếm khác để có được bức tranh toàn cảnh hơn và hiểu cách chúng hoạt động
Loại bỏ các quảng cáoTìm kiếm ngẫu nhiên
Làm thế nào bạn có thể tìm kiếm một cái gì đó trong ba lô của bạn? . Nếu bạn không may mắn, thì bạn đặt món đồ trở lại, rửa sạch và lặp lại. Ví dụ này là một cách hay để hiểu tìm kiếm ngẫu nhiên, đây là một trong những thuật toán tìm kiếm kém hiệu quả nhất. Sự kém hiệu quả của cách tiếp cận này xuất phát từ thực tế là bạn có nguy cơ chọn sai cùng một thứ nhiều lần.
Ghi chú. Thật thú vị, về mặt lý thuyết, chiến lược này có thể là chiến lược hiệu quả nhất nếu bạn rất may mắn hoặc có một số lượng nhỏ các yếu tố trong bộ sưu tập
Nguyên tắc cơ bản của thuật toán này có thể được diễn đạt bằng đoạn mã Python sau
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = 0, r = array.size[] - 1; while [l > fruits = ['orange', 'plum', 'banana', 'apple'] >>> fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list7 hoàn toàn hoặc giá trị tương tự mà nó đã nhận được trong một tham số. Bạn có thể tìm thấy cách triển khai đầy đủ trong mã mẫu có sẵn để tải xuống tại liên kết bên dưới
Nhận mã mẫu. Nhấp vào đây để lấy mã mẫu mà bạn sẽ sử dụng để tìm hiểu về tìm kiếm nhị phân trong Python trong hướng dẫn này
Đối với các bộ dữ liệu vi mô, thuật toán tìm kiếm ngẫu nhiên dường như đang thực hiện công việc của nó khá nhanh
>>>
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = 0, r = array.size[] - 1; while [l > fruits = ['orange', 'plum', 'banana', 'apple'] >>> fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list8
>>> fruits = ['orange', 'plum', 'banana', 'apple']
>>> fruits.index['banana']
2
>>> fruits.index['blueberry']
Traceback [most recent call last]:
File "", line 1, in
ValueError: 'blueberry' is not in list
9int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }20
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }21Alicia Monica
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }22
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }23
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }24
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }25Baoyin Liu
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }26
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }27
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }28
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }29mất tích
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target >> fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list4 và
>>> fruits = ['orange', 'plum', 'banana', 'apple']
>>> fruits.index['banana']
2
>>> fruits.index['blueberry']
Traceback [most recent call last]:
File "", line 1, in
ValueError: 'blueberry' is not in list
5 tích hợp sẵn hoặc bạn có thể tính thời gian cho các chức năng bằng một trình trang trí tùy chỉnhThuật toán có hiệu suất không xác định. Mặc dù thời gian trung bình để tìm một phần tử không phụ thuộc vào vị trí của nó, nhưng thời điểm tốt nhất và tồi tệ nhất cách nhau từ hai đến ba bậc độ lớn. Nó cũng bị hành vi không nhất quán. Cân nhắc việc có một bộ sưu tập các phần tử chứa một số bản sao. Vì thuật toán chọn các phần tử một cách ngẫu nhiên nên chắc chắn nó sẽ trả về các bản sao khác nhau trong các lần chạy tiếp theo
Làm thế nào bạn có thể cải thiện về điều này?
Tìm kiếm tuyến tính
Khi quyết định ăn gì cho bữa trưa, bạn có thể nhìn quanh thực đơn một cách hỗn loạn cho đến khi có thứ gì đó thu hút sự chú ý của bạn. Ngoài ra, bạn có thể thực hiện một cách tiếp cận có hệ thống hơn bằng cách quét menu từ trên xuống dưới và xem xét kỹ lưỡng từng mục theo trình tự. Tóm lại đó là tìm kiếm tuyến tính. Để triển khai nó trong Python, bạn có thể
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target > fruits = ['orange', 'plum', 'banana', 'apple'] >>> fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list8
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target >>>> fruits = ['orange', 'plum', 'banana', 'apple'] >>> fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list
Điều này cũng có thể cho bạn biết liệu phần tử có trong bộ sưu tập hay không, nhưng một cách Pythonic hơn sẽ liên quan đến việc sử dụng toán tử
15 linh hoạtnconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
>>>
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }2Điều đáng chú ý là mặc dù sử dụng tìm kiếm tuyến tính ẩn, nhưng các hàm và toán tử tích hợp sẵn này sẽ thổi bay quá trình triển khai của bạn. Đó là bởi vì chúng được viết bằng C thuần túy, biên dịch thành mã máy gốc. Trình thông dịch Python tiêu chuẩn không phù hợp với nó, cho dù bạn có cố gắng thế nào
Một thử nghiệm nhanh với mô-đun
5 cho thấy rằng việc triển khai Python có thể chạy chậm hơn gần mười lần so với phiên bản gốc tương đương>>> fruits = ['orange', 'plum', 'banana', 'apple'] >>> fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list
>>>
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target >> fruits = ['orange', 'plum', 'banana', 'apple'] >>> fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list82723Jonathan Samuangtenconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
28nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
2924Yorgos Rahmatoulinnconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
30nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
3123thiếunconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target >>0nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
Sau khi tải các tên văn bản vào một danh sách phẳng, bạn có thể
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target >>1nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
Nhờ hàm băm được sử dụng ở hậu trường, bạn hoàn toàn không phải thực hiện bất kỳ tìm kiếm nào
Đây là cách thuật toán tìm kiếm dựa trên hàm băm hoạt động đối với bộ dữ liệu IMDb
Cụm từ tìm kiếmChỉ mục yếu tốThời gian tốt nhấtThời gian trung bìnhThời gian tồi tệ nhấtFred Astaire
8>>> fruits = ['orange', 'plum', 'banana', 'apple'] >>> fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list
41nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
42nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
43Alicia Monicanconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }2245nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
42nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
47Baoyin Liunconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
int upperBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target < array[mid]] { r = m; } else { l = m; } } return r; }2645nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
42nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
51mất tíchnconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = -1, r = array.size[]; while [l + 1 < r] { int mid = l + [r - l] / 2; if [target >>2nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
Các bộ sưu tập có thể thay đổi—chẳng hạn như
14,nconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
18 vànconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
22—không thể băm được. Trong thực tế, các khóa từ điển phải là bất biến vì giá trị băm của chúng thường phụ thuộc vào một số thuộc tính của khóa. Nếu một bộ sưu tập có thể thay đổi có thể băm được và có thể được sử dụng làm khóa, thì giá trị băm của nó sẽ khác mỗi khi nội dung thay đổi. Xem xét điều gì sẽ xảy ra nếu một loại trái cây cụ thể đổi màu do chín. Bạn sẽ tìm nó trong thùng sainconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
Hàm băm có nhiều công dụng khác. Ví dụ: nó được sử dụng trong mật mã để tránh lưu trữ mật khẩu ở dạng văn bản thuần túy, cũng như để xác minh tính toàn vẹn của dữ liệu
Loại bỏ các quảng cáo
Sử dụng Mô-đun def find_index[elements, value]:
for index, element in enumerate[elements]:
if element == value:
return index
8
def find_index[elements, value]:
for index, element in enumerate[elements]:
if element == value:
return index
Tìm kiếm nhị phân trong Python có thể được thực hiện bằng cách sử dụng mô-đun
def find_index[elements, value]:
for index, element in enumerate[elements]:
if element == value:
return index
8 tích hợp, điều này cũng giúp duy trì danh sách theo thứ tự được sắp xếp. Nó dựa trên phương pháp chia đôi để tìm nghiệm nguyên của các hàm. Mô-đun này đi kèm với sáu chức năng được chia thành hai loạiTìm chỉ mụcChèn phần tử
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
62nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
63nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
64nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
65nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
66nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
67Các hàm này cho phép bạn tìm chỉ mục của phần tử hoặc thêm phần tử mới vào đúng vị trí. Những cái ở hàng đầu tiên chỉ là bí danh của
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
66 và nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
67, tương ứng. Trên thực tế, bạn chỉ đang xử lý bốn chức năngGhi chú. Bạn có trách nhiệm sắp xếp danh sách trước khi chuyển nó đến một trong các chức năng. Nếu các phần tử không được sắp xếp, thì rất có thể bạn sẽ nhận được kết quả không chính xác
Còn chần chừ gì nữa, hãy cùng xem hoạt động của mô-đun
def find_index[elements, value]:
for index, element in enumerate[elements]:
if element == value:
return index
8Tìm một phần tử
Để tìm chỉ mục của một phần tử hiện có trong danh sách được sắp xếp, bạn muốn
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
64>>>
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
3Đầu ra cho bạn biết rằng chuối là loại trái cây thứ hai trong danh sách vì nó được tìm thấy ở chỉ số
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
72. Tuy nhiên, nếu một phần tử bị thiếu, thì bạn vẫn nhận được vị trí mong đợi của nó>>>
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
4Mặc dù những loại trái cây này chưa có trong danh sách, nhưng bạn có thể biết được nơi để đặt chúng. Ví dụ, quả mơ nên nằm giữa quả táo và quả chuối, trong khi quả dưa hấu nên là thành phần cuối cùng. Bạn sẽ biết liệu một phần tử có được tìm thấy hay không bằng cách đánh giá hai điều kiện
Là chỉ mục trong kích thước của danh sách?
Giá trị của phần tử có phải là giá trị mong muốn không?
Điều này có thể được dịch thành một chức năng phổ quát để tìm các phần tử theo giá trị
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
5Khi khớp hàm sẽ trả về chỉ số phần tử tương ứng. Nếu không, nó sẽ trả về
>>> fruits = ['orange', 'plum', 'banana', 'apple']
>>> fruits.index['banana']
2
>>> fruits.index['blueberry']
Traceback [most recent call last]:
File "", line 1, in
ValueError: 'blueberry' is not in list
7 ngầmĐể tìm kiếm theo khóa, bạn phải duy trì một danh sách khóa riêng. Vì điều này phát sinh thêm chi phí nên bạn nên tính toán trước các phím và tái sử dụng chúng càng nhiều càng tốt. Bạn có thể định nghĩa một lớp trình trợ giúp để có thể tìm kiếm bằng các khóa khác nhau mà không cần sao chép nhiều mã
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
6Khóa là một hàm được truyền làm tham số đầu tiên cho
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
74. Sau khi có nó, bạn tạo một danh sách sắp xếp các cặp khóa-giá trị để có thể truy xuất một phần tử từ khóa của nó sau này. Biểu diễn các cặp bằng các bộ đảm bảo rằng phần tử đầu tiên của mỗi cặp sẽ được sắp xếp. Trong bước tiếp theo, bạn trích xuất các khóa để tạo một danh sách phẳng phù hợp với việc triển khai Python tìm kiếm nhị phân của bạnSau đó, có phương pháp thực tế để tìm các phần tử theo khóa
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
7Mã này chia đôi danh sách các khóa đã sắp xếp để lấy chỉ mục của một phần tử theo khóa. Nếu một khóa như vậy tồn tại, thì chỉ mục của nó có thể được sử dụng để lấy cặp tương ứng từ danh sách các cặp khóa-giá trị được tính toán trước đó. Phần tử thứ hai của cặp đó là giá trị mong muốn
Ghi chú. Đây chỉ là một ví dụ minh họa. Bạn sẽ tốt hơn nếu sử dụng công thức được đề xuất, được đề cập trong tài liệu chính thức
Nếu bạn có nhiều chuối, thì
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
64 sẽ trả về phiên bản ngoài cùng bên trái>>>
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
8Có thể dự đoán, để lấy được quả chuối ngoài cùng bên phải, bạn cần gọi tới số
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
66 hoặc bí danh của nó là nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
62. Tuy nhiên, hai hàm đó trả về một chỉ mục xa hơn từ quả chuối ngoài cùng bên phải thực tế, rất hữu ích để tìm điểm chèn của phần tử mới>>>
nconst primaryName birthYear deathYear [...]
nm0000001 Fred Astaire 1899 1987 [...]
nm0000002 Lauren Bacall 1924 2014 [...]
nm0000003 Brigitte Bardot 1934 \N [...]
nm0000004 John Belushi 1949 1982 [...]
9Khi bạn kết hợp mã, bạn có thể xem bạn có bao nhiêu chuối
>>>
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = 0, r = array.size[] - 1; while [l >int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = 0, r = array.size[] - 1; while [lint lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = 0, r = array.size[] - 1; while [l >int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = 0, r = array.size[] - 1; while [lint lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = 0, r = array.size[] - 1; while [l > fruits.index['banana'] 2 >>> fruits.index['blueberry'] Traceback [most recent call last]: File "", line 1, in ValueError: 'blueberry' is not in list7 và sau đó kiểm tra xem nó có được cung cấp hay không. Tuy nhiên, trong một giải pháp hợp lý hơn, bạn luôn muốn gọi số99. Theo mặc định, nó sẽ là một hàm nhận dạng trả về chính phần tử đónconst primaryName birthYear deathYear [...] nm0000001 Fred Astaire 1899 1987 [...] nm0000002 Lauren Bacall 1924 2014 [...] nm0000003 Brigitte Bardot 1934 \N [...] nm0000004 John Belushi 1949 1982 [...]
int lowerBound[vector &array, int target] { // array should be sorted in non-decreasing // order from left to right int l = 0, r = array.size[] - 1; while [l