Bài tập mảng đa chiều nhị phân php

Tại mỗi bước, ta so sánh x với phần tử đứng giữa trong mảng đang tìm kiếm, dựa vào kết quả so sánh này mà ta quyết định giới hạn dãy tìm kiếm ở nữa dưới hay nữa trên của dãy tìm kiếm hiện hành.

Các bước thực hiện thuật toán

Giả sử mảng tìm kiếm hiện hành bao gồm các phần tử nằm trong aleft, aright. Các bước của giải thuật như sau:

Bước 1: Gán left=0; right=n-1;

Bước 2:

mid=(left+right)/2;//chỉ số phần tử giữa mảng hiện hành

So sánh a[mid] với x. Có 3 khả năng:

  • * a[mid] == x -> tìm thấy -> Dừng.
    • a[mid] > x thì gán right=mid-1;//tìm tiếp x trong mảng con a[left],..,a[mid-1]
    • a[mid] < x thì gán left=mid+1;//tìm tiếp x trong mảng con a[mid+1],..,a[right]

Bước 3: Nếu left <= right; thì lặp lại bước 2. Ngược lại thì dừng.

Minh họa thuật toán

Tìm x=4 trong mảng đã được sắp xếp tăng dần bên dưới.

Bài tập mảng đa chiều nhị phân php

Xác định left=0 và right=6 trên mảng đang xét.

Bài tập mảng đa chiều nhị phân php

Xác định được mid=(left+right)/2=3 trong mảng đang xét và a[mid]=6.

Bài tập mảng đa chiều nhị phân php

Giá trị x=4 nhỏ hơn a[mid]=6 nên right=mid-1=2, left vẫn là 0. Mảng con đang xét hiện giờ là a[left],…,a[right].

Bài tập mảng đa chiều nhị phân php

Xác định lại mid=(left+right)/2=1 và a[mid]=4.

Bài tập mảng đa chiều nhị phân php

Tìm được x=4 trong mảng con.

Bài tập mảng đa chiều nhị phân php

Đánh giá thuật toán tìm kiếm nhị phân

Trường hợpSố lần so sánhGiải thíchTốt nhất1Phần tử giữa của mảng có giá trị xXấu nhấtlog2nKhông có x trong mảngTrung bìnhlog2(n/2)Xác suất các phần tử trong mảng nhận giá trị x là như nhau

Độ phức tạp của thuật toán là O(log2n).

Cài đặt thuật toán tìm kiếm nhị phân với C++

Hàm BinarySearch() trả về mid là vị trí của x trong mảng nếu tìm thấy x, ngược lại hàm trả về giá trị -1.

int BinarySearch(int a[],int n,int x)
{
  int left, right, mid; left=0; right=n-1;
  do{
    mid=(left+right)/2;
    if(a[mid]==x){
      return mid;
    }
    else if(a[mid]

2. Cài đặt thuật toán tìm kiếm nhị phân dùng đệ quy

Dễ thấy, thuật toán tìm kiếm nhị phân là sự lặp đi lặp lại của quá trình xác định mid và so sánh a[mid] có bằng giá trị x cần tìm trong mảng hay không. Ta có thể viết một hàm làm nhiệm vụ đó rồi gọi lại chính nó để cài đặt thuật toán. Đó chính là kỹ thuật lập trình đệ quy đã học ở môn Nhập môn lập trình.

int BinarySearch_Recursive(int a[],int x,int left,int right){
  if(left>right){
    return -1;
  }
  int mid=(left+right)/2;
  if(x==a[mid]){
    return mid;
  }
  if(x

3. Phân tích và so sánh các thuật toán tìm kiếm

Sau khi tìm hiểu thuật toán tìm kiếm tuyến tính và tìm kiếm nhị phân (binary search), chúng ta có một số phân tích sau:

  • 1. với ASNT
  • 2. Giới thiệu
  • 3. ASNT là gì ? • ASNT từ viết tắt của Number, String, Array và Time. Đây là 4 kiểu dữ liệu mà chúng ta rất thường thao tác trong các ngôn ngữ lập trình. • Trong chương học này, chúng ta sẽ được đặt ra các tình huống và xử lý các tình huống này khi thao tác với 4 kiểu dữ liệu trên.
  • 4. hàm var_dump hàm gettype để lấy kiểu dữ liệu của một biến. • Sử dụng nhóm hàm is_numberic, is_string, is_array, is_date để kiểm tra kiểu dữ liệu của một biến. Vấn đề 2: Làm sao biết chúng ta đang thao tác với kiểu dữ liệu nào ?
  • 5. PHP Array
  • 6. một biến đặc biệt và có thể lưu trữ nhiều giá trị. • Một biến thông thường chỉ chứa một giá trị duy nhất, nếu chúng ta muốn chứa nhiều giá trị trong một biến thì biến đó phải là một mảng (Ví dụ cần lưu trữ thông tin của 1000 nhân viên) • Trong PHP có 3 loại mảng: mảng số nguyên, mảng kết hợp và mảng đa chiều. Vấn đề 1: Hiểu như thế nào về array trong PHP ?
  • 7. nguyên là mảng mà các chỉ số của các phần tử phải thuộc kiểu số nguyên (mảng số nguyên còn được gọi là mảng liên tục) • Tìm hiểu cách truy cập vào phần tử của mảng và in mảng Vấn đề 2: Khai báo và sử dụng mảng số nguyên
  • 8. hợp là mảng mà các chỉ số của các phần tử có thể là chuỗi hoặc số (Mảng kết hợp còn gọi là mảng không liên tục) • In danh sách các phần tử trong mảng kết hợp: foreach Vấn đề 3: Khai báo và sử dụng mảng kết hợp
  • 9. chiều là mảng mà mỗi phần tử trong mảng chính có thể là một mảng và mỗi phần tử trong mảng con lại cũng có thể là một mảng (Mảng đa chiều còn gọi là mảng lồng) • In phần tử, in sách các phần tử trong mảng đa chiều: foreach Vấn đề 4: Khai báo và sử dụng mảng đa chiều
  • 10. trả về một mảng liên tục có các phần tử có giá trị là giá trị lấy từ các phần tử của mảng $array. • array_keys ($array): trả về một mảng liên tục có các phần tử có giá trị là khóa lấy từ các phần tử của mảng $array. Vấn đề 5: Lấy danh sách các khóa và danh sách các giá trị của một mảng nào đó ?
  • 11. loại bỏ phần tử cuối cùng của mảng. Hàm trả về phần tử cuối cùng đã được loại bỏ. • array_shift ($array) loại bỏ phần tử đầu tiên của mảng. Hàm trả về phần tử đầu tiên đã được loại bỏ Vấn đề 6: Loại bỏ phần tử ở đầu và cuối mảng ?
  • 12. loại bỏ những phần tử trùng nhau trong mảng và trả về mảng mới Vấn đề 7: Loại bỏ phần tử trùng nhau trong mảng?
  • 13. hàm unset để xóa bỏ phần tử ở vị trí bất kỳ trong mảng Vấn đề 8: Xóa phần tử ở vị trí bất kỳ của mảng
  • 14. $val1, $val2, ... , $valn) thêm một hoặc nhiều phần tử vào cuối mảng $array. Hàm trả về kiểu số nguyên là số lượng phần tử của mảng $array mới • array_unshift ($array, $val1, $val2, ... , $valn) thêm một hoặc nhiều phần tử vào đầu mảng $array. Hàm trả về kiểu số nguyên là số lượng phần tử của mảng $array mới Vấn đề 9: Thêm một hoặc nhiều phần tử ở đầu hoặc cuối mảng ?
  • 15. đảo ngược vị trí các phần tử của mảng, phần tử cuối trở thành phần tử đầu tiên, phần tử kế cuối trở thành phần tử thứ nhì, … kết quả trả về là một mảng mới Vấn đề 10: Đảo ngược vị trí các phần tử của mảng?
  • 16. hàm array_flip($array) trả về một mảng có khóa và giá trị được hoán đổi cho nhau so với mảng $array (giá trị thành khóa và khóa thành giá trị) Vấn đề 11: Hoán đổi chỉ số và giá trị của mảng (đảo $key và $value) ?
  • 17. các phần tử trong mảng array_sum ($array) • Xác định phần tử nhỏ nhất trong mảng min($array) • Xác định phần tử lớn nhất trong mảng max($array) Vấn đề 12: Xác định tổng, giá trị lớn nhất và giá trị nhỏ nhất trong mảng ?
  • 18. kê sự xuất hiện của các phần tử trong mảng chúng ta sử dụng hàm array_count_values(array) Vấn đề 13: Thống kê số lần xuất hiện của các phần tử trong mảng ?