Tìm kiếm nhị phân Python giới hạn dưới

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_______0
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 list
0
  • >>> 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
    
    1
  • Mộ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 list
    
    2 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ây

    Hiể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áo

    Tì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 list
    
    7 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 list
    
    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
    
    9
    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;
    }
    
    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 list
    
    4 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ỉnh

    Thuậ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 list
    
    8
    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ử

    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    15 linh hoạt

    >>>

    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

    >>> 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 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

    >>>

    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
    
    8
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    2723Jonathan Samuangte
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    28
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    2924Yorgos Rahmatoulin
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    30
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    3123thiếu
    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 >> 
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    0

    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 >> 
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    1

    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

    >>> 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
    
    8
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    41
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    42
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    43Alicia 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
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    45
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    42
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    47Baoyin 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
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    45
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    42
    nconst     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í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 >> 
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    2

    Các bộ sưu tập có thể thay đổi—chẳng hạn như

    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    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 sai

    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

    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ại

    Tì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       [...]
    
    62
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    63
    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       [...]
    
    65
    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
    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

    Cá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ăng

    Ghi 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
    
    8

    Tì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       [...]
    
    4

    Mặ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

    1. Là chỉ mục trong kích thước của danh sách?

    2. 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       [...]
    
    5

    Khi 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       [...]
    
    6

    Khó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ạn

    Sau đó, 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       [...]
    
    7

    Mã 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       [...]
    
    8

    Có 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       [...]
    
    9

    Khi 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 [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 [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 [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 [l > fruits.index['banana']
    2
    >>> fruits.index['blueberry']
    Traceback [most recent call last]:
      File "", line 1, in 
    ValueError: 'blueberry' is not in list
    
    7 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ố
    nconst     primaryName      birthYear  deathYear  [...]
    nm0000001  Fred Astaire     1899       1987       [...]
    nm0000002  Lauren Bacall    1924       2014       [...]
    nm0000003  Brigitte Bardot  1934       \N         [...]
    nm0000004  John Belushi     1949       1982       [...]
    
    99. Theo mặc định, nó sẽ là một hàm nhận dạng trả về chính phần tử đó

    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 

    Chủ Đề