Professional Documents
Culture Documents
Final Practice
Final Practice
Giới thiệu:
Có nhiều công cụ tìm kiếm hiện nay, ví dụ: Google, Yahoo, Baidu… vv. Trong dự án này, chúng ta cần xây
dựng một công cụ tìm kiếm bài luận đơn giản.
Nguồn dữ liệu:
Một tập tin văn bản (bài luận) trong thư mục được cung cấp (0.txt, 1.txt, ....).
Một tập tin văn bản cung cấp các truy vấn tìm kiếm.
Tên tập tin đầu ra.
Với một từ cho trước, mục tiêu của chúng ta là liệt kê các bài luận có tiêu đề hoặc phần tóm tắt chứa từ
đó. Chỉ xem xét các chữ cái, có thể bỏ qua các ký tự đặc biệt hoặc chữ số. Các truy vấn không phân biệt
chữ hoa và chữ thường.
Các mẫu truy vấn:
Tìm kiếm chính xác: “từ-tìm-kiếm”
Ví dụ: tìm kiếm bài luận với từ graph, nhập vào: "graph"
Tìm kiếm tiền tố: từ-tìm-kiếm
Ví dụ: tìm kiếm bài luận với tiền tố graph, nhập vào: graph
Tìm kiếm hậu tố: *từ-tìm-kiếm*
Ví dụ: tìm kiếm bài luận với hậu tố graph, nhập vào: *graph*
Tìm kiếm Wildcard: <mẫu-tìm-kiếm>
Ví dụ: tìm kiếm bài luận với từ khóa theo mẫu gr*h, nhập vào: <gr*h>. “*” có thể là một hoặc
nhiều ký tự, vì vậy gr*h nên khớp với các từ như graph, growth ...vv.
Tìm kiếm với toán tử AND: “+”
Ví dụ: tìm kiếm bài luận với từ khóa graph và sparsity, nhập vào: “graph” + “sparsity”
Tìm kiếm với toán tử OR: “/”
Ví dụ: tìm kiếm bài luận với từ khóa graph hoặc quantum, nhập vào: “graph” / “quantum”
Tìm kiếm với toán tử loại trừ: “-”
Ví dụ: tìm kiếm bài luận với từ khóa graph nhưng không đi dèm từ deep, nhập vào: “graph” -
“deep”
Có một tập tin gồm bài luận .txt, ví dụ: 0.txt, 1.txt, … Những tập tin bài luận txt này sẽ được đặt trong
một thư mục đã cho.
Mỗi tập tin bài luận txt chứa hai phần: Tiêu đề (dòng đầu tiên), Tóm tắt (những câu còn lại).
Có thể có nhiều truy vấn trong một tệp truy vấn và mỗi dòng đại diện cho một truy vấn cần được xử lý.
Toán tử And / Or / Exclude được hiểu theo chiều từ trái sang phải.
Ví dụ: graph + decompositition / quantum = (graph + decompostition) / quantum
Tất cả các truy vấn trong tệp truy vấn đều hợp lệ, nên bạn không cần phải lo lắng trường hợp các truy
vấn không hợp lệ.
Các mẫu truy vấn:
Mẫu 1: reflect
Tìm kiếm các bài luận có chứa tiền tố [reflect], ví dụ: reflect, reflection.
Mẫu 5: “spiderMan”
Tìm các bài luận có chính xác từ [spiderman]. Lưu ý: các ký tự in hoa và in thường được xét giống nhau
Tên tệp đầu ra được cung cấp như là một arguments khi chạy chương trình. Xuất ra tiêu đề của các bài
luận tìm kiếm được vào một tệp đầu ra. Cuối mỗi tiêu đề là một ký tự xuống dòng.
Nếu không tìm thấy -> in ra “Not Found!” (Không cần kèm theo dấu nháy đôi).
Thứ tự đầu ra phải theo thứ tự của các bài luận: (0.txt, 1.txt, .....).
Yêu cầu:
Sử dụng ngôn ngữ C/C++.
Thiết kế cấu trúc dữ liệu riêng để tìm kiếm nhanh hơn.
Tuân theo yêu cầu định dạng đầu vào/đầu ra
Không sử dụng các thư viện dùng để so sánh khớp chuỗi (vd: str.find, …)
Kiểm thử:
Code nên nhận vào ba đối số:
Đường dẫn của thư mục đầu vào, đường dẫn đến tệp truy vấn, tên tệp đầu ra
Tên tệp đầu ra phải tuân thủ: Tệp đầu ra cùng với [output_file_name]
Trợ giảng sẽ chạy code theo lệnh: g++ -std=c++17 -O2 -o essay_search ./[student_id].cpp
Nếu code của bạn cần sử dụng thư viện khác dẫn tới không thể biên dịch mã của bạn, hãy gửi lệnh biên
dịch bạn đã sử dụng qua email cho chúng tôi và nêu rõ lý do trong báo cáo.
Trợ giảng sẽ kiểm tra code như sau: ./essay_search [input_folder_path] [query_file_path]
[output_file_name]
Chúng tôi có một bộ dữ liệu nhỏ (1000 tệp) và một bộ dữ liệu lớn hơn (trên 8000 tệp).
Tìm kiếm chính xác + Tìm kiếm với toán tử And / Or / Exclude (40%)
Kiểm tra Khả năng mở rộng: thử nghiệm với nhiều bài luận và truy vấn hơn (10%)
Bạn sẽ nhận được điểm này khi tất cả các câu trả lời đều đúng
Chúng tôi chỉ sẽ kiểm tra mã của bạn nếu bạn vượt qua hai kiểm tra trước
Kiểm tra Tốc độ: cạnh tranh tốc độ với các bạn cùng lơp (15%)
Chúng tôi chỉ sẽ kiểm tra mã của bạn nếu bạn đạt được tất cả các điểm trong ba kiểm tra trên (75 điểm)
Chúng tôi sẽ cung cấp một số code trong tệp main.cpp. Bạn có thể sử dụng mã này cho việc triển khai
chương trình.
Ghi chú:
Làm thế nào để xây dựng cấu trúc dữ liệu hỗ trợ tìm kiếm một cách hiệu quả?
Dưới đây là một số cấu trúc thông thường mà chúng ta có thể tham khảo:
Suffix-Tree
Compressed Trie