Showing posts with label Thuật toán khác. Show all posts
Showing posts with label Thuật toán khác. Show all posts

[Algorithms] Cây quyết định với bài toán phân loại dữ liệu

Cây quyết định với bài toán phân loại dữ liệu

Khái niệm cây quyết định

Trong lĩnh vực học máy, cây quyết định là một kiểu mô hình dự báo (predictive model), nghĩa là một ánh xạ từ các quan sát về một sự vật/hiện tượng tới các kết luận về giá trị mục tiêu của sự vật/hiện tượng. Mỗi một nút trong (internal node) tương ứng với một biến; đường nối giữa nó với nút con của nó thể hiện một giá trị cụ thể cho biến đó. Mỗi nút lá đại diện cho giá trị dự đoán của biến mục tiêu, cho trước các giá trị của các biến được biểu diễn bởi đường đi từ nút gốc tới nút lá đó. Kỹ thuật học máy dùng trong cây quyết định được gọi là học bằng cây quyết định, hay chỉ gọi với cái tên ngắn gọn là cây quyết định. [Xem thêm...]

[Algorithms] Thuật toán K-Mean trong bài toán Phân cụm dữ liệu [VB]

Thuật toán K-Mean trong bài toán Phân cụm dữ liệu


I. GIỚI THIỆU

Thuật toán K-means clustering do MacQueen giới thiệu trong tài liệu “J. Some Methods for Classification and Analysis of Multivariate Observations” năm 1967.
K-means Clustering là một thuật toán dùng trong các bài toán phân loại/nhóm n đối tượng thành k nhóm dựa trên đặc tính/thuộc tính của đối tượng (k £n nguyên, dương).
Về nguyên lý, có n đối tượng, mỗi đối tượng có m thuộc tính, ta phân chia được các đối tượng thành k nhóm dựa trên các thuộc tính của đối tượng bằng việc áp dụng thuật toán này.
Coi mỗi thuộc tính của đối tượng (đối tượng có m thuộc tính) như một toạ độ của không gian m chiều và biểu diễn đối tượng như một điểm của không gian m chiều. [Xem thêm...]

[C\C++] Tính Định thức của ma trận [Xử lý ma trận - mảng 2 chiều]

Ý tưởng thuật toán: ta tiến hành phân rã ma trận A = L.U .

Ta có: Det(A)=Det(L)*Det(U) Det(L) = 1 nên Det(A) = Det(U).

Ví dụ ma trận:



[Code Turbo C++]

#include "conio.h"
#include "iostream.h"
#define max 100

/*Nhap ma tran*/
void Nhap(float A[max][max],int n) {
  for(int i = 0; i<n; i++)
    for(int j = 0; j<n; j++) {
      cout<<"a["<<i<<"]["<<j<<"] = ";
      cin>>A[i][j];
   }
}

/*Xuat ma tran*/
void XuatMaTran(float A[max][max], int n) {
  cout<<"\n";
  for(int i=0 ; i<n; i++){
    cout<<endl;
    for(int j=0 ; j<n; j++)
      cout<<A[i][j]<<"\t";
 }
}

/*Phan ra A = LU*/
void PhanRaLU(float A[max][max], float L[max][max], float U[max][max], int n) {
  for(int k = 0; k<n; k++) {
  U[k][k] = A[k][k];
  L[k][k] = 1;
  for(int i=k+1; i<n; i++) {
    L[i][k] = A[i][k]/U[k][k];
    U[k][i] = A[k][i];
    U[i][k] = 0;
    L[k][i] = 0;
  }
  for(i = k+1; i<n; i++)
   for(int j = k+1; j<n; j++)
     A[i][j] = A[i][j]-L[i][k]*U[k][j];
  }
}

//dinh thuc ma tran tam giac
double DinhThucMaTranTamGiac(float A[max][max], int n) {
  double temp = 1;
  for(int i = 0; i<n; i++)
    temp*=A[i][i];
    return temp;
}

/*chuong trinh chinh*/
void main() {
  int n;
  float A[max][max],L[max][max],U[max][max];
  clrscr();
  cout<<"Nhap n = ";
  cin>>n;
  cout<<"Nhap ma tran A\n";
  Nhap(A,n);
  cout<<"Ma tran A vua nhap";
  XuatMaTran(A,n);
  PhanRaLU(A,L,U,n);
  cout<<"\nMa tran L";
  XuatMaTran(L,n);
  cout<<"\nMa tran U";
  XuatMaTran(U,n);
  cout<<"\nDet(A) = Det(L)*Det(U) = "<<DinhThucMaTranTamGiac(U,n);
  getch();
}


