50 câu hỏi phỏng vấn về cấu trúc dữ liệu và câu trả lời hàng đầu

Dưới đây là những câu hỏi phỏng vấn về Cấu trúc dữ liệu và câu trả lời dành cho cả ứng viên mới vào nghề và ứng viên có kinh nghiệm để có được công việc mơ ước của mình.

1) Cấu trúc dữ liệu là gì?

Cấu trúc dữ liệu đề cập đến cách dữ liệu được tổ chức và thao tác. Nó tìm cách để làm cho việc truy cập dữ liệu hiệu quả hơn. Khi xử lý cấu trúc dữ liệu, chúng ta không chỉ tập trung vào một phần dữ liệu mà còn vào tập hợp dữ liệu khác nhau và cách chúng có thể liên quan đến nhau theo cách có tổ chức.


2) Phân biệt giữa cấu trúc lưu trữ tập tin và cấu trúc lưu trữ có cấu trúc.

Sự khác biệt chính giữa cả hai cấu trúc dữ liệu là vùng bộ nhớ đang được truy cập. Khi xử lý cấu trúc nằm trong bộ nhớ chính của hệ thống máy tính, đây được gọi là cấu trúc lưu trữ. Khi xử lý cấu trúc phụ trợ, chúng ta gọi đó là cấu trúc tệp.

Tải xuống PDF miễn phí: Câu hỏi phỏng vấn về cấu trúc dữ liệu và câu trả lời


3) Khi nào thì tìm kiếm nhị phân được áp dụng tốt nhất?

Tìm kiếm nhị phân là thuật toán được áp dụng tốt nhất để tìm kiếm danh sách khi các phần tử đã theo thứ tự hoặc được sắp xếp. Danh sách được tìm kiếm bắt đầu từ giữa, sao cho nếu giá trị giữa đó không phải là khóa tìm kiếm mục tiêu, nó sẽ kiểm tra xem nó sẽ tiếp tục tìm kiếm ở nửa dưới của danh sách hay nửa trên. Sau đó, việc chia tách và tìm kiếm sẽ tiếp tục theo cùng một cách.


4) a là gì danh sách liên kết?

Danh sách liên kết là một chuỗi các nút trong đó mỗi nút được kết nối với nút theo sau nó. Điều này tạo thành một liên kết giống như chuỗi để lưu trữ dữ liệu.


5) Làm thế nào để bạn tham chiếu tất cả các yếu tố trong một chiều mảng?

Để tham chiếu tất cả các phần tử trong một mảng một chiều, bạn cần sử dụng vòng lặp có chỉ số, do đó, bộ đếm chạy từ 0 đến kích thước mảng trừ đi một. Theo cách này, bạn có thể tham chiếu tất cả các phần tử theo trình tự bằng cách sử dụng bộ đếm vòng lặp làm chỉ số mảng.


6) Cấu trúc dữ liệu được áp dụng trong những lĩnh vực nào?

Cấu trúc dữ liệu là thiết yếu trong hầu hết mọi khía cạnh liên quan đến dữ liệu. Nhìn chung, các thuật toán liên quan đến cấu trúc dữ liệu hiệu quả được áp dụng trong các lĩnh vực sau: phân tích số, hệ điều hành, AI, thiết kế trình biên dịch, quản lý cơ sở dữ liệu, đồ họa và phân tích thống kê, v.v.

Câu hỏi phỏng vấn về cấu trúc dữ liệu

7) LIFO là gì?

LIFO là viết tắt của Last In First Out. Nó đề cập đến cách dữ liệu được truy cập, lưu trữ và truy xuất. Sử dụng sơ đồ này, dữ liệu được lưu trữ sau cùng sẽ là dữ liệu được trích xuất đầu tiên. Điều này cũng có nghĩa là để có thể truy cập vào dữ liệu đầu tiên, tất cả dữ liệu khác được lưu trữ trước dữ liệu đầu tiên này trước tiên phải được truy xuất và trích xuất.


8) Hàng đợi là gì?

Hàng đợi là một cấu trúc dữ liệu có thể mô phỏng một danh sách hoặc luồng dữ liệu. Trong cấu trúc này, các phần tử mới được chèn vào một đầu và các phần tử hiện có được xóa khỏi đầu kia.


9) Cây nhị phân là gì?

