1. Trang chủ
  2. » Luận Văn - Báo Cáo

XỬ LÝ DỮ LIỆU LỚN TRONG LẬP TRÌNH

29 4,4K 30

Đ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 274 KB

Nội dung

Đề tài nghiên cứu Kỹ thuật xử lý, tính toán với dữ liệu lớn trong lập trình, áp dụng vào lập trình giải các bài toán với mức độ dữ liệu rất lớn, thường thấy trong các kì thi chọn học sinh giỏi môn Tin học các cấp...

Trang 1

6 Không gian của đối tượng nghiên cứu 4

5 Ứng dụng vào thực tiễn công tác giảng dạy 23

5.1 Quá trình áp dụng của bản thân 23

Trang 3

Phần I: ĐẶT VẤN ĐỀ

1 Lý do chọn đề tài

Trong những năm gần đây ngành giáo dục và đào tạo là tiêu điểm của

sự quan tâm, chú ý của xã hội Việc nâng cao chất lượng giáo dục là vấn đềkhông chỉ của ngành giáo dục mà còn được toàn xã hội quan tâm đặc biệtqua các kỳ đại hội Đảng, các kì họp Quốc hội " Đổi mới căn bản và toàndiện ngành giáo dục" là vấn đề cấp thiết của ngành giáo dục để từng bướcnâng cao chất lượng giáo dục Chính vì lẽ đó mà nó là một phần quan trọngtrong chủ đề của nhiều năm học Để nâng cao chất lượng giáo dục cần đầu

tư nâng cao chất lượng đại trà bằng nhiều phương pháp, song đầu tư chochất lượng mũi nhọn để phát hiện, chọn lựa và bồi dưỡng học sinh giỏicũng là một vấn đề hết sức quan trọng

Bồi dưỡng học sinh giỏi là nhiệm vụ khó không chỉ từ việc lựa chọn họcsinh, lựa chọn phương pháp mà vì nó đòi hỏi nhiều kiến thức, kĩ năng vận dụngcao, đề thi tập trung khai thác sâu kiến thức không chỉ ở cấp học THCS mà còn

cả ở cấp THPT, thậm chí cả đề thi Đại học, đề thi học sinh giỏi cấp THPT, cấpQuốc gia Riêng môn tin học là một bộ môn rất mới được đưa vào trường THCS

và đa số trang thiết bị tin học tại các nhà trường còn hạn chế cho nên việc tiếpcận, giảng dạy, học tập bộ môn này của giáo viên và học sinh còn rất nhiều khókhăn Với việc giáo dục đại trà bộ môn Tin học còn vất vả và khó khăn thì côngtác phát hiện, bồi dưỡng đối tượng học sinh giỏi ở bộ môn này còn gặp nhiềukhó khăn hơn nữa Trên tài nguyên mạng hay tài liệu đã có nhiều phương pháp

sử lý, giải bài toán tin được giáo viên và học sinh sử dụng khi bồi dưỡng họcsinh giỏi như: Các phương pháp giải bài toán tin, các phương pháp sử lý dữ liệukiểu số, kiểu xâu; Các chuyên đề duyệt, sử lý thuật toán…

Qua việc tham khảo những đề thi học sinh giỏi gần đây đặc biệt là cáccuộc thi học sinh giỏi lớp 9 cấp tỉnh thì xu hướng sử dụng các đề thi sử lý, tínhtoán với dữ liệu lớn vượt qua giới hạn các kiểu số Real, Longint của Pascal hayInt32, Int64 của Free Pascal với các số có hàng chục, hàng trăm con số ngàycàng áp dụng rộng rãi Với ưu điểm dùng được cho các bài toán phức tạp xảy raqua nhiều quá trình tính toán, phát huy tối đa khả năng tư duy, vận dụng kiếnthức toán học phải tốt mới có thể sử lý quét hết các trường hợp của bài toán.Điều đặc biệt lý thú của những dạng bài toán này là có những bài toán khôngcần phải có cấu trúc lập trình phức tạp, hay ghe ghớm gì lắm, code của chươngtrình ngắn thậm chí chỉ cần vài dòng code là có thể sử lý bài toán một cách hiệuquả… nên được đưa vào trong nhiều đề thi chọn học sinh giỏi các cấp, các khốihọc không chỉ đối với học sinh giỏi Tin học lớp 9

Chính vì vậy tôi mạnh dạn nghiên cứu và đưa vào chương trình bồi dưỡng

học sinh giỏi bộ môn Tin học cấp THCS chuyên đề: “Xử lý dữ liệu lớn trong một số bài toán tin”

Trang 4

2 Mục đích của đề tài

Phân dạng các bài toán tin học có liên quan đến việc sử lý dữ liệu lớn, rấtlớn nhằm nâng cao chất lượng học sinh giỏi

3 Nhiệm vụ nghiên cứu.

- Nêu lên được cơ sở lý luận của chuyên đề

- Tiến hành điều tra tình hình nắm vững kiến thức cơ bản của học sinhgiỏi

- Hệ thống bài toán Tin học theo từng dạng

- Qua bài tập giúp các em tích cực, chủ động chiếm lĩnh tri thức rèn luyện kĩnăng

4 Đối tượng nghiên cứu:

Học sinh giỏi lớp 9

5 Phương pháp nghiên cứu.

Trong đề tài này tôi đã vận dụng các phương pháp nghiên cứu khoa họcnhư: Phân tích lý thuyết, tổng kết kinh nghiệm sư phạm Tham khảo các tài liệulấy từ nhiều nguồn nhất là các học liệu mở trên mạng thông tin Internet và phântích một cách có hệ thống các dạng bài toán theo nội dung đã đề ra

Trên cơ sở đó tôi đã trình bày các dạng bài toán tin học đã sưu tầm vànghiên cứu để nâng cao khả năng, trí tuệ của học sinh

6 Giới hạn về không gian của đối tượng: Trường THCS Thái Hòa

7 Phạm vi và kế hoạch nghiên cứu

- Đối tượng: học sinh lớp 9

- Dự kiến số tiết bồi dưỡng: 9 tiết

Trang 5

Phần II: NỘI DUNG

1 Cơ sở lý luận của đề tài:

1.1 Dữ liệu kiểu số và độ lớn của dữ liệu kiểu số:

- Dữ liệu kiểu số là một dạng dữ liệu sử dụng để tính toán trong lập trìnhđối với mỗi ngôn ngữ lập trình thì kiểu số được định nghĩa, giới hạn của nó có

sự khác nhau Trong phạm vi chuyên đề này tôi xin đưa ra dữ liệu kiểu số củangôn ngữ lập trình Pascal và Free Pascal, đối với Free Pascal thì độ lớn dữ liệukiểu số lớn hơn Pascal có thể đảm bảo yêu cầu của một số bài toán

- Với Pascal ta có 2 kiểu số là số thực và số nguyên thường được sử dụngnhư bảng sau:

1.2 Các phép toán với kiểu dữ liệu này

Sử dụng các phép toán số học thuần thúy:

Trang 6

-3 Nhân *

Với dữ liệu không lớn thì sử lý bình thường là có thể vét hết các Test củabài toán, nhưng khi dữ liệu lớn thì kết quả của các phép tình trên sẽ cho ra một

số liệu tương đối lớn đa số vượt quá giới hạn cho phép của ngôn ngữ lập trình ởđây tôi nói đến Free Pascal là độ lớn dữ liệu là lớn nhất

Vấn đề đặt ra ở đây là làm thế nào để sử lý những bài toán đó, ta có thể sửdụng một trong các phương pháp sau:

* Tối ưu quá trình tính toán: Áp dụng kiến thức toán học thông thường

để giải quyết bài toán

* Sử dụng dữ liệu kiểu xâu: Để biểu diễn số và lưu kết quả tính toán,

trong Free Pascal thì dữ liệu kiểu xâu ký tự không hạn chế độ dài nên ta có thể

sử lý những con số rất lớn đến hàng trăm, hàng nghìn chữ số

1.3.Áp dụng các phương pháp này:

1.3.1: Tối ưu hóa quá trình tính toán.

- Phương pháp này ta vận dụng hết khả năng toán học vào để từ bài toán

sử lý số rất lớn sang sử lý nhiều bài toán có độ lớn dữ liệu nhỏ hơn, đảm bảokhông bị tràn dữ liệu, vét hết các khả năng của bài toán

- Ví dụ: Đề thi HSG Tin học lớp 9 năm học 2013-2014 của tỉnh VĩnhPhúc bài số 2 đếm số hình vuông

Ở bài này sau khi phân tích ta rút ra được công thức tổng quát để tính sốhình vuông là: ( 1)(2 1)

- Vấn đề 1: Sử lý nội hàm tích S=n(n+1)(2n+1), tích này luôn luôn chia

hết cho 6 bằng cách ta xét tính chia hết của từng phần tử trong tích cho 2 và 3,nếu một phần tử nào chia hết cho 2 hoặc 3 thì một trong các phần tử còn lại sẽchia hết cho 3 hoặc 2

- Vấn đề 2: Thực hiện phép chia lấy dư với 2013, áp dụng lý thuyết đồng

dư ta lấy tổng dư của từng phần tử của S cho 2013 chia cho 2013 lấy dư ta sẽ thuđược kết quả mà dữ liệu không bị tràn

Trang 7

- Với khả năng không hạn chế độ dài xâu ký tự trong Free Pascal thì mọi

số ta có thể biểu diễn được dưới dạng xâu và sử lý nó với các phép toán số học

Ví dụ: Ta có hai số A(a1a2a3 an) và số B(b1b2b3 bn) mỗi số lần lượt có độdài là N và M, giả sử (N>M)

Ý tưởng: Ta cần có ba xâu A,B,S để biểu diễn cho các số A,B và kết quảcủa các phép tính

* Đối với phép tính cộng:

- Để sử lý vấn đề này ta tiến hành theo hai bước:

+ Bước 1: Điền đầy |N-M| giá trị 0 vào trước số có độ dài nhỏ hơn để

được hai số có độ dài bằng nhau bằng N

+ Bước 2: Thực hiện duyệt ngược 2 xâu đó mỗi bước duyệt lấy ở mỗi xâu

một ký tự để thực hiện tính cộng và lưu ý sử dụng biến nhớ để công thêm vàokết quả cho những giá trị lớn hơn 10 có nhớ và phép cộng trở nên rất đơn giảnvới các số trong phạm vi 10

* Đối với phép tính trừ:

Với phép trừ ta luôn luôn lấy số có độ dài lớn hơn trừ đi số có độ dài nhỏhơn để phép trừ trở nên đơn giản, ta thực hiện duyệt ngược hai xâu sau đó thựchiện phép trừ:

- Trong đó: - ai,bi là chữ số thứ i

- du: Là số dư của phép trừ trước ai-1-bi-1

- Cso=10 để ai-bi >0

* Đối với phép tính nhân:

- Nếu ta thực hiện nhân hai xâu với nhau thì độ phức tạp thuật toán rất lớn

và thời gian chạy sẽ rất lâu nếu các số đem nhân là tương đối lớn

Ý tưởng thuật toán:

- Cắt B thành M số

- Tiến hành nhân từng số cắt được của B với xâu A

- Tiến hành cộng các xâu lại sau khi nhân ta thu được kết quả của phépnhân

* Đối với phép tính chia:

- Trong các phép toán thì phép chia phức tạp và khó cài đặt mã nguồn hơn,nhưng thực chất vẫn là áp dụng phép trừ để tính toán

- Ý tưởng cắt lần lượt từng "đoạn" của số bị chia tính từ bên trái (có cộngthêm phần dư của các bước trung gian)

- Đem chia các đoạn đó cho số chia bằng phép toán trừ

- Thương tìm được chính là dãy các số là kết quả của phép chia các "đoạn"cho số chia (được phát triển dần về phía bên phải)

Trang 8

- Phần dư của phép chia chính là "đoạn" còn lại không thể chia được nữa

Trang 9

1.4 Chú ý

- Chủ yếu áp dụng cho các bài toán cần phải sử lý dữ liệu lớn

- Cần xác định rõ giới hạn dữ liệu của từng bài toán để lựa chọn phươngpháp phù hợp tránh tình trạng lãng phí bộ nhớ trong tính toán dẫn đến vi phạmthời gian chạy test

- Với ngôn ngữ lập trình Pascal thì số lớn nhất có thể biểu diễn ở dạngString có độ dài 255 ký tự cho nên số lớn nhất trong tính toán nhỏ hơn 255 chữsố

- Còn đối với Free Pascal thì số chữ số của một số là không có giới hạn vớikiểu Ansistring ;

- Cho nên tùy từng bài toán ta có thể lựa chọn Pascal hay Free Pascal

Đa số những năm gần đây mục tiêu của các bài toán hầu hết yêu cầu họcsinh phải sử lý tốt được dữ liệu lớn, bằng cách nào, bằng phương pháp nào đểđạt được mục đích, đây chính là cơ sở cho việc tổ chức dữ liệu mà sau này các

em sẽ gặp nhiều trong các bài toán tin hay trong lập trình phần mềm ứng dụng

3 Giải pháp mới sáng tạo:

Việc chọn lọc và phân loại một số các bài tập theo các dạng cơ bản áp dụngcác thủ thuật xử lý dữ liệu lớn, tìm cách giải cho từng dạng này góp phần nângcao hứng thú của các em đối với môn học

Với việc phân tích bài toán theo chiều toán học thuần thúy giúp các em tưduy toán học tốt, đôi khi có những bài toán tưởng chừng như phức tạp nhưng với

tư duy toán học tốt thì việc giải quyết bài toán lại càng chở nên đơn giản

3.1 Các dạng bài tập thường gặp:

* Tất cả các bài toán tìm số

* Một số bài toán tối ưu

* Một số bài toán chia để trị

Nói chung bất kỳ bài toán nào liên quan tới quá trình tính toán thì đều

áp dụng phương pháp này để cho lời giải tốt nhất.

3.2 Các ví dụ minh hoạ :

Ví dụ 1: Đề thi HSG Tin học lớp 9 năm 2013-2014 SGD Vĩnh Phúc.

Cho một bảng hình vuông kích thước NxN (N< 1018) được chia lưới vuông đơn vị, các vị trí đỉnh của các hình vuông đơn vị được coi là các mắt lưới Người

ta muốn đếm số hình vuông thỏa mãn hai điều kiện sau:

Trang 10

+ Mỗi cạnh của hình vuông phải song song với một trong hai cạnh bảng+ Tất cả 4 đỉnh của hình vuông phải nằm tại vị trí của các mắt lưới.

Vì số lượng hình vuông là rất lớn cho nên ta chỉ phải ghi kết quả là số dư của phép chia số lượng hình vuông đếm được cho 2013

GIẢI

- Phân tích bài toán ta rút ra:

Với hình vuông n*n sẽ có các loại ô vuông có đơn vị từ 1 đến n và:

- Vấn đề 1: Sử lý nội hàm tích S=n(n+1)(2n+1), tích này luôn luôn chia

hết cho 6 bằng cách ta xét tính chia hết của từng phần tử trong tích cho 2 và 3,nếu một phần tử nào chia hết cho 2 hoặc 3 thì một trong các phần tử còn lại sẽchia hết cho 3 hoặc 2

- Vấn đề 2: Thực hiện phép chia lấy dư với 2013, áp dụng lý thuyết đồng

dư ta lấy tổng dư của từng phần tử của S cho 2013 chia cho 2013 lấy dư ta sẽ thuđược kết quả mà dữ liệu không bị tràn

Trang 11

Assign(fi, InputFile); Reset(fi);

Assign(fo, OutputFile); Rewrite(fo);

While not SeekEof(fi) do

Ví dụ 2: Cho hai số nguyên có dạng A(a1a2a3 an) và số B(b1b2b3 bn) mỗi

số lần lượt có độ dài là N và M, giả sử (N>M) Lập trình tính tổng hai số đã cho,

dữ liệu được cho từ file Cong.inp có dạng:

Cong.inp

6565463123598775811235125321212351523959235151516

9798665983898098005152351235123521359123052

Trang 12

Kết quả được xuất trong File Cong.Out gồm 1 dòng là kết quả của phépcộng.

Cong.out

6565472922264759709333130473563586647480594274568

GIẢI

- Ta tiến hành phân tích bài toán: Với dữ liệu mẫu như trong file Cong.inp

ta nhận thấy N,M không có giới hạn tức độ lớn dữ liệu vượt qua giới hạn của cáckiểu số trong Pascal và Free Pascal cho nên nếu ta thực hiện cộng một cách bìnhthường thì dẫn đến không thể biểu diễn dữ liệu được và sẽ gặp lỗi tràn bộ nhớ

- Ta gọi N, M là số chữ số của hai số, thực hiện như sau:

+ Bước 1: Điền đầy |N-M| giá trị 0 vào trước số có độ dài nhỏ hơn để

được hai số có độ dài bằng nhau bằng N

+ Bước 2: Thực hiện duyệt ngược 2 xâu đó mỗi bước duyệt lấy ở mỗi xâu

một ký tự để thực hiện tính cộng và lưu ý sử dụng biến nhớ để công thêm vàokết quả cho những giá trị lớn hơn 10 có nhớ và phép cộng trở nên rất đơn giảnvới các số trong phạm vi 10

- Ta có mã nguồn của bài toán trên Free Pascal như sau:

Trang 13

* Nhận xét: Trong mã nguồn trên ta thấy sử dụng Ord(A[i])-48 mà không

sử dụng Val(); Vì xét thời gian truy xuất để lấy ra giá trị số của ký tự A[i] trong bảng mã ASCII sẽ nhanh hơn sử dụng hàm Val() để đổi một ký tự sang số

Ví dụ 3: Cho hai số nguyên có dạng A(a1a2a3 an) và số B(b1b2b3 bn) mỗi

số lần lượt có độ dài là N và M, giả sử (N>M) Lập trình tính hiệu hai số đã cho,

dữ liệu được cho từ file Cong.inp có dạng:

* Phân tích bài toán: Với N,M không giới hạn như bài toán này thì việc

tính toán ta cũng không thể sử dụng các kiểu dữ liệu số trong TP hay FC để làm được, cho nên xử dụng xâu để biểu diễn tính toán số là hợp lý nhất, với việc sử

Trang 14

dụng xâu thì ta đã đưa bài toán tính số vô cùng lớn thực chất về bài toán trừ hai

số trong phạm vi 10

* Ý tưởng: Xử lý theo các bước sau:

- Bước 1: Lấp đầy các ký tự ’0’ vào trước xâu B để Length(B)=Length(A)

- Bước 2: Duyệt ngược xâu A và B với mỗi bước lặp ta làm:

+ t=a[i]+Cso-b[i]-nho

+ Tính lại biến Nho, lúc này biến Nho={0,1}

+ Trong đó: t là kết quả

a[i],b[i]: Là ký tự thứ i của 2 số Cso=10 luôn đảm bảo a[i]-b[i]>0;

Nho:=0;

For i:=Length(a) downto 1 do Begin

x:=ord(a[i])-48 ; y:=ord(b[i])-48;

Trang 15

t:=x+Cso-y-nho;

z:=t mod 10;

If t>10 then nho:=0 Else nho:=1;

End;

BEGIN Input;

Ví dụ 4: Cho hai số nguyên có dạng A(a1a2a3 an) và số B(b1b2b3 bn) mỗi

số lần lượt có độ dài là N và M, giả sử (N>M) Lập trình tính tích hai số đã cho,

dữ liệu được cho từ file Tich.inp có dạng:

Tich.inp

65654631235987758112351253212123515239592351515169798665983898098005152351235123521359123052

Kết quả được xuất trong File Cong.Out gồm 1 dòng là kết quả của phépnhân

Tich.out

64332780177744678416198237092256145901792361388175819032395279719419862788502059034108346832

Giải

* Phân tích bài toán: Cũng với N,M không giới hạn như bài toán này thì

việc tính toán ta cũng không thể sử dụng các kiểu dữ liệu số trong TP hay FC để

Trang 16

làm được, cho nên lựa chọn sử dụng xâu để xử lý bài toán để đưa phép nhân số lớn thành nhân các số trong phạm vi 10;

* Ý tưởng: Xử lý theo các bước sau:

- Bước 1: Xây dựng hàm nhân 1 số với 1 xâu

- Bước 2: Xây dựng hàm cộng xâu

- Bước 3: Xây dựng hàm nhân 2 xâu bằng cách cộng các kết quả

* Mã nguồn trên Free Pascal

Trang 19

FOR o:=1 TO j2 DO xau:=xaứ0';

Ví dụ 5: Cho hai số nguyên có dạng Ăa1a2a3 an) và số B(b1b2b3 bn) mỗi

số lần lượt có độ dài là N và M, giả sử (N>M) Lập trình tính thương hai số đãcho, dữ liệu được cho từ file thương.inp có dạng:

* Phân tích ý tưởng bài toán:

- Cắt lần lượt từng "đoạn" của số bị chia tính từ bên trái (có cộng thêm phần dư của các bước trung gian)

- Đem chia các đoạn đó cho số chia bằng phép toán trừ

- Thương tìm được chính là dãy các số là kết quả của phép chia các "đoạn" cho số chia (được phát triển dần về phía bên phải)

- Phần dư của phép chia chính là "đoạn" còn lại không thể chia được nữa

Ngày đăng: 14/10/2014, 00:51

TỪ KHÓA LIÊN QUAN

w