1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng kỹ thuật lập trình chương 3 2 trường đại học ngoại ngữ tin học tp hcm

29 1 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 1,21 MB

Nội dung

KỸ THUẬT LẬP TRÌNH CƠ BẢN Khoa Cơng nghệ thơng tin Trường Đại học Ngoại ngữ - Tin học TP.HCM (HUFLIT) KỸ THUẬT MẢNG ĐÁNH DẤU TRẠNG THÁI Kỹ thuật mảng đánh dấu trạng thái • Vấn đề: Trong nhiều tốn tin học, việc giải tốn đưa đến việc phải đánh dấu trạng thái (true/fasle) cho tập số tự nhiên {0, 1, 2, … , 𝑛 − 1}, • Ví dụ: cho 𝑛 số A = {0, 1, 2, … , 𝑛 − 1} Các tập 𝑋 𝐴 biểu diễn 𝑋 = {} 𝑋 = {3} 0 0 0 0 0 0 0 Kỹ thuật mảng đánh dấu trạng thái 𝑋 = {2,4} 0 1 0 1 0 𝑋 = {1,2,4} • Bài tốn: Sinh tập tập 𝐴 → toán đánh dấu trạng thái cho số Kỹ thuật mảng đánh dấu trạng thái • Để đánh dấu số 𝑖 có hai trạng thái dùng mảng 𝑏𝑜𝑜𝑙 bool[] states = new bool[n]; • Quy ước 𝑡𝑟𝑢𝑒 𝑠𝑡𝑎𝑡𝑒𝑠 𝑖 = ቊ 𝑓𝑎𝑙𝑠𝑒 𝑖 𝑐ó 𝑡𝑟ạ𝑛𝑔 𝑡ℎá𝑖 𝑖 𝑐ℎư𝑎 𝑐ó 𝑡𝑟ạ𝑛𝑔 𝑡ℎá𝑖 Kỹ thuật mảng đánh dấu trạng thái • Ý nghĩa giá trị 𝑠𝑡𝑎𝑡𝑢𝑠 𝑖 = 𝑡𝑟𝑢𝑒/𝑓𝑎𝑙𝑠𝑒 tùy tốn • 𝑖 thuộc tập hợp hay 𝑖 khơng thuộc tập hợp • 𝑖 xử lý xong hay 𝑖 chưa xử lý • 𝑖 số nguyên tố hay 𝑖 khơng số ngun tố • 𝑖 vị trí xét hay 𝑖 vị trí chưa xét • 𝑖 đến hay 𝑖 chưa đến •… Vận dụng • Bài toán: Liệt kê số nguyên tố • Cho số nguyên 𝑛 (1 ≤ 𝑛 ≤ 106 ) Viết chương trình liệt kê số ngun tố nhỏ hay 𝑛 • Ví dụ • 𝑛 = 10 • Các số nguyên tố nhỏ 10: 2, 3, 5, • Ví dụ • 𝑛 = 20 • Các số nguyên tố nhỏ 20: 2, 3, 5, 7, 11, 13, 17, 19 Vận dụng • Thuật tốn “Eratosthene” • Cấu trúc liệu: dùng mảng 𝑎 để đánh dấu số số nguyên tố, số số nguyên tố 𝑡𝑟𝑢𝑒 𝑎[𝑖] = ቊ 𝑓𝑎𝑙𝑠𝑒 • Ý tưởng: 𝑛ế𝑢 𝑖 𝑙à 𝑠ố 𝑛𝑔𝑢𝑦ê𝑛 𝑡ố 𝑛ế𝑢 𝑖 𝑘ℎơ𝑛𝑔 𝑝ℎả𝑖 𝑙à 𝑠ố 𝑛𝑔𝑢𝑦ê𝑛 𝑡ố • Ban đầu, có tập số {2,3, … , 𝑛} • Tại bước, chọn số nhỏ tập (số nhỏ số nguyên tố) bỏ bội số • Cải tiến • Mọi số khơng ngun tố có ước số ≤ 𝑛 → cần bỏ bội số nguyên tố ≤ 𝒏 Vận dụng • Bài tốn: Tìm tổng • Cho 𝑛 gói kẹo đánh số từ đến 𝑛 Số lượng kẹo gói cho mảng 𝑎 = (𝑎1 , 𝑎2 , … , 𝑎𝑛 ) (1 ≤ 𝑛 ≤ 200 ≤ 𝑎𝑖 ≤ 1000) Một số gói kẹo gơm lại thành phần số kẹo phần tổng số kẹo gói phần Hãy cho biết loại tổng khác phần • Ví dụ: 𝑎 = (2,5,4) Ta có phần có tổng khác • = 𝑎1 • = 𝑎3 • = 𝑎2 • = 𝑎1 + 𝑎3 • = 𝑎1 + 𝑎2 • = 𝑎2 + 𝑎3 • 11 = 𝑎1 + 𝑎2 + 𝑎3 Vận dụng • Cấu trúc liệu: dùng mảng 𝑡𝑜𝑛𝑔 để đánh dấu tổng tạo từ dãy số 𝑡𝑜𝑛𝑔[𝑖] = ቊ 𝑡𝑟𝑢𝑒 𝑓𝑎𝑙𝑠𝑒 𝑛ế𝑢 𝑖 𝑙à 𝑡ổ𝑛𝑔 đượ𝑐 sinh 𝑟𝑎 𝑛ế𝑢 𝑖 𝑘ℎô𝑛𝑔 𝑝ℎả𝑖 𝑙à 𝑡ổ𝑛𝑔 đượ𝑐 sinh 𝑟𝑎 • Ý tưởng: • Xét số 𝑎[𝑖] • Với số 𝑎[𝑖], xét tổng 𝑘 sinh (xét 𝑘 từ lớn đến nhỏ) 𝑡𝑜𝑛𝑔[𝑘 + 𝑎[𝑖]] = 𝑓𝑎𝑙𝑠𝑒 𝑡𝑜𝑛𝑔 𝑘 + 𝑎 𝑖 = 𝑡𝑟𝑢𝑒 10 Vấn đề lưu trữ • Giới hạn nhớ ứng dụng Windows 64-bit • Ứng dụng 32-bit (default) • Stack: 𝐺𝐵 • Heap: 𝟐 𝑮𝑩 • Ứng dụng 64-bit • Stack: 𝐺𝐵 • Heap: 𝟖 𝑻𝑩 int[] a = new int[500000000]; → 𝐺𝐵 int[] a = new int[1000000000]; → 𝐺𝐵 • Phân tích: Đặc trưng dãy 𝑎 = (𝑎0 , 𝑎1 , … , 𝑎𝑛−1 ) • Số lượng phần tử: 𝑛 • Đặc điểm giá trị phần tử: 𝑎𝑖 • Thứ tự 𝑎𝑖 15 Phương pháp lưu trữ chuẩn • Cách chuẩn • Đặt phần tử 𝑎 = (𝑎0 , 𝑎1 , … , 𝑎𝑛−1 ) vào mảng 𝐴[𝑛] 𝐴[0] = 𝑎0 𝐴[1] = 𝑎1 𝐴[𝑛 − 1] = 𝑎𝑛−1 • Nhận xét • Đây cách lưu trữ tự nhiên • Chúng ta đặt trực tiếp phần tử vào ô 𝐴 16 Phương pháp lưu trữ chuẩn • Ví dụ 1: 𝑎 = (9, 5, 3, 2,6,5,3) 𝐴[… ] • Ví dụ 2: 𝑎 = (3,3, 3, 4,2,4,3) 𝐴[… ] 3 17 Phương pháp lưu trữ chuẩn • Ưu điểm • Đơn giản, dễ hiểu • Lưu 𝑎𝑖 có miền giá trị lớn • Biết vị trí ban đầu phần 𝑎𝑖 dãy 𝑎 • Khuyết điểm • Khi 𝑎 chứa giá trị nhau, lưu giá trị ô riêng 18 Phương pháp mảng đếm • Cách khác • Tạo mảng 𝑐𝑜𝑢𝑛𝑡[… ] chứa giá trị đếm (counters) • Mỗi số 𝑥 dãy 𝑎 đếm vào mảng 𝑐𝑜𝑢𝑛𝑡[… ]: cách tăng giá trị đếm (trong mảng 𝑐𝑜𝑢𝑛𝑡[… ]) vị trí có 𝑖𝑛𝑑𝑒𝑥 𝑥 𝑎0 𝑎1 𝑎2 𝑎3 𝑎4 𝑎5 𝑎6 0 3 𝑐𝑜𝑢𝑛𝑡[… ] 𝟐 𝟎 𝟑 𝟐 𝟎 𝟏 𝟐 𝟑 19 Phương pháp mảng đếm • Nhận xét • Mỗi số khơng lưu trực tiếp giá trị vào mảng, mà lưu số lần xuất số • Tận dụng giống giá trị 𝑎𝑖 để tiết kiệm nhớ • Nếu 𝑎𝑖 ∈ {0,1, … , 𝑚} kích thước mảng đếm là: 𝑚 + 20 Phương pháp mảng đếm • Chương trình void Counting(int[] a, out int[] count) { m = ; count = new int [m+1]; for (int i=0; i

Ngày đăng: 21/07/2023, 16:56

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN