Các cấu trúc dữ liệu đặc biệt
Chỉ cần qua câu nói "Algorithms+Data Structures = Program" của Niklaus Wirth ta đã có thể thấy được tầm quan trọng của các loại cấu trúc dữ liệu [data structures] trong giải các bài toán tin. Ứng dụng 1 cách thuần thục hiệu quả các loại cấu trúc sẽ đem đến những thuận lợi vô cùng lớn cho các lập trình viên. Ngoài những cấu trúc dữ liệu chuẩn, quen thuộc như array, record, queue,... còn có 1 số cấu trúc dữ liệu khác có hiệu quả đặc biệt trong 1 số dạng bài tập. Mặc dù vậy, tài liệu tiếng việt về những cấu trúc này lại khá ít, đặc biệt là Interval Tree, Binary Indexed Tree và Range minimum Query. Trong chuyên đề này sẽ đề cập tới 1 số loại cấu trúc thường xuyên được sử dụng: Interval tree, Binary Indexed Tree, Heap, Range Minimum Query và Disjoint set. Để giúp bạn hiểu rõ các cấu trúc đó, sẽ có thêm 1 số ví dụ điển hình cho những ứng dụng khác nhau của chúng. | Xem tiếp |
Thuật toán đệ quy
1. Định nghĩa
Ta nói một đối tượng là đệ quy nếu nó được định nghĩa qua chính nó hoặc một đối tượng khác cùng dạng với chính nó bằng quy nạp.
Nếu lời giải của một bài toán T được thực hiện bằng lời giải của bài toán T’ có dạng giống T thì đó là một lời giải đệ quy. Giải thuật tương ứng với lời giải như vậy được gọi là giải thuật đệ quy. Chú ý, T’ có dạng giống T nhưng theo một nghĩa nào đó thì T’ phải “nhỏ” hơn T, dễ giải hơn T và việc giải T’ không phụ thuộc vào T. | Xem tiếp |
Thuật toán Euclid
Trong lý thuyết số, thuật toán Euclid là một thuật toán để xác định ước số chung lớn nhất (GCD – Greatest Common Divisor) của 2 phần tử thuộc vùng Euclid (ví dụ: các số nguyên). Điều quan trọng chủ yếu là nó không yêu cầu việc phân tích thành thừa số 2 số nguyên, và nó cũng mang ý nghĩa lớn vì nó là một trong những thuật toán cổ nhất được biết đến, từ thời Hy Lạp cổ đại. | Xem tiếp |
Học thuật toán qua các bài toán – Phần 2
Tiếp theo bài viết “Học thuật toán qua các bài toán”, trong bài viết này tôi xin tiếp tục giới thiệu với các bạn độc giả yêu thích thuật toán và lập trình một số ví dụ khá thú vị về thuật toán qua các bài toán. Trước hết chúng ta hãy bắt đầu bằng bài toán “Nhân hai ma trận”. | Xem tiếp |
Học thuật toán qua các bài toán
Học tập thuật toán là một trong những yêu cầu cơ bản để trở thành các lập trình viên. Đối với các sinh viên ngành tin học và những ai yêu thích lập trình, việc học thuật toán còn là một thú vui, giúp nâng cao tư duy logic và làm phong phú thêm kiến thức về việc xây dựng các giải thuật cho các bài toán mới. Trong bài báo nhỏ này tôi xin đưa ra một số bài toán nhỏ, để qua đó trình bày một số thuật toán khá tinh tế để giải quyết chúng, mong rằng bài báo sẽ mang lại cho các bạn độc giả những điều thú vị. | Xem tiếp |
Bài toán tìm theo khoảng với phương pháp tìm tuần tự, phương pháp lưới
Cho một tập điểm trong mặt phẳng, một câu hỏi hiển nhiên là tìm các điểm rơi trong một vùng đã cho nào đó. “Liệt kê tên tất cả các quốc gia trong khu vực Đông Nam Á” là một câu hỏi thuộc loại này với tập điểm là các quốc gia trên bản đồ khu vực Đông Nam Á. Cũng có thể thấy một ví dụ điển hình trong thực tế “ Lịêt kê những người từ 20 đến 23 tuổi với mức thu nhập nào đó”. | Xem tiếp |
Số bè bạn và số hoàn hảo
Trong quá trình học lập trình và thuật toán, đa số trong chúng ta đã từng nghe tới và làm các bài tập về các số bè bạn (friend numbers) và số hoàn hảo (perfect numbers). Các số bè bạn n, m là hai số nguyên mà tổng ước số của n bằng m và tổng các ước của m bằng n, ví dụ như cặp số bè bạn nhỏ nhất là 220 và 284. Các số hoàn hảo là các số mà tổng các ước thực sự của nó bằng chính nó, ví dụ như các số hoàn thiện đầu tiên là 6, 28 ... | Xem tiếp |
Xây dựng thuật toán nén tập tin Huffman
Thông thường, khi thiết kế thuật toán chúng ta thường chú tâm tới việc sao cho thuật toán chạy càng ít tốn thời gian càng tốt, sau đó mới nghĩ tới việc tiết kiệm chỗ. Bài viết này sẽ hướng các bạn tới một vài thuật toán theo hướng ngược lại, tức là: các phương pháp được thiết kế chủ yếu để giảm bớt lượng không gian sử dụng mà không tốn quá nhiều thời gian chạy. | Xem tiếp |
PHƯƠNG PHÁP CHUYỂN ẢNH THEO ĐỊNH DẠNG BITMAP VỀ FILE BIT
Có nhiều bài toán đòi hỏi người lập trình phải xử lý file ảnh như: nhận dạng chữ viết tay, nhận dạng các đối tượng hình học, tính gần đúng diện tích/khoảng cách,… Bài viết này trình bày chi tiết hai bit màu (ảnh đen trắng) về file văn bản tương ứng chỉ gồm các bit 0 và 1 góp phần giải những bài toán phương pháp chuyển file ảnh theo định dạng Bitmap (*.bmp) chỉ gồm đó. | Xem tiếp |
Hashing – Phép Băm và các hàm Băm
1. Phép Băm
Một cách tiếp cận đầy đủ tới việc tìm kiếm khác với tìm kiếm trên các cấu trúc cây là phép băm. Phép Băm là một phương pháp tham chiếu trực tiếp đến các mẩu tin bằng cách thực hiện các phép chuyển đổi số học từ các khoá vào các địa chỉ bảng. Nếu chúng ta biết rằng các khóa là các số nguyên phân biệt từ 1 đến N thì chúng ta có thể lưu mẩu tin với khoá i trong vị trí i của bảng, chuẩn bị để truy xuất tức thời nhờ vào giá trị khoá. Phép bắm là sự tổng quát hoá của phương pháp tầm thường khi chúng ta không có sự hiểu biết đặc biệt về khoá (chưa có thông tin cụ thể về các giá trị khoá).
| Xem tiếp |
SẮP XẾP TOPO - MỘT BÀI TOÁN CỔ ĐIỂN
1. Sắp xếp topo:
Sắp xếp topo (topological sorting) là một trong những bài toán có tính ứng dụng cao cả trong Tin học lẫn Toán học và đời sống thường ngày. Đây là quá trình sắp xếp một dãy các phần tử sao cho thứ tự mới vẫn đảm bảo được thứ tự cục bộ (một cách nôm na có nghĩa là thứ tự được xác định đối với một vài cặp phần tử chứ không phải là tất cả các phần tử) vốn có của chúng. Một số ví dụ sẽ minh hoạ điều này | Xem tiếp |
Xích ngăn vách và Dò tuyến tính
1. Xích ngăn vách
Hoạt động của hàm băm là đổi các khoá thành các địa chỉ bảng, chúng ta cần xử lý tổng hợp hai cách áp đến cùng một địa chỉ. Phương pháp đơn giản nhất có thể nghĩ đến ngay là xây dựng một danh sách liên kết các mẩu tin mà khóa của chúng áp với địa chỉ đó. Bởi các khoá mà áp đến cùng một vị trí trên bảng được lưu trong một danh sách liên kết, chúng cũng phải được lưu theo thứ tự. Điều này đưa đến một sự tổng quát của phương pháp tìm kiếm trên danh sách. | Xem tiếp |
Lăn tăn, lèo tèo Toán và Tin
Trong dân gian có câu
Cây lăn tăn khó ăn dễ trèo
Cây lèo tèo khó trèo dễ ăn
Vận dụng trong học tập, câu này có thể hiểu là có những bài Toán Tin khá dễ hiểu nhưng giải thì khó lắm, ngược lại, có những bài, khi đọc đề thì toát mồ hôi, dựng tóc gáy, nhưng khi sờ tay vào bàn phím thấy nhẹ nhàng như không, loáng cái đã giải xong. Chúng ta thử xem bài sau đây là lăn tăn hay lèo tèo nhé | Xem tiếp |
|
|