[Tải code chương trình tại đây - Lưu ý: Sau 5s, Click Bỏ qua quảng cáo (Skin Ad)]

[C\C++] Giải hệ phương trình tuyến tính dựa vào phân rã LU [Xử lý ma trận - mảng 2 chiều]

Ý tưởng giải thuật: cho hệ phương trình tuyến tính tổng quát A.X = B . Ta tiến hành phân rã A = L.U . Trong đó, L là ma trận tam giác dưới và U là ma trận tam giác trên.
Khi đó,
[Code Turbo C++]

#include "conio.h"
#include "iostream.h"
#define max 100

/*Nhap ma tran he so*/
void Nhap(float A[max][max],int n) {
 for(int i = 0; i<n; i++)
   for(int j = 0; j<n; j++) {
    cout<<"a["<<i<<"]["<<j<<"] = ";
    cin>>A[i][j];
  }
}

/*Nhap ma tran he so tu do*/
void Nhap(float B[max],int n) {
  for(int i = 0; i<n; i++) {
   cout<<"b["<<i<<"] = ";
   cin>>B[i];
 }
}

/*Xuat ma tran he so tu do*/
void Xuat(float B[max],int n) {
    cout<<"(";
    for(int i = 0; i<n-1; i++)
     cout<<B[i]<<",";
   cout<<B[n-1]<<")";
}

/*Xuat ma tran*/
void Xuat(float A[max][max], int n) {
  cout<<"\n";
  for(int i=0 ; i<n; i++){
   cout<<endl;
   for(int j=0 ; j<n; j++)
    cout<<A[i][j]<<"\t";
 }
}

/*Xuat nghiem*/
void XuatNghiem(float X[], int n, char * s) {
 cout<<"\nNghiem cua he PTTT";
 for(int i=0; i<n; i++)
   cout<<s<<i+1<<"="<<X[i];
 }

char HeTamGiacDuoi (float A[max][max], float X[max], float B[max], int n ) {
  for(int i = 0; i<n; i++) {
   if (A[i][i]!=0) {
     if (i==0)
      X[i] = B[i]/A[i][i];
    else {
     X[i] = B[i];
     for(int j=0; j<i; j++)
    X[i]=X[i]-A[i][j]*X[j];
    X[i] = X[i]/A[i][i];
   }
  } else
  return 0;
 }
 return 1;
}

char HeTamGiacTren (float A[max][max], float X[max], float B[max], int n ) {
  for(int i = n-1; i>=0; i--) {
    if (A[i][i]!=0) {
     if (i==n-1)
      X[i] = B[i]/A[i][i];
     else {
      X[i] = B[i];
      for(int j=i+1; j<n; j++)
        X[i]=X[i]-A[i][j]*X[j];
     X[i] = X[i]/A[i][i];
   }
  } else
  return 0;
 }
 return 1;
}

void PhanRaLU(float A[max][max], float L[max][max], float U[max][max], int n) {
  for(int k =0; k<n; k++) {
    U[k][k] = A[k][k];
    L[k][k] = 1;
    for(int i=k+1; i<n; i++) {
       L[i][k] = A[i][k]/U[k][k];
       U[k][i] = A[k][i];
       U[i][k] = 0;
       L[k][i] = 0;
   }
  for(i = k+1; i<n; i++)
    for(int j = k+1; j<n; j++)
      A[i][j] = A[i][j]-L[i][k]*U[k][j];
  }
}

/*Giai he phuong trinh tong quat LUX=B*/
void GiaiHePTTT(float A[max][max], float X[max], float B[max], int n) {
  float L[max][max],U[max][max], Y[max];
  cout<<"Phan ra A = L.U\n";
  PhanRaLU(A,L,U,n);
  cout<<"Ma tran L";
  Xuat(L,n);
  cout<<"\nMa tran U";
  Xuat(U,n);
  cout<<"\nGiai LY = B. Nghiem Y";
  if(HeTamGiacDuoi(L,Y,B,n)) {
    XuatNghiem(Y,n,"\ny");
    cout<<"\nGiai UX = Y. Nghiem X";
    if(HeTamGiacTren(U,X,Y,n))
      XuatNghiem(X,n,"\nx");
    else
      cout<<"\nHe pttt k co nghiem duy nhat";
   } else
     cout<<"\nHe pttt k co nghiem duy nhat";
  }
//////////////////////////
void main() {
 int n;
 float A[max][max], B[max], X[max];
 clrscr();
 cout<<"Nhap so he phuong trinh n = ";
 cin>>n;
 cout<<"Nhap ma tran he so A\n";
 Nhap(A,n);
 cout<<"Nhap ma tran he so tu do B\n";
 Nhap(B,n);
 GiaiHePTTT(A,X,B,n);
 getch();
}


[Tải code chương trình tại đây - Lưu ý: Sau 5s, Click Bỏ qua quảng cáo (Skin Ad)]

[C\C++] Thuật toán phân rã ma trận A = LU [Xử lý ma trận - mảng 2 chiều]

Bài toán: Quá trình chuyển hoá ma trận A ban đầu thành tích hai ma trận tam giác L.U dựa vào phép khử Gauss được thực hiện bằng các phép nhân ma trận. Thuật toán này được gọi là thuật toán Crout. Quá trình Crout bao gồm nhiều bước hồi quy. Nếu ma trận A có cấp n x n ta cần n -1 bước. Thuật toán được thể hiện cụ thể như sau:


[Code Turbo C++]

#include "iostream.h"
#define max 100

// ham nhap ma tran
void Nhap(float A[max][max],int n) {
 for(int i = 0; i<n; i++)
  for(int j = 0; j<n; j++) {
   cout<<"a["<<i<<"]["<<j<<"] = ";
   cin>>A[i][j];
  }
}

// ham xuat ma tran
void XuatMaTran(float A[max][max], int n) {
 cout<<"\n";
 for(int i=0 ; i<n; i++){
   cout<<endl;
   for(int j=0 ; j<n; j++)
     cout<<A[i][j]<<"\t";
  }
}

/*Phan ra A = LU*/
void PhanRaLU(float A[max][max], float L[max][max], float U[max][max], int n) {
 for(int k =0; k<n; k++) {
  U[k][k] = A[k][k];
  L[k][k] = 1;
  for(int i=k+1; i<n; i++) {
   L[i][k] = A[i][k]/U[k][k];
  U[k][i] = A[k][i];
  U[i][k] = 0;
  L[k][i] = 0;
 }
for(i = k+1; i<n; i++)
 for(int j = k+1; j<n; j++)
  A[i][j] = A[i][j]-L[i][k]*U[k][j];
  }
}

// ham chinh
void main() {
 int n;
 float A[max][max],L[max][max],U[max][max];
 clrscr();
 cout<<"Nhap n = ";
 cin>>n;
 cout<<"Nhap ma tran A\n"; 
 Nhap(A,n);
 cout<<"Ma tran A vua nhap";
 XuatMaTran(A,n);
 PhanRaLU(A,L,U,n);
 cout<<"\nMa tran L";
 XuatMaTran(L,n);
 cout<<"\nMa tran U";
 XuatMaTran(U,n);
 getch();

}

[Tải code chương trình tại đây - Lưu ý: Sau 5s, Click Bỏ qua quảng cáo (Skin Ad)]

[C\C++] Giải hệ phương trình tuyến tính dạng tam giác dưới [Xử lý ma trận - mảng 2 chiều]

Bài toán: Viết chương trình giải hệ phương trình tuyến trính dạng tam giác dưới



[Code Turbo C++]

#include "conio.h"
#include "iostream.h"
#define max 100
//Nhap ma tran tam giac duoi
void Nhap(float A[max][max],int n) {
for(int i = 0; i<n; i++)
for(int j = 0; j<=i; j++) {
cout<<"a["<<i<<"]["<<j<<"] = ";
cin>>A[i][j];
}
}
/*Nhap ma tran he so tu do*/
void Nhap(float B[max],int n) {
for(int i = 0; i<n; i++) {
cout<<"b["<<i<<"] = ";
cin>>B[i];
}
}
/*Xuat ma tran he so tu do*/
void Xuat(float B[max],int n) {
cout<<"(";
for(int i = 0; i<n-1; i++)
cout<<B[i]<<",";
cout<<B[n-1]<<")";
}
/*Xuat ma tran*/
void Xuat(float A[max][max], int n) {
cout<<"\n";
for(int i=0 ; i<n; i++){
cout<<endl;
for(int j=0 ; j<n; j++)
if(i<j)
cout<<"0\t";
else
cout<<A[i][j]<<"\t";
}
}
/*Xuat nghiem*/
void XuatNghiem(float X[], int n, char * s){
cout<<"\nNghiem cua he A.X = B\n";
for(int i=0; i<n; i++)
cout<<s<<i+1<<" = "<<X[i]<<endl;
}
/*He tam giac duoi*/
char HeTamGiacDuoi (float A[max][max], float X[max], float B[max], int n ) {
for(int i = 0; i<n; i++) {
if (A[i][i]!=0) {
if (i==0)
X[i] = B[i]/A[i][i];
else {
X[i] = B[i];
for(int j=0; j<i; j++)
X[i]=X[i]-A[i][j]*X[j];
X[i] = X[i]/A[i][i];
}
}
else
return 0;
}
return 1;
}
/*Chuong trinh chinh*/
void main() {
int n;
float A[max][max],B[max],X[max];
clrscr();
cout<<"So phuong trinh n = ";
cin>>n;
cout<<"Nhap vao ma tran tam giac duoi A\n";
Nhap(A,n);
cout<<"\nNhap vao ma tran he so B\n";
Nhap(B,n);
clrscr();
cout<<"Ma tran A";
Xuat(A,n);
cout<<"\nMa tran B\n";
Xuat(B,n);
if(HeTamGiacDuoi(A,X,B,n))
XuatNghiem(X,n,"x");
else
cout<<"\nHe phuong trinh tuyen tinh vo nghiem";
getch();
}

[Tải code chương trình tại đây - Lưu ý: Sau 5s, Click Bỏ qua quảng cáo (Skin Ad)]

[C\C++] Giải hệ phương trình tuyến tính dạng tam giác trên [Xử lý ma trận - mảng 2 chiều]

Bài toán: Viết chương trình giải hệ phương trình tuyến tính dạng tam giác trên



[Code Turbo C++ 3.0]
#include "conio.h"
#include "iostream.h"
#define max 100
//Nhap ma tran tam giac tren
void Nhap(float A[max][max],int n) {
for(int i = 0; i<n; i++)
for(int j = i; j<n; j++) {
cout<<"a["<<i<<"]["<<j<<"] = ";
cin>>A[i][j];
}
}
/*Nhap ma tran he so tu do*/
void Nhap(float B[max],int n) {
for(int i = 0; i<n; i++) {
cout<<"b["<<i<<"] = ";
cin>>B[i];
}
}
/*Xuat ma tran he so tu do*/
void Xuat(float B[max],int n) {
cout<<"(";
for(int i = 0; i<n-1; i++)
cout<<B[i]<<",";
cout<<B[n-1]<<")";
}
/*Xuat ma tran*/
void Xuat(float A[max][max], int n) {
cout<<"\n";
for(int i=0 ; i<n; i++){
cout<<endl;
for(int j=0 ; j<n; j++)
if(i>j)
cout<<"0\t";
else
cout<<A[i][j]<<"\t";
}
}
/*Xuat nghiem*/
void XuatNghiem(float X[], int n, char * s) {
cout<<"\nNghiem cua he A.X = B\n";
for(int i=0; i<n; i++)
cout<<s<<i+1<<" = "<<X[i]<<endl;
}
/*He tam giac tren*/
char HeTamGiacTren (float A[max][max], float X[max], float B[max], int n ) {
for(int i = n-1; i>=0; i--) {
if (A[i][i]!=0) {
if (i==n-1)
X[i] = B[i]/A[i][i];
else {
X[i] = B[i];
for(int j=i+1; j<n; j++)
X[i]=X[i]-A[i][j]*X[j];
X[i] = X[i]/A[i][i];
}
}
else
return 0;
}
return 1;
}
/*Chuong trinh chinh*/
void main() {
int n;
float A[max][max],B[max],X[max];
clrscr();
cout<<"So phuong trinh n = ";
cin>>n;
cout<<"Nhap vao ma tran tam giac tren A\n";
Nhap(A,n);
cout<<"\nNhap vao ma tran he so B\n";
Nhap(B,n);
clrscr();
cout<<"Ma tran A";
Xuat(A,n);
cout<<"\nMa tran B\n";
Xuat(B,n);
if(HeTamGiacTren(A,X,B,n))
XuatNghiem(X,n,"x");
else
cout<<"\nHe phuong trinh tuyen tinh vo nghiem";
getch();
}

[Tải code chương trình tại đây - Lưu ý: Sau 5s, Click Bỏ qua quảng cáo (Skin Ad)]

[C\C++] Một số phép toán cơ bản trên ma trận [Xử lý ma trận - mảng 2 chiều]

Bài toán: Viết chương trình thực hiện các phép toán trên ma trận:

[Code Turbo C++ 3.0]

#include "conio.h"
#include "iostream.h"
#define max 100
/*Nhap ma tran he so*/
void NhapMaTran(float A[max][max], int m, int n, char ch) {
for(int i = 0; i<m; i++)
for(int j = 0; j<n; j++) {
cout<<ch<<"["<<i<<"]["<<j<<"] = ";
cin>>A[i][j];
}
}
/*Xuat ma tran*/
void XuatMaTran(float A[max][max], int m, int n) {
for(int i=0 ; i<m; i++){
cout<<endl;
for(int j=0 ; j<n; j++)
cout<<A[i][j]<<"\t";
}
}
/*C = A+B*/
void CongMaTran(float A[max][max], float B[max][max], float C[max][max], int m, int n) {
for(int i = 0; i<m; i++)
for(int j = 0; j<n; j++)
C[i][j] = A[i][j]+B[i][j];
}
/*A cap mxn * B cap nxp = C cap mxp*/
void NhanMaTran(float A[max][max],float B[max][max], float C[max][max],int m,int n,int p)
{
for(int i = 0; i<m; i++)
for(int k = 0; k<p; k++) {
C[i][k]=0;
for(int j = 0; j<n; j++)
C[i][k] = C[i][k]+A[i][j]*B[j][k];
}
}
/*Chuong trinh chinh*/
void main() {
int m,n,p;
float A[max][max],B[max][max],C[max][max],D[max][max];
clrscr();
cout<<"Nhap m = ";
cin>>m;
cout<<"Nhap n = ";
cin>>n;
cout<<"Nhap p = ";
cin>>p;
cout<<"Nhap ma tran A cap "<<m<<"x"<<n<<endl;
NhapMaTran(A,m,n,'A');
cout<<"Nhap ma tran B cap "<<m<<"x"<<n<<endl;
NhapMaTran(B,m,n,'B');
cout<<"Nhap ma tran C cap "<<n<<"x"<<p<<endl;
NhapMaTran(C,n,p,'C');
clrscr();
cout<<"Ma tran A";
XuatMaTran(A,m,n);
getch();
cout<<"\n\nMa tran B";
XuatMaTran(B,m,n);
getch();
cout<<"\n\nMa tran C";
XuatMaTran(C,n,p);
getch();
cout<<"\n\nMa tran D = A+B";
CongMaTran(A,B,D,m,n);
XuatMaTran(D,m,n);
getch();
cout<<"\n\nMa tran D = A.C";
NhanMaTran(A,C,D,m,n,p);
XuatMaTran(D,n,p);
getch();
}

[Tải code chương trình tại đây - Lưu ý: Sau 5s, Click Bỏ qua quảng cáo (Skin Ad)]

** Đề nghị độc giả thực hiện các phép toán còn lại.

[C\C++] Nhập xuất ma trân [Xử lý ma trận - mảng 2 chiều]

Bài toán: Viết chương trình nhập vào ma trận chứa các số thực có kích thức không quá 100. In ma trận (theo dạng bảng số) ra màn hình.
Ví dụ: 

[Code Turbo C++]


#include <conio.h>
#include <iostream.h>
#define max 100
float A[max][max];  // khai bao ma tran A
/*Nhap ma tran he so*/
void NhapMaTran(int m, int n) {
 for(int i = 0; i<m; i++)
  for(int j = 0; j<n; j++) {
    cout<<"a["<<i<<"]["<<j<<"] = ";
    cin>>A[i][j];
  }
}
/*Xuat ma tran*/
void XuatMaTran(int m, int n) {
  for(int i=0 ; i<m; i++){
    cout<<endl;
    for(int j=0 ; j<n; j++)
     cout<<A[i][j]<<"\t";
  }
}
/*Chuong trinh chinh*/
void main() {
  int m, n;
  clrscr();
// nhap kich thuoc ma tran
  do{
  cout<<"Nhap so dong m = ";
  cin>>m;
  if (m<1||m>max) cout<<"\n nhap lai m";
 }while(m<1||m>max);
do{
  cout<<"Nhap so dong n = ";
  cin>>n;
  if (n<1||n>max) cout<<"\n nhap lai n";
 }while(n<1||n>max);
  cout<<"\nNhap ma tran A cap "<<m<<"x"<<n<<endl;
  NhapMaTran(m,n);
  cout<<"\nXuat ma tran A";
  XuatMaTran(m,n);
getch();
}

Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Giáo Trình: Kỹ Thuật Lập Trình C/C++ Căn Bản Và Nâng Cao [Click để xem]

# Khoá học online: Học lập trình C/C++ TỪ A - Z [Click để xem]


Xem bài khác:
------------------------
Đang tải...


Bài 1: Chương trình đầu tay

Categories

AI (13) AI programming (1) ASP (1) Android (32) App Honeygain (5) Assembly (17) Biểu diễn thuật toán (1) Bubble-Sort (1) Bài giảng (2) Bài giảng lập trình C và Cpp (21) Bài viết hay (109) Bản đồ tư duy (1) C Plus Plus (103) C/C++ (16) CDSL phân tán (1) CSS (2) Cơ sở dữ liệu (11) Danh ngôn lập trình (1) Datamining (4) Genetic Algorithm (1) Giáo trình (2) Giải thuật tiến hóa - thuật toán di truyền (2) Google App Engine (2) Góc học tập (34) HTML (1) Hướng dẫn kiếm tiền online tại nhà (7) Hướng dẫn sử dụng Emu8086 (1) Học lập trình (131) Học lập trình C và CPP qua ví dụ (17) Java (54) Java Căn bản (6) JavaScript (5) Kỹ năng đọc hiệu quả (1) Kỹ thuật lập trình (16) Kỹ thuật đồ họa máy tính (10) Lý thuyết Cơ sở dữ liệu (2) Lý thuyết đồ thị (11) Lập trình Cơ sở dữ liệu (2) Lập trình Python (2) Lập trình căn bản (8) Lập trình hướng đối tượng với Java (7) Lập trình mobile (9) Lập trình mạng (6) Lập trình nhúng (1) Lập trình trí tuệ nhân tạo (2) ML (1) MMO (7) MS Access (1) Machine learning (2) Mạng máy tính (1) Mẹo tìm kiếm trên Google (1) Nghiên cứu khoa học (3) Ngôn ngữ lập trình (2) Những cuốn sách hay mà bạn nên đọc khi còn trẻ (1) Pascal (3) Phương pháp tính toán tối ưu (2) Phương pháp tối ưu (2) Quản lý dự án CNTT (1) SEO (1) SQL (5) Swift (9) Sách hay (4) Thiết kế Web (2) Thuật toán (51) Thuật toán Sắp Xếp -Sort (9) Thuật toán Tìm kiếm - Search (5) Thuật toán di truyền (4) Thực hành Android (2) Tin học văn phòng (5) Tiện ích máy tính (3) Toán rời rạc (13) Treo máy kiếm tiền (3) Trí tuệ nhân tạo (18) Tài liệu tham khảo (5) Tìm hiểu Blockchain (2) Tự học Android (3) Tự học Android qua ví dụ (1) Tự học JavaScript (1) Tự học lập trình (9) Tự học lập trình Android (17) Tự học lập trình C và CPP (14) Tự học lập trình java qua các ví dụ (8) XML (1) blockchain (2) bài giảng quản lý dự án CNTT (1) bài tập java (3) bài tập lập trình (4) cấu trúc dữ liệu giải thuật (15) hướng dẫn viết báo (1) học lập trình Java (11) học máy (5) hợp ngữ (8) lập trình viên (3) phưng pháp đơn hình (2) thuật toán AI (2) tài liệu CNTT miễn phí (4) tính toán tối ưu (1) tự học lập trình iOS (8) tự học lập trình python (1) ví dụ Assembly (1) Đại số gia tử và ứng dụng (1) Đồ họa (4)