Bài 7: Lập trình giải bài toán tìm kiếm

Khởi động (SGK Cánh diều - Trang 117)

Hướng dẫn giải

Khi tạo mới một tài khoản người dùng, em được yêu cầu nhập tên người dùng “user name”. Có trường hợp em phải nhập lại tên khác vì tên vừa nhập đã có người sử dụng rồi. Theo em, máy tính phải bắt đầu tìm kiếm dữ liệu và tiến hành xử lí thông tin ngay sau khi nhận.

    

(Trả lời bởi Thanh An)
Thảo luận (1)

Hoạt động (SGK Cánh diều - Trang 119)

Hướng dẫn giải

Ý tưởng: cho trước một dãy số và tìm số x nằm ở vị trí nào trong dãy số đó.

(Trả lời bởi Quoc Tran Anh Le)
Thảo luận (1)

Nhiệm vụ 1 (SGK Cánh diều - Trang 120)

Hướng dẫn giải

Sau lần chia đôi đầu tiên, pham vi tìm kiếm còn lại n/2 số, sau khi chia đôi lần thứ hai, dãy còn lại n/4 số, sau khi chia đôi lần thứ dãy còn lại n/8, …sau khi chia đôi lần k dãy còn lại n/2.­­­­­­­mũ k. Kết thúc khi 2 mũ k sấp xỉ n.

(Trả lời bởi Quoc Tran Anh Le)
Thảo luận (1)

Nhiệm vụ 2 (SGK Cánh diều - Trang 120)

Hướng dẫn giải

Tham khảo:

a. Viết chương trình phython thực hiện tìm kiếm tuần tự

def search(arr, n, x):

    for i in range (0, n):

        if (arr[i] == x):

            return i;

    return -1;

# Driver Code

arr = [ 2, 3, 4, 10, 40 ];

x = 10;

n = len(arr);

result = search(arr, n, x)

if(result == -1):

    print("Element is not present in array")

else:

    print("Element is present at index", result);

b. Viết phiên bản tìm kiếm tuần tự thứ hai, dùng vòng lặp for thay cho vòng lặp while (hoặc ngược lại).

def search(arr, n, x):

    for i in range (0, n):

        if (arr[i] == x):

            return i;

    return -1;

# Driver Code

arr = [ 2, 3, 4, 10, 40 ];

x = 10;

n = len(arr);

result = search(arr, n, x)

if(result == -1):

    print("Element is not present in array")

else:

    print("Element is present at index", result);

c. Viết phiên bản tìm kiếm tuần tự có thêm hai tham số đầu vào lo và hi tương tự như của hàm index. So sánh kết quả với phương thức index của phython.

def search(arr, n, x):

    for i in range (0, n):

        if (arr[i] == x):

            return i;

    return -1;

# Driver Code

arr = [ 2, 3, 4, 10, 40 ];

x = 10;

n = len(arr);

result = search(arr, n, x)

if(result == -1):

    print("Element is not present in array")

else:

    print("Element is present at index", result);

(Trả lời bởi Time line)
Thảo luận (1)

Nhiệm vụ 3 (SGK Cánh diều - Trang 120)

Hướng dẫn giải

Tham khảo:

#Trả về chỉ số của x trong arr nếu tồn tại, nếu không có sẽ trả về -1

def binary_search(arr, low, high, x):

    #Trường hợp cơ sở

    if high >= low:

        mid = (high + low) // 2

        #Nếu phần tử có tồn tại ở phần giữa của mảng

        if arr[mid] == x:

            return mid

        #Nếu phần tử nhỏ hơn mid, nó sẽ nằm ở phía bên trái của mảng điểm gốc là tử phần tử mid

        elif arr[mid] > x:

            return binary_search(arr, low, mid - 1, x)

        #Nếu không, phần tử sẽ nằm bên phải

        else:

            return binary_search(arr, mid + 1, high, x)

    else:

        #Phần tử không tồn tại trong tập hợp

        return -1

#Khởi tạo tập hợp

arr = [ 2, 3, 4, 10, 40 ]

x = 10

#Gọi hàm

result = binary_search(arr, 0, len(arr)-1, x)

if result != -1:

    print("Phần tử cần tìm có chỉ số là ", str(result))

else:

    print("Phần tử cần tìm không có trong mảng.")

(Trả lời bởi Time line)
Thảo luận (1)

Vận dụng (SGK Cánh diều - Trang 120)

Hướng dẫn giải

a) Danh sách học sinh của lớp:

 

def tim_vi_tri_ten_hs(ten, danh_sach_hs):

       for i, ten_hs in enumerate(danh_sach_hs):

              if ten_hs == ten:

                     return i

       return -1

danh_sach_hs = ["Nam", "An", "Binh", "Chung", "Duc", "Huong"]

ten_can_tim = "An"

vi_tri = tim_vi_tri_ten_hs(ten_can_tim, danh_sach_hs)

if vi_tri >= 0:

       print(f"Vi tri cua ten '{ten_can_tim}' trong danh sach la {vi_tri}")

else:

       print(f"Ten '{ten_can_tim}' khong nam trong danh sach")

 

b) Danh sách tên các chủ tài khoản ngân hàng đã sắp xếp theo thứ tự bảng chữ cái:

 

def tim_vi_tri_ten_tk(ten, danh_sach_tk):

       left, right = 0, len(danh_sach_tk) - 1

       while left <= right:

              mid = (left + right) // 2

              if danh_sach_tk[mid] == ten:

                     return mid

              elif danh_sach_tk[mid] < ten:

                     left = mid + 1

              else:

                     right = mid - 1

       return -1

danh_sach_tk = ["An", "Binh", "Duc", "Huong", "Nam"]

ten_can_tim = "Huong".upper()

vi_tri = tim_vi_tri_ten_tk(ten_can_tim, danh_sach_tk)

if vi_tri >= 0:

       print(f"Vi tri cua ten '{ten_can_tim}' trong danh sach la {vi_tri}")

else:

       print(f"Ten '{ten_can_tim}' khong nam trong danh sach")

(Trả lời bởi Phía sau một cô gái)
Thảo luận (1)

Câu 1 (SGK Cánh diều - Trang 120)

Hướng dẫn giải

Tham khảo:

Tìm kiếm là một vấn đề phổ biến trong lập trình, đặc biệt là trong các ứng dụng liên quan đến quản lý dữ liệu. Dưới đây là một số ví dụ về bài toán tìm kiếm trong thực tế:

- Tìm kiếm sản phẩm trong cơ sở dữ liệu của một trang thương mại điện tử.

- Tìm kiếm thông tin liên hệ của một người trong danh sách khách hàng của một doanh nghiệp.

- Tìm kiếm một file hoặc thư mục trong hệ thống tệp của máy tính.

- Tìm kiếm các bản ghi trong cơ sở dữ liệu y tế để tìm kiếm bệnh nhân cần điều trị.

- Tìm kiếm các bản ghi trong cơ sở dữ liệu của một trang tuyển dụng để tìm kiếm ứng viên phù hợp.

(Trả lời bởi Time line)
Thảo luận (1)

Câu 2 (SGK Cánh diều - Trang 120)

Hướng dẫn giải

a. Ví dụ một bài toán tìm kiếm trong thực tế: Giáo viên muốn tìm tên bạn Chung trong danh sách lớp sau:

Các bước thực hiện thuật toán tìm kiếm nhị phân cho bài toán trên:

- Bước 1: Xét vị trí ở giữa dãy, đó là vị trí số 5

- Vì sau bước 2 đã tìm thấy tên học sinh nên thuật toán kết thúc.

b) Thuật toán tìm kiếm nhị phân

- Thuật toán tìm kiếm nhị phân thu hẹp được phạm vi tìm kiếm chỉ còn tối đa là một nửa sau mỗi lần lặp. Thuật toán chia bài toán thành những bài toán nhỏ hơn giúp tăng hiệu quả tìm kiếm.

Thuật toán tuần tự

- Mô tả thuật toán phải cụ thể, rõ ràng, đầy đủ, đầu vào là gì, đầu ra là gì và chỉ rõ sự kết thúc thuật toán.

- Cần mô tả thuật toán cho tốt thì người máy hay máy tính mới hiểu đúng và thực hiện được.

- Nếu không, kết quả thực hiện thuật toán có thể không như mong đợi.

(Trả lời bởi Quoc Tran Anh Le)
Thảo luận (1)