KẾT HỢP KỸ THUẬT ĐÁNH DẤU PHẦN TỬ VÀ XỬ LÝ BÍT ĐỂ GIẢI QUYẾT MỘT SỐ BÀI TOÁN TRONG TIN HỌC Khi lập trình để giải quyết các bài toán trong tin học, có hai tài nguyên rất quan trọng đó l
Trang 1SỞ GIÁO DỤC VÀ ĐÀO TẠO QUẢNG BÌNH
Quảng Bình, năm 2013
TÀI LIỆU BỒI DƯỠNG THƯỜNG XUYÊN DÀNH CHO GIÁO VIÊN THPT
MÔN TIN HỌC
(LƯU HÀNH NỘI BỘ)
Lê Thủy Thạch Nguyễn Lê Hải
Trang 2PHẦN 1
HƯỚNG DẪN SỬ DỤNG PHẦN MỀM ADOBE CONNECT
Adobe Connect là hệ thống cho phép thực hiện:
- Họp qua web (Web Conference),
- Lớp học ảo (Virtual Classroom),
- Chia sẻ bài giảng điện tử eLearning để học trực tuyến, tạo lớp học và chương trình học
Hệ thống Adobe Connect do Cục CNTT, Bộ Giáo dục và Đào tạo thiết lập
và quản lý, có địa chỉ website là http://hop.edu.net.vn Hiện nay, có nhiều phòng họp ảo khác nhau, tương ứng phần đuôi của địa chỉ khác nhau Tại một thời điểm, tổng số người có thể nối vào hiện nay là 80 concurent user licenses Để tham gia một phòng họp hay lớp học, người sử dụng cần biết địa chỉ phòng họp Thí dụ: http://hop.edu.net.vn/quangbinh là phòng họp đã được giao cho Sở GD&ĐT Quảng Bình quyền quản lý
1 Các tính năng chính
- Phát hình video: người giảng bài
- Phát tiếng (voice, sound)
- Trình chiếu powerpoint
- Trình chiếu chia sẻ màn hình các ứng dụng khác
- Trình chiếu chia sẻ màn hình windows
- Cửa sổ trao đổi qua gõ phím (Chatting room)
- Thăm dò dư luận, bỏ phiếu (Polling, Vote)
- Bảng trắng để vẽ, viết …
- Truyền tệp (file transfer)
- Cộng tác, làm việc chung
- Diễn đàn trao đổi
- Kiểm tra kiến thức bằng thi trắc nghiệm
2 Ứng dụng của web conference
- Họp giao ban giữa Bộ với các Sở; giữa Sở với các Phòng; giữa Phòng với các trường quận/huyện
- Tập huấn phần mềm (có thể chia sẻ màn hình phần mềm cần tập huấn)
- Giảng bài từ xa
- Chia sẻ bài giảng eLearning
- Bảo vệ luận án
- Giao lưu giữa các trường trong và ngoài nước
Trang 33 Điều kiện sử dụng:
- Có đường kết nối Internet ADSL
- Có webcam nếu muốn hiển thị hình ảnh video của mình lên
cho mọi người nhìn thấy
- Có microphone (có thể tích hợp sẵn ở trong webcam như Logitech Quickcam)
- Loa máy tính
- Được thông báo địa chỉ web để họp (Cục CNTT cấp)
4 Các quyền sử dụng:
- Host: làm ông chủ, có đầy đủ quyền điều hành Người làm host có thể:
+ Cho phép các thành viên đều là presenter như sau:
+ Không cho ai vào nữa (block Incoming Attendees) + Không cho khách là gust vào (block Guest Attendees), trong khi các thành viên khác đã đăng ký vẫn được vào
Cục CNTT cấp quyền cho người làm host
- Presenter: Người trình bày, báo cáo viên
- User: Người sử dụng, đại biểu, người học
5 Đăng nhập với người sử dụng
- Đăng nhập với vai trò là khách (Enter as a Guest): Hãy gõ tên cá nhân
hoặc tên cơ quan một cách ngắn gọn Người sử dụng không cần tên và mật khẩu
- Đăng nhập với vai trò là host: (Enter with your login and password) Khi
quý vị đã được Cục CNTT cấp quyền làm chủ phòng họp (host) thì đăng nhập bằng cách chọn dòng thứ hai:
Trang 4Adobe Connect cho phép quản lý đăng nhập:
- Hoặc là vào thẳng
- Hoặc phải được ông chủ phòng họp (host) chấp thuận
Người làm chủ phòng họp có thể đặt chế độ vào thẳng hoặc phải xin phép mình
6 Màn hình đầu tiên
Nháy chuột vào đây để kích hoạt webcam
Trang 5
Nút chuyển sang chế độ “chuẩn bị bố trí mặt màn hình” Nút khóa không cho ai thay đổi bố trí mặt màn hình
7 Chọn lựa và điều chỉnh âm thanh
Việc điều chỉnh âm thanh rất quan trọng Cuộc họp thành công hay không phụ thuộc đầu tiên vào yếu tố âm thanh
a) Vỉ âm thanh trên máy tính
- Không nên dùng vỉ âm thanh có sẵn trên máy để bàn vì chất lượng kém, dễ gây tiếng vọng và nhiễu, ồn
- Nên dùng vỉ âm thanh của máy tính xách tay có chất lượng tốt hơn
- Tốt nhất nên mua vỉ âm thanh ngoài, có chất lượng rất tốt Mua hai loại: vỉ PCI và cắm USB
b) Điều khiển âm thanh trên màn hình Adobe Connect
chứa các nút điều khiển âm thanh
Nháy và giữ chuột ở nút này để bật mic phát biểu (Hold and Talk) Khi nhả chuột ra thì mic không bắt tín hiệu nữa Khi phát biểu, mức độ
to nhỏ của tín hiệu có thể hiện ở vạch mầu xanh phía dưới Trong khi nháy chuột vào nút hình khoá bên cạnh là để bật mic liên tục, tay không cần giữ chuột khi phát biểu
Nháy chuột vào nút cho ra hình sau:
Trang 6Voice off: Tắt hết mic và loa của tất cả mọi người
Voice on – Multiple Speakers: Mọi người đều có thể nói Khi này rất dễ bị
rú rít và rất ồn nếu nhiều người cùng nói
Voice on – One Speaker: Chỉ một người nói
Nháy chuột phải vào màn hình, sau đó nháy chuột trái vào chữ hiện ra là Setting để nhìn thấy:
Hãy nháy chuột vào nút hình microphone để có hình ảnh sau:
Hãy chọn nguồn tín hiệu âm thanh, ở đây là Logitech Microphone Pro 4000
Điều chỉnh Record volume về tối thiểu
8 Khắc phục hiện tượng rú rít và tiếng vọng
Để khắc phục hiện tượng loa rú rít và có tiếng vọng, ta thực hiện:
- Nháy chuột chọn chế độ Reduce Echo (giảm tiếng vọng) Điều quan trọng nhất là đẩy nút Record Volume về chế độ thích hợp, thí dụ ở đây: vặn về gần như
bé nhất vì microphone có độ nhạy cao Nói thử xem vạch xanh nhấp nháy, không nên để mức tín hiệu lên cao đến mức có mầu đỏ
- Điều chỉnh độ nhạy mic về tối thiểu, đủ dùng
- Nếu chủ động được thì chọn chế độ 1 người nói
- Khi không phát biểu nên tắt mic Không dùng chế độ hand-free
- Không bật loa quá to
- Dùng thiết bị chuyên dụng có khử tiếng vọng
- Chọn Low Volume
Nguyên tắc 1: Mỗi phòng họp chỉ cho khoảng 3-5 người được quyền bật
mic phát biểu (Presenter) Còn lại: tắt hết mic khi họ chỉ là đại biểu (Participant)
Nguyên tắc 2: Chỉ bật mic khi phát biểu để tránh tiếng rú rít và tiếng ồn,
tiếng vọng Việc các đại biểu tự tắt mic là một việc hơi khó do họ chưa có thói quen sử dụng
Trang 7Microphone: Có thể dùng mic của webcam (rất nhạy), hoặc nối mic ngoài qua vỉ mạch âm thanh Khi giáo viên giảng bài qua mạng, nên dùng mic qua vỉ mạch âm thanh vì mic này có độ nhạy thấp, bớt rú rít Mic ngoài còn có ưu điểm là
có nút tắt bật ngay ở tay nên dễ điều khiển
Nối mic ngoài vào máy tính qua bộ chuyển đổi âm thanh USB như đã trình bày ở trên
9 Đàm thoại
Nếu điều kiện cho phép, hãy chuyển sang dùng đường âm thanh đàm thoại (họp qua điện thoại) Quay số 04 62 78 78 50 và quay tiếp số hiệu phòng họp
Nếu có thuê bao điện thoại của Viettel thì quay số cước nội vùng là 1900
1563 và quay tiếp số hiệu phòng họp
Thiết bị để đàm thoại: Dùng điện thoại Panasonic 2373
Điện thoại này có ưu điểm:
- Rẻ tiền
- Có loa ngoài, đủ để 20 người họp nghe được
- Có mic nhạy
- Có nút MUTE tắt mic với đèn báo đỏ
Lưu ý 1: Nhớ lắp pin để tiếng mic và loa tốt
Lưu ý 2: Cục CNTT đã chế tạo bộ chuyển đổi, kết nối điện thoại với loa
ngoài và mic ngoài Đã cấp mẫu cho các Sở để dùng
10 Chọn video
Lần đầu tiên cắm webcam vào hoặc có nhiều nguồn tín hiệu video, hãy nháy chuột vào hình webcam để chọn thiết bị camera thích hợp
Nháy chuột vào nút để kích hoạt webcam
Về nguyên lý, có thể hiện lên rất nhiều, hằng chục hình video Mỗi hình video chiếm dung lượng khoảng 150 Kbps do Adobe Connect dùng công nghệ nén thành video flash 4 hình thì cần 600 Kbps
Nếu nhiều hình quá thì nhìn khó kĩ chi tiết và quan trọng là yêu cầu băng thông đường truyền cao lên Tuy nhiên kinh nghiệm cho thấy, nên để 2-4 hình hiện lên là vừa
11 Chọn webcam
Webcam phù hợp hiện nay là Logitech Quickcam S5500
Trang 8Thiết bị kết nối USB:
Để kết nối các loại camera
khác vào máy tính, nên mua thiết
bị chuyển đổi EasyCap của
Kworld
Có thể dùng AVerDVD
EZMaker USB2.0
Camera Pan/Titl/Zoom
Ở những phòng họp và lớp học rộng, nếu có điều kiện
kinh phí thì mua camera có tính năng điều khiển tự động,
quay ngang, quay dọc như Sony EVI D70
Trang 9Một máy tính có thể nối 2 webcam hay 2 camera, miễn sao máy tính nhận
ra là hai thiết bị USB khác nhau
Thí dụ có thể dùng 1 cái webcam Logitech + 1 cổng camera nối qua USB EasyCap
12 Chia sẻ màn hình Đây là nơi để chọn:
- Tệp powerpoint để trình chiếu, giảng bài: Nháy vào nút Documents Rồi chọn tệp powerpoint từ mục From my computer
- Chia sẻ màn hình đang làm việc nên rất dễ tổ chức tập huấn các phần mềm
- Chia sẻ màn hình trang web đang sử dụng
- Chia sẻ bảng trẳng để vẽ (whiteboard)
Chọn chế độ video
Cần chọn chế độ hình video là High Quality
Trang 10Hoặc bấm nhanh vào hình của Camera and Voice để có thể lựa chọn High-Quality Image Khi này, hình ảnh có thể chậm, giật nhưng đẹp Lý do: Khi ngồi họp, ít cử động, di động nên chọn ảnh đẹp là phù hợp nhất
Lưu ý: cẩn thận khi chọn camera off vì lúc đó không ai bật được camera
Kinh nghiệm: Lúc thử nghiệm, có thể cho hết camera bật lên Nhưng lúc họp thật, nên bật vài camera (3-4) vì càng bật nhiều, băng thông đường truyền càng đòi hỏi phải cao
Muốn xem dung lượng đường truyền đang tiêu tốn bao nhiêu, hãy nháy chuột vào nút xanh lá cây góc trên bên phải:
Latency: Thời gian trễ
13 Điều chỉnh kích thước window và bố trí mặt bằng làm việc
Việc bố trí các cửa sổ đang nhìn thấy là ngầm định ban đầu Tuy nhiên, có thể dùng chuột để di chuyển vị trí, để co kéo kích thước các cửa sổ Sau đây là một
số thí dụ khi trình bày báo cáo với powerpoint:
Trang 11Buổi họp giao ban giữa Bộ GD&ĐT với 63 Sở qua web và qua đàm thoại:
14 Điều khiển powerpoint
Panel bên phải Tắt mở panel bên phải
để điều khiển bằng tay từng trang trình chiếu
để cho chạy tự động các trang trình chiếu
Trang 12cho phép điều khiển: Phần trình chiếu powerpoint sẽ chiếm hết màn hình, hoặc Stop trình chiếu, stop chia sẻ màn hình
15 Báo hiệu xin ý kiến:
Nháy chuột vào biểu tượng để chọn các hoạt động báo hiệu ý kiến như:
- Giơ tay xin phát biểu
- Biểu quyết đồng ý
- Không đồng ý
- …
- Hoan hô
16 Thiết kế mặt bằng: Thêm bớt các cửa sổ nghiệp vụ
Nháy chuột vào mục Pod trên hàng Menu, hiện ra danh mục các cửa sổ sẽ hiện ra trên màn hình
Hiện ra hoặc tắt di:
Cửa sổ Share để nạp powerpoint, chia sẻ màn hình
Cửa sổ danh sách người tham gia Cửa sổ Camera and Voice
Cửa sổ Chat Cửa sổ Note Cửa sổ thăm dò dư luận, biểu quyết Cửa sổ up file lên để chia sẻ
Cửa sổ chia sẻ web link
Cho phép di chuyển và điều chỉnh kích thước các cửa sổ hay khoá lại
Trang 13
17 Ghi hình để phát lại
Ghi hình để phát lại
18 Sử dụng Adobe Connect với Adobe Presenter
Có thể tải các bài giảng e-Learning được soạn từ Adobe Presenter, Adobe Captivate lên Adobe Connect, biến Adobe Connect thành lớp học ảo
Hãy sử dụng Adobe Presenter để Upload bài giảng điện tử lên đây
Trang 14PHẦN 2
KẾT HỢP KỸ THUẬT ĐÁNH DẤU PHẦN TỬ VÀ XỬ LÝ BÍT ĐỂ GIẢI
QUYẾT MỘT SỐ BÀI TOÁN TRONG TIN HỌC
Khi lập trình để giải quyết các bài toán trong tin học, có hai tài nguyên rất quan trọng đó là: bộ nhớ và thời gian thực hiện chương trình Trong thực tế, hầu hết các bài toán cần giải quyết đều có dung lượng dữ liệu vào rất lớn và đòi hỏi thời gian thực hiện phải nhanh Ví dụ: Sắp xếp danh sách 20.000 học sinh dự thi tốt nghiệp THPT tăng dần theo vần ABC; Chụp ảnh biến đổi khí hậu từ vệ tinh và truyền về trung tâm dự báo thời tiết; Điều khiển máy bay không người lái
Để khắc phục những hạn chế về bộ nhớ và thời gian thực hiện chương trình khi giải quyết các bài toán lớn người ta có hai giải pháp đó là: nâng cấp phần cứng
Để cải tiến phần mềm, người ta tìm các kỹ thuật mã hóa lưu trữ dữ liệu nhằm giảm dung lượng nhớ đồng thời cải tiến thuật toán nhằm giảm thời gian thực hiện chương trình
Đối với một bài toán trong Tin học thường có rất nhiều thuật toán để giải quyết Thông thường, thuật toán giải quyết đơn giản nhất, người lập trình dễ thấy nhất sẽ là thuật toán mà máy tính phải thực hiện nhiều phép toán nhất, dẫn đến thời gian để máy thực hiện xong chương trình là rất lớn
Ngoài ra, một thuật toán trong tin học được xem là tối ưu nếu nó giải quyết được bài toán khi dữ liệu vào có dung lượng và phạm vi dữ liệu rất lớn
Khi giảng dạy, người giáo viên thông thường chỉ hướng dẫn để học sinh tìm được một thuật toán để giải quyết bài toán Hơn nữa, phạm vi và dung lượng dữ liệu trong đề bài toán mà giáo viên ra cho học sinh thường là rất hẹp Do đó, đã hình thành thói quen của học sinh là không quan tâm đến việc xem xét thời gian thực hiện của máy tính khi giải quyết bài toán theo thuật toán này
Trong các kỳ thi học sinh giỏi quốc gia và quốc tế, người ta không chỉ quan tâm đến tính chính xác của kết quả chương trình mà còn đặc biệt quan tâm đến thời gian để máy tính thực hiện xong chương trình và cho ra kết quả chính xác Có những bài toán người ta chỉ yêu cầu máy tính chạy trong một giây nhưng nếu
Trang 15không có thuật toán tốt thì có thể máy tính phải chạy hàng giờ vẫn chưa thu được kết quả
Phần này nhằm giới thiệu kỹ thuật đánh dấu phần tử kết hợp với kỹ thuật xử
lý bít để mở rộng phạm vi lưu trữ dữ liệu và đồng thời tăng tốc thuật toán của một
số bài toán trong tin học
Phần này không trình bày sâu về kỹ thuật đánh dấu phần tử mà tập trung trình bày về kỹ thuật xử lý bít và khai thác sự kết hợp hai kỹ thuật này để nâng cao tốc độ thuật toán và mở rộng phạm vi dữ liệu của một số bài toán
Nội dung chính bao gồm 2 phần:
1 Một số vấn đề cơ bản về đánh dấu phần tử và xử lý bít
2 Kết hợp kỹ thuật đánh dấu phần tử với kỹ thuật xử lý bít để mở rộng phạm vi dữ liệu và tăng tốc thuật toán khi giải một số bài toán:
+ Bài toán sắp xếp dãy số
+ Bài toán lọc dữ liệu
+ Bài toán tìm giao của hai tập hợp
Đối với mỗi loại bài toán, sau khi phát biểu bài toán, xin giới thiệu một thuật toán giải quyết dễ phát hiện nhất, lập trình theo thuật toán đó; phân tích độ phức tạp của thuật toán; đề xuất thuật toán cải tiến bằng việc ứng dụng kỹ thuật đánh dấu phần tử để tăng tốc độ thuật toán; sau đó đề xuất thuật toán ứng dụng kỹ thuật
xử lý bít để mở rộng phạm vi dữ liệu; Cuối cùng, đề tài giới thiệu chương trình tương ứng với thuật toán cải tiến
1.2 Xử lý bít
1.2.1 Khái niệm
Trang 16Trong cấu trúc lưu trữ của máy tính, mỗi byte bao gồm 8 bít được đánh số từ phải sang trái, từ 0 đến 7 Mỗi bít có thể nhận một trong hai trạng thái đóng hoặc
mở mạch điện Tương ứng với trạng thái đóng, ta mã hóa là 1 ngược lại ta mã hóa
1.2.2 Các phép toán cơ bản trên bít
bít i có giá trị là 0 thì NOT i sẽ cho giá trị là 1
và j là hai bít có giá trị (0,1) thì phép toán i OR j sẽ cho giá trị tương ứng như bảng dưới đây:
Như vậy, i OR j cho kết quả là 0 khi và chỉ khi cả hai bít i và j đều có giá trị 0
sử i và j là hai bít có giá trị (0,1) thì phép toán i AND j sẽ cho giá trị tương ứng như bảng dưới đây:
Giả sử i và j là hai bít có giá trị (0,1) thì phép toán i XOR j sẽ cho giá trị tương ứng như bảng dưới đây:
i j i XOR j
Trang 171.2.3 Một số hàm và thủ tục xây dựng trên các phép toán cơ bản
- Hàm Getbit(x,i: integer) cho giá trị của bít thứ i của số nguyên x (tính từ
Trang 18- Thủ tục Setbit(var x:byte;i:byte) gán giá trị 1 cho bít thứ i của số x
Procedure setbit(var x:byte;i:byte);
- Thủ tục hidebit(var x:byte;i:byte) gán giá trị 0 cho bít thứ i của số x
Procedure hidebit(var x:byte;i:byte);
Begin
x:= x AND (NOT(1 shl i));
End;
Phương pháp: Dich chuyển bít 1 đến vị trí i tương ứng sau đó đảo byte này
để được byte có giá trị 0 ở bít i và giá trị 1 trong các bit còn lại Cuối cùng thực hiện phép nhân logic với byte x
II Kết hợp kỹ thuật đánh dấu phần tử với xử lý bít để giải quyết một số bài toán trong Tin học
2.1 Bài toán sắp xếp
Sắp xếp dữ liệu đóng vai trò rất quan trọng trong xữ lý thông tin Ý nghĩa thực tiễn của việc sắp xếp là nhằm dễ dàng tìm kiếm thông tin cần thiết
2.1.1 Mô tả bài toán: Có N học sinh (1 < N < 32000) Mỗi học sinh có một mã số
là một số nguyên dương đôi một khác nhau (1 < ai < 32000) Hãy sắp các học sinh trên tăng dần theo mã số của học sinh
2.1.2 Phân tích:
a Phương án đơn giản:
+ Thuật toán đơn giản: (T1)
Thuật toán đơn giản nhất và dễ thấy nhất thường được sử dụng để giải quyết bài toán này như sau::
Bước 1: Lấy phần tử đầu tiên a1 so sánh với lần lượt từng phần tử thứ 2 đến cuối dãy (aj)
Trang 19Bước 2: Nếu a1>ạ thì thực hiện đổi chỗ hai phần tử đó cho nhau
Bước 3: Xem phần tử thứ hai là phần tử đầu tiên, lặp lại thực hiện Bước 1 Bước 4: In kết quả
+ Chương trình biểu diễn của thuật toán T1:
if a^[i]>a^[j] then begin
t:=a^[i]; a^[i]:=a^[j]; a^[j]:=t;
Trang 20nhiều thời gian mới sắp xếp được dãy số (với N=32000, thời gian thực hiện khoảng 14 giây)
- Để giải quyết được bài toán này khi N lớn trong một khoảng thời gian rất nhỏ, ta sử dụng kỹ thuật đánh dấu phần tử
- Ta cần chú ý đến một giả thiết quan trọng trong bài toán đặt ra là “các phần
tử đôi một khác nhau”, nghĩa là trong dãy không có phần tử nào trùng nhau Đối với bài toán sắp xếp có phần tử trùng nhau ta không sử dụng được kỹ thuật này
b Phương pháp cải tiến: P2-Phương pháp đánh dấu trên byte
+ Dữ liệu: Sử dụng một mảng A gồm 32000 phần tử, các phần tử có kiểu byte
ý nghĩa: A[i] = 1 có nghĩa i là phần tử có trong dãy, A[i] = 0 có nghĩa i là phần tử không có trong dãy
+ Thuật toán cải tiến: (T2)
+ Khởi động mọi giá trị của A[] là 0 {Giống như giả sử ban đầu mọi phần tử đều không thuộc dãy số}
+ Đọc từng phần tử của dãy số, giả sử số thứ j của dãy là X, ta đánh dấu phần tử A[X] = 1 {Xác nhận số X thuộc dãy số} Thực hiện đánh dấu cho đến khi đọc hết dãy số Khi đó ta thu được một mảng A[] trong đó A[i] = 1 tại các chỉ số i
có giá trị bằng giá trị các phần tử trong dãy số
+ Duyệt từ đầu mảng đến cuối mảng, nếu vị trí vào có giá trị 1 thì ta xuất chỉ
số đó ra Kết quả ta được một dãy số được sắp xếp tăng dần
+ Chương trình biểu diễn thuật toán T2:
Trang 21- Độ phức tạp của thuật toán này là O(n)
- Khi N = 32000 chương trình thực hiện trong khoảng 0.05giây, chương trình này thực hiện nhanh gấp 280 lần so với chương trình đã viết theo thuật toán T1
- Trong thực tế N có thể lớn hơn rất nhiều Khi N > 32767 thì chương trình trên không thể thực hiện được trên môi trường lập trình Turbo Passcal vì không đủ
bộ nhớ để khai báo biến lưu trữ dữ liệu là mã số của học sinh
c Phương pháp cải tiến: P3-Phương pháp đánh dấu trên bít
+ Dữ liệu: Sử dụng một mảng A gồm 32000 phần tử, các phần tử có kiểu byte
ý nghĩa: bít thứ i của phần tử A[j] = 1 có nghĩa là giá trị i*8+j có trong dãy, bít thứ
i của phần tử A[j] = 0 có nghĩa là giá trị i*8+j không có trong dãy
+ Thuật toán cải tiến: T3
Bước 1 : Khởi động mọi giá trị của A[] là 0 {Giống như giả sử ban đầu mọi phần tử đều không thuộc dãy số}
Bước 2 : (đọc và đặt bít)
+ Đọc từng phần tử của dãy số, giả sử số thứ j của dãy là X
+ Xác định chỉ số của phần tử chứa bít cần đánh dấu: by := x div 8
+ Xác định chỉ số của bít cần đánh dấu: bi := x mod 8
+ Sử dụng thủ tục setbit(by,bi) để đặt bít bi của byte by thành 1
Trang 22Bước 3 : Thực hiện lặp lại Bước 2 cho đến khi đọc hết dãy số Khi đó ta thu được một mảng A[] trong đó bít thứ bi của phần tử A[by] = 1 nếu giá trị by*8+bi
có trong dãy số
Bước 4 : (In ra)
+ Duyệt từ phần tử đầu tiên đến phần tử cuối cùng của mảng A Đối với phần tử thứ i (i=0 n), ta xác định bít thứ j (j=0 7) Nếu bít j có giá trị bằng 1 thì ta thực hiện in giá trị i*8+j ra màn hình (hoặc xuất ra file) Kết quả thu được là dãy số sau khi được sắp xếp
+ Chương trình biểu diễn thuật toán T3:
Trang 23- Như vậy, việc kết hợp kỹ thuật đánh dấu phần tử và kỹ thuật xử lý bít có ý nghĩa rất quan trọng trong việc giảm thời gian thực hiện chương trình và mở rộng phạm vi dữ liệu của bài toán sắp xếp
2.2 Bài toán lọc dữ liệu
Lọc dữ liệu là một bài toán có ý nghĩa thực tiễn rất lớn trong xử lý thông tin
Ý nghĩa thực tiễn của lọc dữ liệu là nhằm loại bỏ các dữ liệu trùng lặp, dư thừa, không cần thiết, từ đó dễ dàng thu được thông tin cần tìm
2.2.1 Mô tả bài toán: Cho một tập gồm N phần tử (1<=N<=32000), trong đó các
phần tử có kiểu nguyên nằm trong [1 32000], giá trị của các phần tử có thể bằng nhau Hãy lọc ra từ tập số trên một tập con gồm nhiều phần tử nhất sao cho các
Trang 242.2.2 Phân tích
a Phương pháp đơn giản:
+ Thuật toán T1:
Bước 1: Đọc từng phần tử của dãy số đã cho, giả sử số đọc được là X
Bước 2: Kiểm tra xem X đã có trong B[] hay chưa Nếu X chưa có trong B[] thì đặt vào cuối cùng của B[] Sau đó, quay lại bước 1
Bước 3: In mảng B
+ Nhận xét 1:
- Độ phức tạp của thuật toán T1 là O(N2)
- Khi N bé, thuật toán trên có thể chấp nhận được Tuy nhiên, trong nhiều trường hợp N rất lớn, chẳng hạn N=32000 phần tử máy sẽ thực hiện trong rất nhiều thời gian để lấy từng phần tử trong dãy để so sánh với các phần tử trong tập B[]
- Để giải quyết được bài toán này khi N lớn trong một khoảng thời gian rất nhỏ, ta sử dụng kỹ thuật đánh dấu phần tử
b Phương pháp cải tiến: P2-Đánh dấu trên byte
+ Dữ liệu:
Sử dụng một mảng B gồm 32000 phần tử, các phần tử có kiểu byte
ý nghĩa: B[i]=1 có nghĩa i là phần tử được chọn, B[i]=0 có nghĩa i là phần tử
không được chọn
+ Thuật toán cải tiến: T2
Bước 1: Khởi động mọi giá trị của B[] là 0 {Giống như giả sử ban đầu ta chưa chọn phần tử nào cả}
Bước 2: Đọc từng phần tử của dãy số, giả sử số thứ j của dãy là X
Bước 3: Đánh dấu phần tử B[X]=1 {Xác nhận số X được chọn} Quay lại bước 2
{Thực hiện đọc và đánh dấu cho đến phần tử cuối cùng Khi đó, ta thu được một mảng B[] trong đó B[i]=1 tại các chỉ số i mà ít nhất i xuất hiện một lần trong dãy đã cho}