You are on page 1of 4

ĐẾM PHÂN PHỐI

MỤC ĐÍCH :
Đếm phân phối là chỉ ra tần suất xuất hiện của phần tử X trong một mảng hoặc một
xâu .
Ví dụ 1: Mảng a gồm a[1]=3, a[2] ]=4,a[3] =3..
Thì tần số xuất hiện của
x=3 trong mảng là 2
x=4 trong mảng là 1…
THUẬT TOÁN VÀ Ý TƯỞNG:
Ta sử dụng một mảng d làm mảng đếm mà trong đó
X chính là chỉ số của d
Tần số xuất hiện của X là giá trị của d
ở ví dụ 1 d[3]=2, d[4]=1,..
Thuật toán :
Vậy ban đầu ta khởi tạo tất cả giá trị của mảng d là 0;
Sau đó ta duyệt từng phần tử của mảng a tại mỗi a[i] ta tăng giá trị d[a[i] ] lên 1.
Sau khi kết thúc duyệt ta muốn kiểm tra tần số xuất hiện của X trong mảng a thì
chính là giá trị của d[x].
Code:
Khởi tạo tất cả giá trị của mảng d bằng 0 thì
Cách 1: fillchar(d,sizeof(d),0); //dùng fillcharr(tìm hiểu ở gg);
Cách 2 : for i:= 1 to N do d[i]: =0; // dùng for khi biết được giới hạn mảng d;
Duyệt và đếm phân phối mảng a
For i: = 1 to N do inc(d[a[i] ]);
MỘT SỐ BÀI TẬP ỨNG DỤNG
Bài 1: sử dụng đếm phân phối để sắp xếp mảng tăng dần.
Bước 1: ta đếm phân phối để biết tần số xuất hiện của a[i]. Và tìm max của mảng a.
Bước 2 : ta for i:=1 to max và tại mỗi d[i]<>0 thì ta in ra i bằng số lần d[i].
Code :
Begin
Fillchar (d,sizeof(d),0); // khoi tao mang d
Readln(n);
For i: =1 to N do read(a[i]);
// tim max cua mang a
max:=a[1];
for i:=1 to n do if a[i]>max then max:=a[i];
// dem phan phoi mang a
For i:=1 to N do inc(d[a[i]]);
// in ra mang a theo thu tu tanng dan
for i:=1 to max do
if d[i]<>0 then // kiem tra i co thuoc mang a hay khong?
for i:=1 to d[i] do write(i,' '); //in ra i voi so lan xuaat hien cua i
readln
end.
Bài 2: Cho một mảng a . Tìm phần tử xuất hiện nhiều nhất trong mảng.
Hướng giải : bài này cơ bản là đếm phân phối mảng d. ta tìm thằng x mà khi đó d[x]
chính là max của mảng d.
Code:
Begin
Fillchar (d,sizeof(d),0); // khoi tao mang d
Readln(N);
For i: =1 to N do read(a[i]);
// dem phan phoi mang a
For i:=1 to N do inc(d[a[i]]);
// tim thang xuat hien nhieu nhat .
max:=0;
for i:=1 to N do
if d[i]>max then
begin
max:=d[a[i]]; // luu lai gia tri max hien tai
x:=a[i]; // luu lai thang a[i] xuat hien nhieu nhat hien tai
end.
write(x) // cuoi cung thang x chinh la thang xuat hien nhieu nhat
end.
Bài 3 : Bài maraton hồi sáng.
Để giải bài này thì ta cũng như bài 1 . Bài này cốt lõi là tìm xem từ 1 đến max mảng a có
Bao nhiêu số xuất hiện
Ta sẽ đếm phân phối sau đó tìm max. Khởi tạo một biến đếm.
Sau đó ta duyệt d[1] đến d[max] nếu thằng nào lớn hơn 0 thì tăng biến đếm lên 1.
Cuối cùng biến đếm là cách chọn.
Code :
Begin
Fillchar (d,sizeof(d),0); // khoi tao mang d
Readln(n);
For i: =1 to N do read(a[i]);
// dem phan phoi mang a
For i:=1 to N do inc(d[a[i]]);
// tim max của mảng a
max:=a[1];
for i:=1 to n do if a[i]>max then max:=a[i];
// tim cac so từ 1 nơi max có xuất hiện trong mảng a
dem:=0;
for i:=1 to do
if d[i]<>0 then inc(dem);
write(dem)
end.
Bài 4

You might also like