ĐỀ TÀI: Trình bày thuật toán sắp xếp Radixsort
lượt xem 58
download
Khái niệm sắp xếp dường như đã gắn liền với xã hội loài người từ thuở ban đầu của nền văn minh. Nó đơn giản thể hiện trong việc sắp hàng, trong việc phân công công việc,… Ngày nay, trong một thế giới mà khoa học công nghệ mỗi ngày phát triển như vũ bão và nhu cầu khai thác, tìm kiếm thông tin của con người ngày càng cao thì việc nâng cao tính hiệu quả của các giải thuật sắp xếp cũng ngày càng trở nên quan trọng....
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: ĐỀ TÀI: Trình bày thuật toán sắp xếp Radixsort
- BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG CAO ĐẲNG CN & KD VIỆT TIẾN KHOA MÁY TÍNH Môn: Cấu trúc dữ liệu & giải thuật ĐỀ TÀI: Trình bày thuật toán sắp xếp Radixsort Giảng viên hướng dẫn : Trịnh Đức Tính Sinh viên thực hiện : Nguyễn Đình Hải Quân Lớp : C10T1 MSSV : 100157 Đà Nẵng, Ngày 25 tháng 1 năm 2013
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân MỤC LỤC Sinh viên thực hiện : Nguyễn Đình Hải Quân.............................................1 MSSV : 100157..................................................................................................................1 Đà Nẵng, Ngày 25 tháng 1 năm 2013..........................................................................................1 LỜI NÓI ĐẦU...............................................................................................................................3 PHẦN I LÝ THUYẾT & THUẬT TOÁN VỀ RADIX SORT ......................................................................................................................................................4 1.Giới thiệu về Radix Sort.........................................................................................................4 2.Mô phỏng qui trình.................................................................................................................4 3. Thuật toán sắp xếp Radix sort.............................................................................................4 5. Ðánh giá độ phức tạp giải thuật...........................................................................................7 PHẦN II.........................................................................................................................................8 CHƯƠNG TRÌNH MINH HOẠ TRỰC QUAN RADIX SORT ......................................................................................................................................................8 a.Viết mã.................................................................................................................................10 2. Chương trình minh hoạ bằng C++......................................................................................14 III. Kết Luận Với những kiến thức đã học, với sự giúp đỡ tận tình của các anh chị trên diễn đàn cộng đồng C việt, cùng giáo viên bộ môn em đã thu thập được những kinh nghiệm hết sức quý báu.....18 Trang 2
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân LỜI NÓI ĐẦU Khái niệm sắp xếp dường như đã gắn liền với xã hội loài người từ thuở ban đầu của nền văn minh. Nó đơn giản thể hiện trong việc sắp hàng, trong việc phân công công việc,… Ngày nay, trong một thế giới mà khoa học công nghệ mỗi ngày phát triển như vũ bão và nhu cầu khai thác, tìm kiếm thông tin của con người ngày càng cao thì vi ệc nâng cao tính hiệu quả của các giải thuật sắp xếp cũng ngày càng trở nên quan trọng. Trong hầu hết các hệ lưu trữ, quản lý dữ liệu thao tác tìm kiếm là thao tác cơ bản để khai thác thông tin. Để việc tìm kiếm trở nên hiệu quả và nhanh chóng thì dữ liệu trong hệ thống cần được tổ chức theo một trật tự nào đó và điều này đòi hỏi chúng ta phải xây dựng những giải thuật sắp xếp thích hợp. Bài báo cáo này nhằm mục đích giới thiệu về Radix Sort, một giải thuật s ắp xếp đặc biệt vì nó gần giống cách sắp xếp theo lô của mà chúng ta vẫn hay làm trong cuộc sống hằng ngày. Hy vọng nhận được những nhận xét và đánh giá chân thành từ thầy và các bạn. Trang 3
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân PHẦN I LÝ THUYẾT & THUẬT TOÁN VỀ RADIX SORT 1.Giới thiệu về Radix Sort - Radix Sort là một thuật toán sắp xếp tiếp cận theo một hướng hoàn toàn khác so với các thuật toán khác. Nếu như trong các thuật toán khác, cơ sở để sắp xếp luôn là việc so sánh giá trị của 2 phần tử thì Radix sort lại dựa trên nguyên tắc phân loại th ư của bưu điện. Nó không hề quan tâm đến việc so sánh giá trị của phần tử và bản thân việc phân loại và trình tự phân loại sẽ tạo ra thứ tự cho các phần tử. - Ta biết rằng, để chuyển một khối lượng thư lớn đến tay người nhận ở nhiều địa phương khác nhau, bưư điện thường tổ chức một hệ thống phân loại thư phân cấp. Trước tiên, các thư đến cùng một tỉnh, thành phố sẽ được sắp chung vào một lô để gửi đến tỉnh thành tương ứng. Bưu điện các tỉnh thành này lại thực hiện công việc tương tự. Các thư đến cùng một quận, huyện sẽ được xếp vào chung một lô và gửi đ ến quận, huyện tương ứng. Cứ như vậy, các bức thư sẽ được trao đến tay người nhận một cách có hệ thông mà công việc sằp xếp thư không quá nặng nhọc. 2.Mô phỏng qui trình - Trước tiên, ta có thể giả sử mỗi phần tử ai trong dãy a1, a2, …, an là một số nguyên có tối đa m chữ số. - Ta phân loại các phần tử lần lượt theo các chữ số hàng đơn vị, hàng chục, hàng trăm, . tương tự việc phân loại thư theo tỉnh thành, quận huyện, phường xã, .. 3. Thuật toán sắp xếp Radix sort. Có nhiều thuật toán sắp xếp Radix sort như Insertion Sort, Merge Sort, Counting sort. Trong bài chỉ thực hiện theo kiểu Counting Sort (Sắp xếp đếm phân phối). Vì nó thực hiện sắp xếp không dựa trên các thao tác so sánh Trong bài báo cáo chỉ đề cập đến thuật toán Counting sort. Các bước thực hiện thuật toán như sau: Bước 1 : // k cho biết chữ số dùng để phân loại hiện hành k = 0; // k = 0: hàng đơn vị; k = 1:hàng chục; Trang 4
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân Bước 2 : //Tạo các lô chứa các loại phần tử khác nhau Khởi tạo 10 lô B0, B1, ., B9 rỗng; Bước 3 : For i = 1 .. n do Ðặt ai vào lô Bt với t = chữ số thứ k của ai; Bước 4 : Nối B0, B1, ., B9 lại (theo đúng trình tự) thành a. Bước 5 : k = k+1; Nếu k < m thì trở lại bước 2. Ngược lại: Dừng Ví dụ: Ta có mảng B gồm các phẩn tử như sau: 7013 8421 1239 428 1424 7009 4518 3252 9170 999 1725 701 Trong Radix Sort sẽ có một điều không thuận tiện là danh sách các số nguyên vì trong danh sách ấy có thể có các số nguyên có chiều dài không bằng nhau. Để khắc phục điều này ta thêm chữ số 0 vào phía trước các chữ số ngắn để được mảng các phần tử có chùng chiều dài bằng nhau là 4. Mảng B sau khi thêm các chữ số 0. 7013 8421 1239 0428 1424 7009 4518 3252 9170 0999 1725 0701 Phân lô theo hàng đơn vị: 0999 1725 4518 7009 9170 0701 3252 7013 1424 8425 0428 1239 0 1 2 3 4 5 6 7 8 9 Ta được mảng B như sau: 9170 0701 3252 7013 1424 8425 1725 0428 4518 1239 7009 0999 Trang 5
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân Phân lô theo hàng chục: 0428 1725 7009 4518 8425 0701 7013 1424 1239 3252 9170 0999 0 1 2 3 4 5 6 7 8 9 Ta được mảng B như sau: 0701 7009 7013 4518 1424 8425 1725 0428 1239 3252 9170 0999 Phân lô theo hàng trăm: 0428 7013 3252 8425 1725 7009 9170 1239 1424 4518 0701 0999 0 1 2 3 4 5 6 7 8 9 Ta được mảng B như sau: 7009 7013 9170 1239 3252 1424 8425 0428 4518 0701 1725 0999 Phân lô theo hàng nghìn: 0999 1725 0701 1424 7013 0428 1239 3252 4518 7009 8425 9170 0 1 2 3 4 5 6 7 8 9 Ta được mảng B đã sắp xếp hoàn thành như sau: 0428 0701 0999 1239 1424 1725 3252 4518 7009 7013 8425 9170 4.Kết luận Giải thuật Radix Sort không dựa trên sự so sánh dữ liệu như các giải thuật sắp xếp khác. Với mỗi số nguyên từ dữ liệu sẽ có hai hành động được thực thi. + Thực hiện phép chia lấy nguyên cho 1 hệ số để lấy phần chữ số d và các chữ số trước nó (bỏ các chữ số sau nó). Trang 6
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân + Thực hiện phép chia lấy dư cho 10 để lấy ra chữ số d (bỏ các chữ số trước d). 5. Ðánh giá độ phức tạp giải thuật Với một dãy n số, mỗi số có tối đa m chữ số, thuật toán thực hiện m lần các thao tác phân lô và ghép lô. Trong thao tác phân lô, mỗi phần tử chỉ được xét đúng một lần, khi ghép cũng vậy. Sau lần phân phối thứ k các phần tử của A vào các lô B0, B1, ., B9, và lấy ngược trở ra, nếu chỉ xét đến k+1 chữ số của các phần tử trong B, ta sẽ có một mảng tăng dần nhờ trình tự lấy ra từ 0 > 9. Nhận xét này bảo đảm tính đúng đắn của thuật toán Thuật toán có độ phức tạp tuyến tính nên hiệu quả khi sắp dãy có rất nhiều phần tử, nhất là khi khóa sắp xếp không quá dài so với số lượng phần tử (điều này thường gặp trong thực tế). Thuật toán cài đặt thuận tiện với các mảng với khóa sắp xếp là chuỗi (ký tự hay số) hơn là khóa số như trong ví dụ. Trang 7
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân PHẦN II CHƯƠNG TRÌNH MINH HOẠ TRỰC QUAN RADIX SORT Trong bài báo cáo có sử dụng 2 chương trình minh hoạ được viết bằng 2 ngôn ngữ là: VB.Net và C++ 1.Giới thiệu chương trình trên nền VB.Net Trang 8
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân Tìm hiểu chương trình: Chương trình được hình thành dựa trên ý tưởng là cho 1 tập các số, sau đó sắp xếp các dãy số đó theo thứ tự từ bé đến lớn, với các chức năng lưu mở file Thiết kế chương trình: Các thuộc tính thay đổi nhau sau: -5 textbox: thuộc tính name là tb1, tb2, tb3, tb4, tb5 - Nút ngẫu nhiên: Thuộc tính name là btnn - Nút sắp xếp: Thuộc tính name là nutbaocao - Menu: Thuộc tính name là f_menu - Listbox: Thuộc tính name là cacgiatri Trang 9
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân a.Viết mã Phần này chỉ đề cập đến các hàm chính trong chương trình. Khởi tạo hàm sắp xếp Radixsort: hàm này dùng tính chất đệ qui. Trong đó ThisList là nguồn cần sắp xếp, Depth là số lần đệ qui Public Function RecursiveRadixSort(ByRef ThisList As ICollection(Of Integer), _ ByVal Depth As Integer) As ICollection(Of Integer) If Depth < 0 Then Return ThisList Dim Bin(1) As ICollection(Of Integer) Bin(0) = New List(Of Integer) : Bin(1) = New List(Of Integer) For Each e As Integer In ThisList Bin(Math.Abs(CInt((e And (&H1 > Depth))).Add(e) Next Dim r As New List(Of Integer) If Depth = 31 Then If Bin(1).Count > 0 Then r.AddRange(RecursiveRadixSort(Bin(1), Depth - 1)) If Bin(0).Count > 0 Then r.AddRange(RecursiveRadixSort(Bin(0), Depth - 1)) Else If Bin(0).Count > 0 Then r.AddRange(RecursiveRadixSort(Bin(0), Depth - 1)) If Bin(1).Count > 0 Then r.AddRange(RecursiveRadixSort(Bin(1), Depth - 1)) End If Return r End Function Trang 10
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân Khởi tạo hàm Run(): hàm này có tác gán các giá trị vào mảng A sau đó gọi hàm sắp xếp, trong đó n0,n1,n2,n3,n4 là các giá trị được truyền từ ô textbox ngoài form chính Public Sub Run() Dim A() As Integer = {n0, n1, n2, n3, n4} Dim B As ICollection(Of Integer) For i As Integer = 0 To 4 Console.Write(A(i) & " - ") Next Console.WriteLine() B = RecursiveRadixSort(A, 31) B.CopyTo(C, 0) For i As Integer = 0 To 5 Console.Write(C(i) & " - ") Next End Sub Sự kiện form load ta tạo các giá trị sau: Private Sub f_main_Load(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MyBase.Load tb1.Text = Nothing tb2.Text = Nothing tb3.Text = Nothing tb4.Text = Nothing tb5.Text = Nothing luufile.Enabled = False End Sub Tạo chức năng mở file Private Sub MởFileToolStripMenuItem_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles mofile.Click Dim i As Integer Trang 11
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân luu.Items.Clear() lbkq.Text = Nothing Dim line, all As String OpenFileDialog1.Filter = "Text (*.txt)| *.txt" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName "" Then Try FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input) Do Until EOF(1) line = LineInput(1) all = all & line & vbCrLf Loop TextBox1.Text = all TextBox1.Select(1, 0) TextBox1.Enabled = True Catch ex As Exception MsgBox("Lổi mở file!") Exit Sub Finally FileClose(1) End Try Dim d = 0 d = TextBox1.Lines(0) 'd chứa các giá trị trong textbox1 For i = 2 To d + 2 ' i=2 vi gia tri 0 với 1 không phải là giá trị trong listbox mà là: ‘số 0 kết quả và số 1 là phần tử trong listbox luu.Items.Add(TextBox1.Lines(i)) 'listbox1 sẽ add từ vị trí thứ i tức thứ 2 trong ‘text tb1.Text = TextBox1.Lines(10) ' lay gia tri add len tb2.Text = TextBox1.Lines(11) ' lay gia tri add len tb3.Text = TextBox1.Lines(12) ' lay gia tri add len tb4.Text = TextBox1.Lines(13) ' lay gia tri add len tb5.Text = TextBox1.Lines(14) ' lay gia tri add len lbkq.Text = TextBox1.Lines(2) 'label kết quả chứ hàng thứ 1 trong file lưu Next chuthich.Visible = True End If End Sub Trang 12
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân Tạo chức năng cho menu lưu file: Private Sub LưuFileToolStripMenuItem_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles luufile.Click Dim j As Integer SaveFileDialog1.Filter = "Text File (*.txt) | *.txt" SaveFileDialog1.ShowDialog() If SaveFileDialog1.FileName "" Then Try FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) PrintLine(1, 4) 'in ra dong so 1 trong file txt để: kiem tra so phan tu co trong listbox PrintLine(1, "In ra ket qua sau khi sap xep") PrintLine(1, lbkq.Text) 'in ra dong so 2 trong file txt để: kiem tra ket qua de xuat ra label khi load file PrintLine(1, "Thu tu da sap xep de dua vao tung o textbox") For j = 0 To 4 PrintLine(1, luu.Items(j)) 'xuat gia tri ra file txt từ listbox danh sach Next PrintLine(1, "cac gia tri ban dau") For j = 0 To 4 PrintLine(1, cacgiatri.Items(j)) 'xuat gia tri ra file txt từ listbox danh sach Next Catch ex As Exception MsgBox("Loi khi ghi!") Finally FileClose(1) End Try End If End Sub Trang 13
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân 2. Chương trình minh hoạ bằng C++ Ý tưởng: Chương trình được viết trên ý tưởng cho dãy các thẻ sau đó sắp xếp các thẻ này theo thứ tự tăng dần a.Viết mã Tạo hàm radixsort void RadixSort(int *a,int n) Trang 14
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân { int i,b[MAX],m=0,exp=1; for(i=0;im) m=a[i]; } while(m/exp>0) { int bucket[10]={0}; for(i=0;i
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân } } Trong hàm main ta tạo các giá trị để sử dụng hàm như sau: int main() {int k; do { int arr[MAX]; coutk; if (k==1){ int i,n; printf("Nhap so luong the can sap xep max 5 the: (n < %d) : ",MAX); scanf("%d",&n); printf("Nhap the sau do an enter de sang the moi:\n",n); for(i=0;i>arr[i]; printf("\nMang vua nhap la : "); print(&arr[0],n); RadixSort(&arr[0],n); printf("\nKet qua sau khi sap xep : "); Trang 16
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân print(&arr[0],n); printf("\n"); } if (k==2){ int i; srand ( time(NULL) ); //dung de tao ham random for(i=0;i
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân III. Kết Luận Với những kiến thức đã học, với sự giúp đỡ tận tình của các anh chị trên diễn đàn cộng đồng C việt, cùng giáo viên bộ môn em đã thu thập được những kinh nghiệm hết sức quý báu. Kết hợp cùng với kiến thức đã được trang bị trên lớp em đã có một số suy nghĩ nhằm hoàn thiện đề tài đã giao. Tuy nhiên với trình độ thực tiễn còn hạn chế và một số khó khăn gặp phải trong lúc thực hiện đề tài nên cũng không thể tránh khỏi những thiếu sót em rất mong nhận được sự ý kiến đóng góp từ thầy đề đề tài của em được hoàn thiện hơn. Em xin chân thành cảm ơn thầy Trịnh Đức Tính đã hướng dẫn cho em hoàn thành đồ án này. Kính chúc thầy sức khoẻ dồi dào và đạt được nhiều thành tích trong công việc. Đà Nẵng, ngày 29 tháng 12 năm 2012. Sinh viên thực hiện Nguyễn Đình Hải Quân Trang 18
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân IV. Đánh giá và nhận xét của giáo viên bộ môn .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. .................................................................................................................. Trang 19
- Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân V. Thông Tin Khác Trong bài làm có sử dụng nguồn từ nhiều nguồn khác nhau cụ thể: Tuyển tập đồ án tốt nghiệp sinh viên Thanh Hóa Edison – Blog Archive » Sắp xếp dựa trên cơ số -Radix sort Recursive Radix Sort - VB.NET | DreamInCode.net Radix Sort – C++ | DreamInCode.net Câu lạc bộ Visual Basic .NET và C# (VB.NET & C#) Dự án & Source code VC++ - Cộng đồng C Việt Trang 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài thuyết trình: Thuật toán máy hỗ trợ vector (support vector machine-SVM)
37 p | 548 | 120
-
Đề tài " Trình bày vấn đề hạt Higgs (lý thuyết và thực nghiệm) "
24 p | 167 | 33
-
Báo cáo nghiên cứu khoa học: " ÁP DỤNG THUẬT TOÁN DI TRUYỀN TÌM KIẾM QUỸ ĐẠO VẬN HÀNH TỐI ƯU HỒ CHỨA NƯỚC CÓ NHÀ MÁY THỦY ĐIỆN LÀM VIỆC ĐỘC LẬP VỚI QUÁ TRÌNH DÒNG CHẢY ĐẾN LÀ NGẪU NHIÊN"
9 p | 136 | 18
-
Báo cáo tiểu luận: Thuật toán Mentor II
21 p | 181 | 13
-
Báo cáo nghiên cứu khoa học: Mô phỏng một số thuật toán đồ thị
20 p | 171 | 13
-
Báo cáo đề tài nghiên cứu khoa học cấp trường: Nghiên cứu một số thuật toán học máy (machine learning) ứng dụng cho bài toán xác định các chủ đề quan tâm của khách hàng trực tuyến
95 p | 65 | 12
-
Báo cáo tóm tắt đề tài khoa học và công nghệ: Nghiên cứu một số thuật toán lấy cảm hứng từ tự nhiên và ứng dụng vào bài toán tối ưu nỗ lực, chi phí phát triển phần mềm
30 p | 84 | 8
-
Báo cáo nghiên cứu khoa học: Thuật toán kiến song song giải quyết bài toán Maxsat
25 p | 68 | 7
-
Luận văn Thạc sĩ Kế toán: Hoàn thiệp lập và trình bày báo cáo tài chính hợp nhất tại Công ty CP Xây lắp Thừa Thiên Huế
119 p | 16 | 7
-
Luận án Tiến sĩ Hệ thống thông tin: Cải tiến thuật toán phân lớp cho dữ liệu không cân bằng và ứng dụng trong dự đoán đồng tác giả
123 p | 8 | 6
-
Luận văn Thạc sĩ Kế toán: Hoàn thiện lập và trình bày báo cáo tài chính hợp nhất tại Công ty CP Xây lắp Thừa Thiên Huế
119 p | 10 | 6
-
Luận văn Thạc sĩ Kỹ thuật: Cải tiến thuật toán SVM với SVM song song, ứng dụng vào phân lớp và dự báo số khách hàng sử dụng di động
75 p | 12 | 6
-
Luận án Tiến sĩ Kĩ thuật: Tổng hợp thuật toán điều khiển hạ cánh theo chương trình cho máy bay không người lái cỡ nhỏ
172 p | 40 | 5
-
Tóm tắt Luận án Tiến sĩ Kỹ thuật: Chẩn đoán dầm cầu bằng phương pháp phân tích dao động trên mô hình số hoá kết cấu được cập nhật sử dụng thuật toán tối ưu hoá bầy đàn kết hợp mạng nơ ron nhân tạo
27 p | 14 | 4
-
Báo cáo khoa học: "thuật toán chương trình Xác định độ dịch chuyển của bình diện đ-ờng sắt cải tạo, ví dụ tính toán"
9 p | 63 | 3
-
Tóm tắt Luận án Thạc sĩ Hệ thống thông tin: Nghiên cứu thuật toán tìm kiếm chuỗi DNA sử dụng phương pháp tìm kiếm tương tự nhanh
24 p | 41 | 2
-
Tóm tắt luận văn Thạc sĩ Kế toán: Hoàn thiện lập và trình bày báo cáo tài chính hợp nhất tại Công ty cổ phần Xây lắp Thừa Thiên Huế
26 p | 7 | 1
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn