Siêu thị PDFTải ngay đi em, trời tối mất

Thư viện tri thức trực tuyến

Kho tài liệu với 50,000+ tài liệu học thuật

© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Thuật toán lùa bò vào chuồng
MIỄN PHÍ
Số trang
5
Kích thước
99.7 KB
Định dạng
PDF
Lượt xem
1077

Thuật toán lùa bò vào chuồng

Nội dung xem thử

Mô tả chi tiết

Thuật toán Lùa bò vào chuồng

Văn Sơn

Trong kỹ thuật lập trình, các bài toán có liên quan đến đếm các đối tượng rất gần gũi và dễ

giải đối với chúng ta vì tính dễ xây dựng thuật toán cho nó. Tuy nhiên, những bài toán

″đếm″ thường yêu cầu với dữ liệu rất lớn. Nếu không biết tổ chức dữ liệu và thuật toán

hiệu quả thì khó có thể đưa ra lời giải. Một trong những cách tiếp cận để xử lý hiện tượng

này là sử dụng thuật toán ″lùa bò vào chuồng″.

Tư tưởng của thuật toán được xây dựng dựa trên suy nghĩ thực tế là để đếm số lượng bò

trên một vùng xác định thì người ta phải tìm cách lùa chúng vào các chuồng (để chúng

khỏi chạy rông) cho dễ đếm. Đương nhiên là những con bò cùng loại phải được lùa vào

cùng một chuồng để dễ phân biệt hoặc lùa mỗi con vào một chuồng thì càng tốt. Tương tự

như vậy, muốn giải bài toán đếm các đối tượng thì ta dùng một cấu trúc dữ liệu hợp lý

(thường là mảng tĩnh hay mảng động) với ý nghĩa giống như các ″chuồng″ để lưu các đối

tượng, mỗi phần tử của mảng tương ứng với một chuồng. Trên cơ sở đó ta dễ dàng thực

hiện được mục đích của mình là thực hiện thao tác đếm.

Để hiểu thuật toán ta xét ví dụ sau: ″Hãy đếm và cho biết số lần xuất hiện của các chữ cái

La tinh trong một file văn bản. Giả sử văn bản được viết toàn chữ hoa″. Rõ ràng với bài

toán này ta có thể duyệt toàn bộ file và mỗi lần duyệt ta thực hiện thao tác đếm một chữ

cái. Sau 26 lần duyệt tương ứng với 26 chữ cái thì ta thu được toàn bộ kết quả. Tuy nhiên,

vì việc duyệt file tương đối chậm và có thể file văn bản đã cho rất dài nên về thời gian là

không chấp nhận được. Ta vận dụng thuật toán trên bằng cách sử dụng một mảng tĩnh

A:array[′A′..′Z′] of Longint với ý nghĩa như sau: giá trị A[c] trong đó c thuộc [′A′..′Z′] lưu

số lần xuất hiện của ký tự c trong file văn bản. Mảng A được khởi tạo với tất cả các giá trị

bằng 0, khi duyệt file ta đọc lần lượt các ký tự trong file ra một biến trung gian ch nào đó,

và tăng giá trị của mảng tại vị trí tương ứng có chỉ số ch lên một đơn vị qua câu lệnh:

A[ch]:=A[ch]+1. Như vậy, bài toán được giải quyết chỉ với một lần duyệt file duy nhất.

Sau đây chúng ta cùng khảo sát một số ví dụ điển hình vận dụng thuật toán này.

Bài 1. Tần số (Đề thi Olimpic sinh viên 2001, khối đồng đội)

Cho một văn bản gồm không quá N (N ≤500) dòng, mỗi dòng chứa không quá 80 ký tự. Ta

gọi tần số của một ký tự trong văn bản là số lần xuất hiện của ký tự đó trong văn bản.

Yêu cầu: Tìm tần số lớn nhất trong các tần số của các chữ cái (không phân biệt chữ hoa

hay chữ thường) trong văn bản đã cho.

Dữ liệu vào: từ file văn bản có tên là FREQ.INP:

Dòng đầu tiên chứa N là số lượng dòng văn bản.

N dòng tiếp theo mỗi dòng chứa một dòng của văn bản đã cho.

Kết quả: ghi ra file văn bản có tên FREQ.OUT tần số lớn nhất tìm được.

Ví dụ:

FREQ.INP

4

faculty of technology

Hanoi National University

Tải ngay đi em, còn do dự, trời tối mất!