Cây nhị phân là một loại cấu trúc dữ liệu có hai nút, một nút trái và một nút phải. Trong lập trình, cây nhị phân là phần mở rộng của cấu trúc danh sách liên kết.

Cây tìm kiếm nhị phân

10) Cấu trúc dữ liệu nào được áp dụng khi xử lý hàm đệ quy?

Đệ quy là một hàm tự gọi chính nó dựa trên điều kiện kết thúc, sử dụng ngăn xếp. Sử dụng LIFO, lệnh gọi đến một hàm đệ quy sẽ lưu địa chỉ trả về để biết cách quay lại hàm gọi sau khi lệnh gọi kết thúc.


11) Ngăn xếp là gì?

Stack là một cấu trúc dữ liệu trong đó chỉ có thể truy cập phần tử trên cùng. Khi dữ liệu được lưu trữ trong stack, mỗi dữ liệu được đẩy xuống dưới, để lại dữ liệu được thêm gần đây nhất ở trên cùng.


12) Giải thích về cây tìm kiếm nhị phân

Cây tìm kiếm nhị phân lưu trữ dữ liệu theo cách mà chúng có thể được truy xuất rất hiệu quả. Cây con bên trái chứa các nút có khóa nhỏ hơn giá trị khóa của nút, trong khi cây con bên phải chứa các nút có khóa lớn hơn hoặc bằng giá trị khóa của nút. Hơn nữa, cả hai cây con đều là cây tìm kiếm nhị phân.


13) Mảng đa chiều là gì?

Mảng đa chiều sử dụng nhiều chỉ mục để lưu trữ dữ liệu. Nó hữu ích khi lưu trữ dữ liệu không thể biểu diễn bằng chỉ mục một chiều, chẳng hạn như biểu diễn dữ liệu trong trò chơi cờ bàn, bảng có dữ liệu được lưu trữ trong nhiều cột.


14) Danh sách liên kết được coi là cấu trúc dữ liệu tuyến tính hay phi tuyến tính?

Tùy thuộc vào nơi bạn định áp dụng danh sách liên kết. Nếu bạn dựa trên lưu trữ, danh sách liên kết được coi là phi tuyến tính. Mặt khác, nếu bạn dựa trên chiến lược truy cập, thì danh sách liên kết được coi là tuyến tính.


15) Phân bổ bộ nhớ động giúp ích như thế nào trong việc quản lý dữ liệu?

Ngoài khả năng lưu trữ các kiểu dữ liệu có cấu trúc đơn giản, phân bổ bộ nhớ động có thể kết hợp các khối có cấu trúc được phân bổ riêng biệt để tạo thành các cấu trúc tổng hợp có thể mở rộng và co lại khi cần thiết.


16) FIFO là gì?

FIFO là viết tắt của First-in, First-out, và được sử dụng để biểu diễn cách dữ liệu được truy cập trong hàng đợi. Dữ liệu đã được chèn vào danh sách hàng đợi, dữ liệu dài nhất là dữ liệu được xóa đầu tiên.


17) Danh sách có thứ tự là gì?

Danh sách có thứ tự là danh sách trong đó vị trí của mỗi nút trong danh sách được xác định bởi giá trị của thành phần khóa của nó, do đó các giá trị khóa tạo thành một chuỗi tăng dần khi duyệt danh sách.


18) Sắp xếp trộn là gì?

Merge Sort, là một phương pháp chia để trị để sắp xếp dữ liệu. Trong một chuỗi dữ liệu, các dữ liệu liền kề được hợp nhất và sắp xếp để tạo ra các danh sách được sắp xếp lớn hơn. Các danh sách được sắp xếp này sau đó được hợp nhất lại để tạo thành một danh sách được sắp xếp lớn hơn nữa, tiếp tục cho đến khi bạn có một danh sách được sắp xếp duy nhất.


19) Phân biệt NULL và VOID

Null là một giá trị, trong khi Void là một định danh kiểu dữ liệu. Một biến được gán giá trị Null biểu thị một giá trị rỗng. Void được sử dụng để xác định các con trỏ không có kích thước ban đầu.


20) Ưu điểm chính của danh sách liên kết là gì?

Danh sách liên kết là một cấu trúc dữ liệu lý tưởng vì nó có thể được sửa đổi dễ dàng. Điều này có nghĩa là việc chỉnh sửa danh sách liên kết vẫn hoạt động bất kể có bao nhiêu phần tử trong danh sách.


21) Sự khác nhau giữa PUSH và POP là gì?

Pushing và popping áp dụng cho cách dữ liệu được lưu trữ và truy xuất trong một ngăn xếp. Push biểu thị dữ liệu được thêm vào, nghĩa là dữ liệu đang được "đẩy" vào ngăn xếp. Mặt khác, pop biểu thị việc truy xuất dữ liệu và cụ thể là dữ liệu trên cùng đang được truy cập.


22) Tìm kiếm tuyến tính là gì?

Tìm kiếm tuyến tính đề cập đến cách tìm kiếm khóa mục tiêu trong cấu trúc dữ liệu tuần tự. Trong phương pháp này, mỗi phần tử trong danh sách được kiểm tra và so sánh với khóa mục tiêu. Quá trình được lặp lại cho đến khi tìm thấy hoặc nếu đã đến cuối tệp.


23) Khai báo biến ảnh hưởng đến việc phân bổ bộ nhớ như thế nào?

Lượng bộ nhớ được phân bổ hoặc dành riêng sẽ phụ thuộc vào kiểu dữ liệu của biến được khai báo. Ví dụ, nếu một biến được khai báo là kiểu số nguyên, thì 32 bit bộ nhớ sẽ được dành riêng cho biến đó.


24) Ưu điểm của heap so với stack là gì?

Heap linh hoạt hơn stack. Đó là vì không gian bộ nhớ cho heap có thể được phân bổ động và hủy phân bổ khi cần. Tuy nhiên, bộ nhớ của heap đôi khi có thể chậm hơn khi so sánh với stack.


25) Biểu thức hậu tố là gì?

Biểu thức hậu tố là biểu thức trong đó mỗi toán tử theo sau toán hạng của nó. Ưu điểm của dạng này là không cần nhóm các biểu thức con trong dấu ngoặc đơn hoặc xem xét thứ tự ưu tiên của toán tử.


26) Trừu tượng dữ liệu là gì?

Trừu tượng hóa dữ liệu là một công cụ mạnh mẽ để chia nhỏ các vấn đề dữ liệu phức tạp thành các phần dễ quản lý. Điều này được áp dụng bằng cách ban đầu chỉ định các đối tượng dữ liệu liên quan và các hoạt động sẽ được thực hiện trên các đối tượng dữ liệu này mà không quá quan tâm đến cách các đối tượng dữ liệu sẽ được biểu diễn và lưu trữ trong bộ nhớ.


27) Làm thế nào để chèn một mục mới vào cây tìm kiếm nhị phân?

Giả sử dữ liệu cần chèn là một giá trị duy nhất (tức là không phải là mục hiện có trong cây), trước tiên hãy kiểm tra xem cây có rỗng không. Nếu rỗng, chỉ cần chèn mục mới vào nút gốc. Nếu không rỗng, hãy tham chiếu đến khóa của mục mới. Nếu nhỏ hơn khóa của gốc, hãy chèn mục đó vào cây con bên trái của gốc, nếu không, hãy chèn mục đó vào cây con bên phải của gốc.


28) Sắp xếp chọn lọc hoạt động như thế nào đối với một mảng?

Sắp xếp lựa chọn là một thuật toán sắp xếp khá trực quan, mặc dù không nhất thiết phải hiệu quả. Trong quá trình này, phần tử nhỏ nhất được định vị trước và hoán đổi với phần tử ở chỉ số dưới bằng không, do đó đặt phần tử nhỏ nhất ở vị trí đầu tiên.

Phần tử nhỏ nhất còn lại trong mảng con sau đó được đặt cạnh các chỉ số từ 1 đến n-1 và được đổi chỗ với phần tử ở chỉ số 1, do đó đặt phần tử nhỏ thứ hai ở vị trí thứ hai. Các bước được lặp lại theo cùng một cách cho đến phần tử cuối cùng.


29) Số có dấu và không dấu ảnh hưởng đến trí nhớ như thế nào?

