Thuật toán xử lý dữ liệu lớn

4 3K 77
Thuật toán xử lý dữ liệu lớn

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

Thông tin tài liệu

Thuật toán xử lý dữ liệu lớn

Xử bài toán với dữ liệu lớnLê Văn ChươngCác bài toándữ liệu vàorất lớn, thường gây cho ta rất nhiều khó khăn. Để giải được các bài toán đó thìcần phải tìm cấu trúc dữ liệu và giải thuật thật hợp lý. Đa số các bài toándạng này thì phải vừa đọc vừa xử lý. Lấy ví dụ bài toán đơn giản sau:Bài toán: Tìmdòng đặc biệtCho một tệp văn bản có ndòng (n ≤ 100000) mỗi dòng có độ dài không quá 255 ký tự Trong đó có một dòng chỉ xuất hiện một lần duy nhất, còn các dòng còn lại có số lần xuất hiện là một số chẵn. Bạn hãy lập trình để chỉ ra dòng đặc biệt đó.Dữ liệu vào: tệp dacbiet.inp- Ghi cácdòng thông tin và kết thúc tệp bởi 1 dòng có 3 ký tự ###Dữ liệu ra: tệp dacbiet.out- Ghi radòng đặc biệt tìm đượcEx: Giải: Với dữ liệuvào rất lớn n ≤ 10000 thì giải thuật đơn giản nhất là cứ đọc một dòng bất kỳsau đó so sánh với các dòng tiếp, nếu không thấy xuất hiê.n quá 1 lần thì nóchính là dòng đặc biệt, ngược lại thì thực hiện với dòng kế tiếp. Nhưng nếudòng đặc biệtt đó là dòng cuối cùng thì số lần đọc tệp sẽ rất nhiều nên thờigian chạy chương trình cũng rất lâu. Mặt khác ta không thể lưu trữ vào mảngđượcc nên ta phải vừa đọc, vừa xử lý.Thuật toán: sử dụngphép XOR. Như ta đã biết: Dựa vào tính: Nếu A xor B với số lần thực hiện là số chẵnthì cho ta A nên ta có thuật toán để giải bài này như sau:- Dùng mộtmảng a[1 255] of byte để lưu mã ASCII của các ký tự của dòng đặc biệt- Đọc một dòngS vào và gán a[i]:=a[i] xorord(s[i]) (i chạy từ 1 đến length(s))- Viết ra dòngđặc biệtChương trình:Program dong_dac_biet;Constfi = 'dacbiet.inp';fo = 'dacbiet.out';maxn = 255;Vara : array[1 maxn] of byte;i : integer;s : String;f : Text;Procedure Init;BeginFillchar(a,sizeof(a),0);Assign(f,fi); Reset(f);End;Procedure Main;BeginWhile not eof(f) dobeginReadln(f,s);If s='###' then exit;For i:=1 to length(s) do a[i]:=a[i] xorord(s[i]);end;End;Procedure Done;BeginClose(f);Assign(f,fo);Rewrite(f);For i:=1 to maxn doif a[i]<>0 then write(f,chr(a[i]));Close(f);End;BEGINInit;Main; Done;END.Thuật toán này độ phức tạpchỉ có N nên chương trình chạy rất nhanh. Ngoài ra bài này còn có một thuậttoán nữa, không sử dụng phép xornhưng phải dùng mảng 2 chiều kích thước 255*255. Bạn đọc muốn có chương trìnhnày xin liên hệ với toà soạn hoặc với tác giả.Bài tập: Các bạn cóthể làm bài số 1 trong đề thi quốc gia 2001 (Bảng B) Cấp số cộngCho một tệp văn bản gồm N (Nrất lớn) số nguyên a1, a2, a3, ., an ; với ai <=30000. Hãy tìm trong dãy ađó mô.t dãy con dài nhất lâ.p thành mô.t dãy cấp số cô.ng.Dữ liệu vào: CAP.INP- Dòng đầughi số N- N dòngtiếp ghi các số ứng với dãy ADữ liệu ra: CAP.OUT- Dòng đầughi số M là phần tử và công sai của dãy cấp số cộng đó- M dòngtiếp theo ghi số chỉ số của các số thuộc cấp số cộng. . Xử lý bài toán với dữ liệu lớnLê Văn ChươngCác bài toán có dữ liệu vàorất lớn, thường gây cho ta rất nhiều khó khăn. Để giải được các bài toán đó. tìm cấu trúc dữ liệu và giải thuật thật hợp lý. Đa số các bài toándạng này thì phải vừa đọc vừa xử lý. Lấy ví dụ bài toán đơn giản sau:Bài toán: Tìmdòng

Ngày đăng: 11/09/2012, 15:49

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan