Kỹ thuật mảng đánh dấu trong lập trình là gì năm 2024

  1. tạo mảng đánh dấu
    VD cho số n='9125439';viết chuong trình tạo mảng đánh dấu là (số nào max đánh số 1, min dần đánh số 2...3.4,5...)

    Voi n như trên thì mảng đánh dấu a tuong ứng là: a[7]========= 1 6 5 2 3 4 1

    -
  2. > Bài này có được sort hay dùng mảng tạm không ? -
  3. > à duong nhien là mảng tạm OK chi có là ("không duoc SORT ") -
  4. > Bài này tu tuong đon gian thôi Dùng 1 mang đánh dâ'u là d, và 1 biê'n là s,

B1: khoi ta.o: s := 0. B2: Tìm sô' 9 đâ`u tiên,nêu' có, g/s vi tri' là i => tăng s lên 1, d[i] := s; Tiê'p tuc tìm các sô' 9 còn lai, nê'u có => d[j] = s; Thuc hiê.n vòng la.p vo'i sô' 8, 7, ..., 0; \=> kê't qua. kha? năng diên đa.t cua min`h hoi kém, hi vo.ng ba.n hiê?u.

-
  1. > Biết ngay với bạn mà

    Lúc nào cũng không được sort Được sửa bởi Foolpro lúc 01:16 ngày 26-09-2007

    -
  2. > coi vay chứ sai béc à nha:

    nè: làm như you thì: d[1]=1; d[7]=7; ->SAI Y/c d[1]=1;d[7]=1

    -
  3. > Cách giải quyết: -Đọc vô biến kiểu chuỗi (tại số lớn quá). -Tạo một mảng có chiều dài bằng chiều dài chuỗi và có 2 trường giá trị (1 trường lưu giá trị của chữ số, 1 trường kiểu boolean để đánh dấu). -Một biến để ghi thứ tự đánh dấu vào. -Khởi tạo cái mảng đó bằng FALSE; biến kia=0; -For i:=1 to n do For j:=1 to n do {tìm max trong những phần tử giữ giá trị FALSE; sau mỗi lần thế thì đổi giá trị đó thành TRUE} -Cứ thế mà làm thôi. ----

    *Nói tóm lại: Nó gần giống cách BOUBLESORT nhưng mà không SORT thôi

    -
  4. > Lời giải như thế thì khỏi nói rồi !!?? -
  5. > Dùng dao mô? trâu giê't gà à!

    Nghĩ đon gian thôi, mà cách mình trên kia cũng đâu có sai nhi?

    -
  6. > Em có 1 cách không tìm theo kiểu sort hay gần giống sort gì hết ,cũng không tìm min hay Max gì luôn mà tìm theo kiểu đánh dấu cho 1 mảng các số nhập vô

char n=[9 8 1 2 4 5 6 7] và 1 mảng k cùng chiều dài với mảng trên ,mảng này đánh dấu là 0 hết làm 1 vòng lâp while ta cộng các pt mảng n với 1 phần tử nào tới 10 thì không + nữa và ta sẽ đánh dấu pt của màng k tương ứng với giá trị hạng (RANK) mỗi lần đánh dấu xong thì RANK sẽ tang lên 1 ,vòng lặp kết thúc khi nào mảng k không còn phần tữ nào chứa số 0

Code:

include "conio.h" >

include "stdio.h" >

int Continue(char *p,int n) > { > int s=false; > for(int i=0;i { > if(p[i]==0) > { > s=true; > break; > } > } > return s; > } void Marking(char *p,char *result,int n,char Mark) > { > for(int i=0;i { > if(p[i]==0&&result[i]==10) > p[i]=Mark; > } > } > void main() > { > char n[7]; > char op[7]; > int k=7; > for(int i=0;i { > op[i]=0; > } > n[0]=9; > n[1]=1; > n[2]=7; > n[3]=5; > n[4]=9; > n[5]=2; > n[6]=7; > char Mark=0; > while(Continue(op,k)) > { > for(int i=0;i { > if(n[i]<=10) > n[i]; > } > for(int i=0;i) >

{ > if(n[i]==10) > { > Mark++; > break; > } > } > Marking(op,n,k,Mark); > } > for(int i=0;i printf("%d ",op[i]); > getch(); > }

-

Đếm tần suất ký tự trong xâu và các bài toán liên quan tới sự xuất hiện của ký tự trong xâu các bạn có thể sử dụng mảng đánh dấu hoặc map. Trong bài viết này mình sẽ hướng dẫn các bạn dạng bài tập này và một vài bài tập ví dụ minh họa

NỘI DUNG :

  • Đếm tần suất ký tự bằng mảng đánh dấu
  • Đếm tần suất ký tự bằng map
  • Bài tập áp dụng
  • Video tutorial

image

1. Đếm tần suất ký tự bằng mảng đánh dấu

Để đếm xem mỗi ký tự trong xâu xuất hiện bao nhiêu lần bạn có thể sử dụng kỹ thuật mảng đánh dấu, nếu bạn chưa biết kỹ thuật này có thể tham khảo tại đây

Ý tưởng là mình sẽ sử dụng mã ASCII của các ký tự để đếm tần suất tương ứng của ký tự đó, các ký tự trong bảng mã ASCII có thứ tự từ 0 tới 255 nên bạn chỉ cần sử dụng một mảng đánh dấu có 256 phần tử là có thể đếm được tần suất.

Ví dụ khi gặp kí tự 'a' trong xâu ký tự thì bạn sẽ đếm tần suất của nó thông qua phần tử có chỉ số 97 của mảng đánh dấu, vì 'a' có mã ASCII là 97

Sau khi bạn tìm được tần suất của từng ký tự bạn có thể triển khai nhiều bài toán mở rộng khác.

Độ phức tạp : O(N)

Mã nguồn :

include "iostream"

include "string"

using namespace std; int main(){ string s = "28tech 28tech aaa"; int cnt[256] = {0}; for(int i = 0; i < s.size(); i++){

cnt[s[i]]++;  
} for(int i = 0; i < 256; i++){
if(cnt[i] != 0){  
  cout << (char)i << " xuat hien " << cnt[i] << "lan\n";  
}  
} }

Output :

xuat hien 2lan 2 xuat hien 2lan 8 xuat hien 2lan a xuat hien 3lan c xuat hien 2lan e xuat hien 2lan h xuat hien 2lan t xuat hien 2lan


2. Đếm tần suất ký tự bằng map

Ngoài cách sử dụng mảng đánh dấu bạn có thể sử dụng map, nếu bạn chưa biết cách dùng map thì có thể tham khảo tại blog của mình bài viết về map nhé.

Ý tưởng là mình sẽ dùng một map trong đó key của map sẽ lưu ký tự và value sẽ lưu tần suất tương ứng.

Cách này thì ngắn gọn tuy nhiên độ phức tạp tệ hơn so với mảng đánh dấu

Độ phức tạp : O(NlogN)

Mã nguồn :

include "iostream"

include "string"

include "map"

using namespace std; int main(){ string s = "28tech 28tech aaa"; map mp; for(int i = 0; i < s.size(); i++){

mp[s[i]]++;  
} for(pair it : mp){
cout << it.first << " xuat hien " << it.second << " lan\n";  
} }

Output :

xuat hien 2 lan 2 xuat hien 2 lan 8 xuat hien 2 lan a xuat hien 3 lan c xuat hien 2 lan e xuat hien 2 lan h xuat hien 2 lan t xuat hien 2 lan


3. Bài tập áp dụng

Bài tập 1 : Đếm số lượng ký tự khác nhau trong xâu

Bài này mình sẽ sử dụng mảng đánh dấu để đánh dấu sự xuất hiện của ký tự trong xâu sau đó đếm số lần xuất hiện của các ký tự khác nhau.

include "iostream"

include "string"

include "map"

using namespace std; int main(){ string s = "28tech 28tech aaa"; int cnt[256] = {0}; for(int i = 0; i < s.size(); i++){

cnt[s[i]] = 1;  
} int dem = 0; for(int i = 0; i < 256; i++){
dem += cnt[i];  
} cout << "So luong ki tu khac nhau : " << dem << endl; }

Output :

So luong ki tu khac nhau : 8

Bài tập 2 : Liệt kê các ký tự trong xâu và tần suất của nó theo thứ tự xuất hiện trong xâu

Trong mục 1 mình đã hướng dẫn các bạn cách duyệt theo thứ tự từ điển abc, nếu yêu cầu duyệt theo thứ tự xuất hiện trong xâu thì bạn duyệt xâu và in ra tần suất tương ứng.