Trong trường hợp số có dấu, bit đầu tiên được dùng để chỉ số dương hay số âm, khiến bạn thiếu một bit. Với số không dấu, bạn có tất cả các bit khả dụng cho số đó. Hiệu ứng này được thấy rõ nhất trong phạm vi số (số không dấu 8 bit có phạm vi từ 0-255, trong khi số có dấu 8 bit có phạm vi từ -128 đến +127.


30) Số lượng nút tối thiểu mà một cây nhị phân có thể có là bao nhiêu?

Cây nhị phân có thể có tối thiểu là 1 nút, điều này xảy ra khi các nút có giá trị NULL. Hơn nữa, cây nhị phân cũng có thể có 2 hoặc XNUMX nút.


31) Cấu trúc dữ liệu động là gì?

Cấu trúc dữ liệu động là cấu trúc mở rộng và co lại khi chương trình chạy. Nó cung cấp phương tiện linh hoạt để thao tác dữ liệu vì nó có thể điều chỉnh theo kích thước của dữ liệu.


32) Con trỏ được áp dụng trong cấu trúc dữ liệu nào?

Con trỏ được sử dụng trong danh sách liên kết có nhiều ứng dụng khác nhau trong cấu trúc dữ liệu. Các cấu trúc dữ liệu sử dụng khái niệm này bao gồm Stack, Queue, Linked List và Binary Tree.


33) Có phải tất cả các câu lệnh khai báo đều dẫn đến việc đặt chỗ cố định trong bộ nhớ không?

Hầu hết các khai báo đều như vậy, ngoại trừ con trỏ. Khai báo con trỏ không phân bổ bộ nhớ cho dữ liệu, mà cho địa chỉ của biến con trỏ. Việc phân bổ bộ nhớ thực tế cho dữ liệu diễn ra trong thời gian chạy.


34) MẢNG là gì?

Khi xử lý mảng, dữ liệu được lưu trữ và truy xuất bằng cách sử dụng chỉ mục tham chiếu đến số phần tử trong chuỗi dữ liệu. Điều này có nghĩa là dữ liệu có thể được truy cập theo bất kỳ thứ tự nào. Trong lập trình, mảng được khai báo là một biến có số phần tử được lập chỉ mục.


35) Số lượng hàng đợi tối thiểu cần thiết khi triển khai hàng đợi ưu tiên là bao nhiêu?

Số lượng hàng đợi tối thiểu cần thiết trong trường hợp này là hai. Một hàng đợi dùng để sắp xếp thứ tự ưu tiên trong khi hàng đợi còn lại dùng để lưu trữ dữ liệu thực tế.


36) Thuật toán sắp xếp nào được coi là nhanh nhất?

Có nhiều loại thuật toán sắp xếp: quick sort, bubble sort, balloon sort, radix sort, merge sort, v.v. Không có thuật toán nào có thể được coi là nhanh nhất vì mỗi thuật toán được thiết kế cho một cấu trúc dữ liệu và tập dữ liệu cụ thể. Nó sẽ phụ thuộc vào tập dữ liệu mà bạn muốn sắp xếp.


37) Phân biệt STACK và ARRAY.

Stack tuân theo mô hình LIFO. Điều này có nghĩa là truy cập dữ liệu tuân theo một trình tự trong đó dữ liệu cuối cùng được lưu trữ khi dữ liệu đầu tiên được trích xuất. Mặt khác, mảng không tuân theo thứ tự cụ thể và thay vào đó có thể được truy cập bằng cách tham chiếu đến phần tử được lập chỉ mục trong mảng.


38) Đưa ra thuật toán cơ bản để tìm kiếm trên cây tìm kiếm nhị phân.

1. nếu cây rỗng thì mục tiêu không có trong cây, kết thúc tìm kiếm
2. nếu cây không rỗng, mục tiêu nằm trong cây
3. kiểm tra xem mục tiêu có nằm trong mục gốc không
4. nếu mục tiêu không nằm trong mục gốc, hãy kiểm tra xem mục tiêu có nhỏ hơn giá trị của mục gốc không
5. nếu mục tiêu nhỏ hơn giá trị gốc, hãy tìm kiếm cây con bên trái
6. nếu không, hãy tìm kiếm cây con bên phải


39) Dequeue là gì?

Dequeue là một hàng đợi có hai đầu. Đây là một cấu trúc trong đó các phần tử có thể được chèn hoặc xóa khỏi cả hai đầu.


40) Sắp xếp nổi bọt là gì và thực hiện như thế nào?

Bubble sort là một kỹ thuật sắp xếp có thể áp dụng cho các cấu trúc dữ liệu như mảng. Nó hoạt động bằng cách so sánh các phần tử liền kề và trao đổi giá trị của chúng nếu chúng không theo thứ tự. Phương pháp này cho phép các giá trị nhỏ hơn "nổi bọt" lên đầu danh sách, trong khi giá trị lớn hơn chìm xuống dưới cùng.


41) Danh sách liên kết gồm có những phần nào?

Danh sách liên kết thường có hai phần: phần đầu và phần đuôi. Giữa phần đầu và phần đuôi là các nút thực tế. Tất cả các nút này được liên kết tuần tự.


42) Sắp xếp lựa chọn hoạt động như thế nào?

Sắp xếp lựa chọn hoạt động bằng cách chọn số nhỏ nhất trong danh sách và đặt nó ở phía trước. Quá trình này được lặp lại cho vị trí thứ hai về cuối danh sách. Đây là thuật toán sắp xếp đơn giản nhất.


43) Đồ thị là gì?

Đồ thị là một loại cấu trúc dữ liệu chứa một tập hợp các cặp có thứ tự. Các cặp có thứ tự này cũng được gọi là các cạnh hoặc cung và được sử dụng để kết nối các nút nơi dữ liệu có thể được lưu trữ và truy xuất.


44) Phân biệt cấu trúc dữ liệu tuyến tính và phi tuyến tính.

Cấu trúc dữ liệu tuyến tính là cấu trúc trong đó các phần tử dữ liệu nằm cạnh nhau. Ví dụ về cấu trúc dữ liệu tuyến tính bao gồm mảng, danh sách liên kết, ngăn xếp và hàng đợi. Mặt khác, cấu trúc dữ liệu phi tuyến tính là cấu trúc trong đó mỗi phần tử dữ liệu có thể kết nối với nhiều hơn hai phần tử dữ liệu liền kề. Ví dụ về cấu trúc dữ liệu phi tuyến tính bao gồm cây và đồ thị.


45) Cây AVL là gì?

Cây AVL là một loại cây tìm kiếm nhị phân luôn ở trạng thái cân bằng một phần. Sự cân bằng được đo bằng sự khác biệt giữa chiều cao của các cây con từ gốc. Cây tự cân bằng này được biết đến là cấu trúc dữ liệu đầu tiên được thiết kế như vậy.

Cây AVL

46) Danh sách liên kết kép là gì?

Danh sách liên kết đôi là một loại danh sách liên kết đặc biệt trong đó việc duyệt qua các phần tử dữ liệu có thể được thực hiện theo cả hai hướng. Điều này có thể thực hiện được bằng cách có hai liên kết trong mỗi nút, một liên kết đến nút tiếp theo và một liên kết khác kết nối với nút trước đó.


47) Thuật toán Huffman là gì?

Thuật toán Huffman được sử dụng để tạo ra các cây nhị phân mở rộng có độ dài đường dẫn có trọng số tối thiểu từ các trọng số đã cho. Thuật toán này sử dụng một bảng chứa tần suất xuất hiện của từng phần tử dữ liệu.


48) Tìm kiếm Fibonacci là gì?

Tìm kiếm Fibonacci là thuật toán tìm kiếm áp dụng cho một mảng được sắp xếp. Thuật toán này sử dụng phương pháp chia để trị có thể giảm đáng kể thời gian cần thiết để đạt được phần tử mục tiêu.


49) Giải thích ngắn gọn thuật toán đệ quy.

Thuật toán đệ quy nhắm đến một vấn đề bằng cách chia nó thành các bài toán con nhỏ hơn, dễ quản lý hơn. Đầu ra của một phép đệ quy sau khi xử lý một bài toán con trở thành đầu vào cho quá trình đệ quy tiếp theo.


50) Làm thế nào để tìm kiếm khóa mục tiêu trong danh sách liên kết?

Để tìm khóa mục tiêu trong danh sách được liên kết, bạn phải áp dụng tìm kiếm tuần tự. Mỗi nút được duyệt và so sánh với khóa mục tiêu, và nếu khác, thì nó sẽ theo liên kết đến nút tiếp theo. Việc duyệt này tiếp tục cho đến khi tìm thấy khóa mục tiêu hoặc nếu nút cuối cùng được tìm thấy.


Những câu hỏi phỏng vấn này cũng sẽ giúp ích cho bài viva (miệng) của bạn. Nhóm chuyên gia của chúng tôi đã biên soạn một danh sách các những câu hỏi và câu trả lời phỏng vấn vòng HR phổ biến nhất mà người phỏng vấn có thể hỏi bạn trong buổi phỏng vấn xin việc về Cấu trúc dữ liệu.

Chia sẻ

55 Comments

  1. câu hỏi rất bổ ích và cơ bản về cấu trúc dữ liệu.

    1. Tuyệt vời… nhưng vẫn còn nhiều chủ đề cần đề cập.

  2. tanq….nó rất hiệu quả với tôi…

  3. hình đại diện krishnendu nói:

    rất hữu ích, cảm ơn bạn rất nhiều

  4. Cảm ơn……. Điều này thực sự hữu ích với tôi

  5. cảm ơn…nó đã giúp tôi rất nhiều…

  6. hình đại diện vishwajeet nói:

    cảm ơn đó là câu hỏi quan trọng nhất

  7. hình đại diện Syeda anush Fatima nói:

    Cảm ơn giọng nói viva này rất quan trọng đối với tôi và tôi rất vui vì đã tìm thấy trang của bạn cảm ơn ngài ♥
    Chúc bạn may mắn 😊

  8. hình đại diện Dilipkumar nói:

    Rất hữu ích..cảm ơn admin rất nhiều.

  9. hình đại diện Sreelatha nói:

    Cảm ơn bạn, nó rất hữu ích với tôi

  10. hình đại diện Himanshu Joshi nói:

    Bạn có thể đưa thêm một số câu hỏi khó về cấu trúc dữ liệu vào đây không?

  11. hình đại diện Deekshitha nói:

    Cảm ơn vì điều đó rất hữu ích với chúng tôi

  12. hình đại diện người đê tiện nói:

    rất bổ ích và hữu ích…

  13. hình đại diện Pratiksha nói:

    Cảm ơn.. Nó thực sự giúp ích cho tôi..

  14. hình đại diện Premalatha v nói:

    Có được ý tưởng rõ ràng về các câu hỏi phỏng vấn dựa trên cấu trúc dữ liệu.

  15. Cảm ơn ngài...hôm nay là ngày bảo vệ luận án của tôi và tôi đoán đây là những câu hỏi có lợi nhất sẽ được hỏi...Cảm ơn ngài rất nhiều..

  16. hình đại diện Pradnya Ravindra Giri nói:

    Nó rất hữu ích… Cảm ơn bạn

  17. hình đại diện Pavani Andanapalli nói:

    iam
    Chuẩn bị cho kỳ thi của Chính phủ. career.guru99 có hữu ích với tôi không? Bạn có thể trả lời tôi không?

  18. Tqsm nó rất hữu ích với tôi cảm ơn bạn rất nhiều

  19. rất bổ ích.. Cảm ơn vì đã tổng hợp tất cả

  20. hình đại diện Alex Kirosso nói:

    rất hữu ích, cảm ơn bạn rất nhiều

  21. tuyệt vời!! Các câu hỏi và câu trả lời học tập thực sự dễ dàng và đơn giản, và bài kiểm tra cuối cùng có giá tốt nhất!!

  22. hình đại diện s.vishnupriya nói:

    Cảm ơn câu hỏi rất hay và hữu ích của tôi.

  23. Cảm ơn bạn rất nhiều vì đã đưa ra những câu hỏi có giá trị như vậy…

  24. hình đại diện Milan sharma nói:

    Bộ câu hỏi hay nhưng cần thêm nhiều câu hỏi hơn vào

  25. hình đại diện KGC:-Giám đốc điều hành nói:

    Rất hữu ích, cảm ơn……………………….

  26. hình đại diện má lúm đồng tiền nói:

    Cảm ơn……………………………..rất nhiều

  27. hình đại diện manish kuamr yadav nói:

    Cảm ơn vì những câu hỏi quan trọng này

  28. hình đại diện Adil Akbar Ali nói:

    Rất hữu ích. Vui lòng thêm một số chủ đề nữa. Cảm ơn bạn rất nhiều

Bình luận

Chúng tôi sẽ không công khai email của bạn. Các ô đánh dấu * là bắt buộc *