You are on page 1of 22

MỤC LỤC

MỤC LỤC .......................................................................................................................1


BÀI 1 TÌM KIẾM VÀ SẮP XẾP DỮ LIỆU ...................................................................2
A. MỤC TIÊU ...............................................................................................................2
B. DỤNG CỤ - THIẾT BỊ THỰC HÀNH CHO MỘT SINH VIÊN: ..........................2
C. NỘI DUNG THỰC HÀNH ......................................................................................2
1.1. Giải thuật tìm kiếm nhị phân ....................................................................................2
1.2. Giải thuật QuickSort .................................................................................................3
1.3. Giải thuật HeapSort...................................................................................................4
1.4. Bài tập thực hành ......................................................................................................5
BÀI 2 DANH SÁCH LIÊN KẾT ....................................................................................6
A. MỤC TIÊU ...............................................................................................................6
B. DỤNG CỤ - THIẾT BỊ THÍ NGHIỆM CHO MỘT SINH VIÊN: ..........................6
C. NỘI DUNG THỰC HÀNH ......................................................................................6
2.1. Danh sách liên kết đơn .............................................................................................6
2.2. Ngăn xếp .................................................................................................................10
2.3. Hàng đợi ..................................................................................................................11
BÀI 3 MA TRẬN LIÊN KẾT .......................................................................................14
A. MỤC TIÊU ...............................................................................................................14
B. DỤNG CỤ - THIẾT BỊ THỰC HÀNH CHO MỘT SINH VIÊN: ..........................14
C. NỘI DUNG THỰC HÀNH ......................................................................................14
3.1. Mảng danh sách liên kết .........................................................................................14
3.2. Ma trận liên kết .......................................................................................................16
3.3. Bảng băm (HashTable) ...........................................................................................19
TÀI LIỆU THAM KHẢO .............................................................................................22

Trang 1
Trường ĐH CNTP TP.HCM
BÀI 1
Khoa CNTT
Bộ môn KHMT
TÌM KIẾM VÀ SẮP XẾP
MSMH:
DỮ LIỆU

A. MỤC TIÊU
- Cài đặt các thuật toán tìm kiếm và sắp xếp.
- Xây dựng ứng dụng hiện thực các thuật toán
B. DỤNG CỤ - THIẾT BỊ THỰC HÀNH CHO MỘT SINH VIÊN:

STT Chủng loại – Quy cách vật tư Số lượng Đơn vị Ghi chú

1 Computer 1 1

C. NỘI DUNG THỰC HÀNH


1.1. Giải thuật tìm kiếm nhị phân
public class Mang{
int [] a; int n;
int BinarySearch( int x){
int left=0, right=n-1, mid;
while(left<=right){
mid=(left+right)/2;
if(x==a[mid]) return mid;
else
if(x<a[mid]) right=mid–1;
else left=mid+1;
}
return –1;
}
public Mang(int size){
a=new int [100];
n=size;
}
public void Nhapmang(){
System.out.println("Nhap mang:");
Scanner scan = new Scanner(System.in);
for(int i=0;i<n;i++){
System.out.print("a[" + i+"]=");
a[i]=scan.nextInt();
}
}
public void Xuatmang(){
System.out.println("Xuat mang:");
for(int i=0;i<n;i++){
System.out.print(a[i] + " ");
}

Trang 2
public static void main(String[] args) {
// TODO code application logic here
Mang a=new Mang(4);
a.Nhapmang();
a.Xuatmang();
int x=8;
int vt=a.BinarySearch(x);
System.out.println(x +"xuat hien tai vi tri thu "
+vt +"trong mang");

}
}
1.2. Giải thuật QuickSort
class Mang{
int [] a; int n;
public void QuickSort (int Left, int Right){
int i = Left, j = Right;
int mid = (Left+Right)/2, x= a[mid];
do{
while(a[i] < x) i++;
while(a[j] > x) j
if(i <= j) { int t = a[i];
a[i] = a[j]; a[j] = t; i++; j--;
}
if(i > mid && j < mid) break;
}while(i < j);
if (Left < j) QuickSort(Left, j);
if (Right > i) QuickSort(i, Right);
}
public Mang(int size){
a=new int [100];
n=size;
}
public void Nhapmang(){
System.out.println("Nhap mang:");
Scanner scan = new Scanner(System.in);
for(int i=0;i<n;i++){
System.out.print("a[" + i+"]=");
a[i]=scan.nextInt();
}
}
public void Xuatmang(){
System.out.println("Xuat mang:");
for(int i=0;i<n;i++){
System.out.print(a[i] + " ");
}
}
public static void main(String[] args) {
// TODO code application logic here
Mang a=new Mang(4);

Trang 3
a.Nhapmang();
a.Xuatmang();
a.QuickSort(0, a.n);
a.Xuatmang();
}
}
1.3. Giải thuật HeapSort
class Mang{
int [] a; int n;
public Mang(int size){
a=new int [100];
n=size;
}
public void Nhapmang(){
System.out.println("Nhap mang:");
Scanner scan = new Scanner(System.in);
for(int i=0;i<n;i++){
System.out.print("a[" + i+"]=");
a[i]=scan.nextInt();
}
}
public void Xuatmang(){
System.out.println("Xuat mang:");
for(int i=0;i<n;i++){
System.out.print(a[i] + " ");
}
}
private void Shift (int L, int r){
int i=L; int j=2*i; int x=a[i];
while(j <= r){
if((j < r) && (a[j] < a[j+1])) j++;
if(a[j] <= x) break;
a[i] = a[j];
a[j] = x;
i = j;
j = 2*i;
}
}
private void CreateHeap(){
for( int l = n/2; l >= 0; l--)
Shift(l, n-1);
}

public void HeapSort(){


int r;
CreateHeap();
int tmp=a[0];
a[0]=a[n-1];
a[n-1]=tmp;
for( r=n-2; r > 0; r--){

Trang 4
Shift(0, r);
tmp=a[0];
a[0]=a[r];
a[r]=tmp;
}
}
public static void main(String[] args) {
// TODO code application logic here
Mang a=new Mang(4);
a.Nhapmang();
a.Xuatmang();
a.HeapSort();
a.Xuatmang();
}
}
1.4. Bài tập thực hành

Bài tập 1: Một sinh viên (SinhVien) có những thông tin cần lưu trữ là: Mã số sinh
viên (MaSV) – chuỗi, Họ và họ lót của sinh viên (HoSV) – chuỗi, Tên của sinh viên
(TenSV) – chuỗi, Điểm trung bình (DiemTB) – số thực dương. Hãy viết chương trình
cho phép quản lý một danh sách sinh viên với các thao tác cơ bản như:

- Nhập và xuất thông tin một danh sách n sinh viên.

- Sắp xếp tăng dần theo TenSV bằng QuickSort.

- Sắp xếp giảm dần theo DiemTB bằng HeapSort.

Bài tập 2: Dựa vào bài tập 1 em hãy thay thế 2 giải thuật sắp xếp trên sử dụng phương
thức Collections.sort của java.

Bài tập 3: Viết chương trình tìm dãy con tăng dài nhất của mảng một chiều a có n
phần tử.

Trang 5
Trường ĐH CNTP TP.HCM
Khoa CNTT BÀI 2
Bộ môn KHMT DANH SÁCH LIÊN KẾT
MSMH:

A. MỤC TIÊU
- Cài đặt cấu trúc dữ liệu liên kết đơn.
- Xây dựng được ứng dụng với dữ liệu được lưu trữ trên danh sách liên kết.
- Xây dựng được ứng dụng sử dụng stack và queue.
B. DỤNG CỤ - THIẾT BỊ THÍ NGHIỆM CHO MỘT SINH VIÊN:
STT Chủng loại – Quy cách vật tư Số lượng Đơn vị Ghi chú
1 Computer 1 1
C. NỘI DUNG THỰC HÀNH
2.1. Danh sách liên kết đơn
2.1.1. Xây dựng lớp danh sách liên kết đơn
class Node{
private int value;
private Node next;
public Node(){
value = 0;
next = null;
}
public Node(int value){
this.value = value;
next = null;
}
public Node(Node p){
this.value = p.value;
next = p.next;
}
public int getValue(){
return value;
}
public void setValue(int value){
this.value = value;
}
public Node getNext(){
return next;
}
public void setNext(Node next){
this.next = next;
}

Trang 6
protected void finalize(){
next = null;
}
}
class SimpleList{
private Node header, tailer;
public SimpleList(){
header = null;
tailer = null;
}
public Node getHeader(){
return header;
}
public void setHeader(Node header){
this.header = header;
}
public Node getTailer(){
return tailer;
}
public void setTailer(Node tailer){
this.tailer = tailer;
}
protected void finalize(){
header = tailer = null;
}
public void insertAfferNode(Node p, Node value){
if(header==null){
header=tailer=value;
return;
}
if(value==null) return;
if(p==null){
value.setNext(header);
header=value;
}
else{
value.setNext(p.getNext());
p.setNext(value);
if(p==tailer)
tailer=value;
}
}
public Node deleteAfferNode(Node q){
Node p=null;
if(header==null) return p;
if(q==null){
p=header;
header=p.getNext();
if(header==null)
tailer=null;
p.setNext(null);

Trang 7
}
else{
p=q.getNext();
if(p!=null){
q.setNext(p.getNext());
if(p==tailer)
tailer=q;
p.setNext(null);
}
}
return p;
}
public void CreateList(int n){
System.out.println("Nhap danh sach lien ket:");
Scanner scan = new Scanner(System.in);
for(int i=0;i<n;i++){
System.out.print("Nhap phan tu thu "+i+":");
int x=scan.nextInt();
insertAfferNode(tailer,new Node(x));
}
}
public void println(){
System.out.println("Xuat danh sach lien ket:");
for(Node i=header;i!=null;i=i.getNext()){
System.out.print(i.value+" ");
}
}
public static void main(String[] args) {
// TODO code application logic here
SimpleList sl=new SimpleList();
sl.CreateList(9);
sl.println();
}
}
2.1.2. Bài tập thực hành
Bài tập 1: Dựa code xây dựng lớp danh sách liên kết đơn bên trên. Em hãy xây dựng
và hiện thực demo các phương thức sau:
a. Thêm 1 node vào đầu danh sách liên kết.
public void addHeader(Node q);
b. Thêm 1 node vào cuối danh sách liên kết.
public void addTailer(Node q);
c. Xóa 1 node ở đầu danh sách liên kết
public Node removeHeader();
d. Xóa 1 node ở cuối danh sách liên kết
public Node removeTailer();

Trang 8
e. Tìm kiếm 1 số nguyên có tồn tại trong danh sách liên kết.
public Node search(int x);
f. Xóa danh sách liên kết
public void DeleteList();
g. Sắp xếp danh sách liên kết tăng hoặc giảm
public void SortAcc();
public void SortDec();
h. Liệt kê các giá trị âm có trong DSLK
i. Tìm số âm lớn nhất trong DSLK
j. Hiện thị 3 phần tử có giá trị lớn nhất trong DSLK
k. Chèn số 2 vào sau mỗi phần tử có giá trị chẵn trong DSLK
l. Xóa tất cả các số âm trong DSLK
m. Xóa tất cả các phần tử trùng nhau trong DSLK chỉ giữ lại một phần tử
n. Xóa k phần tử bắt đầu từ phần tử lẻ đầu tiên trong DSLK
o. Sắp xếp DSLK đơn tăng dần các giá trị chẵn và giảm dần các giá trị lẻ.
q. Trộn 2 DSLK tăng dần thành 1 DSLK tăng.
Bài tập 2: Định nghĩa kiểu dữ liệu cấu trúc SinhVien gồm 3 thông tin: MSSV; họ tên;
tên học phần; điểm quá trình (số thực), điểm thi (số thực), điểm tổng kết (số thực), xếp
loại (1 ký tự). Xây dựng các chức năng thực hiện các yêu cầu sau:
a) Nhập thông tin một sinh viên từ bàn phím.
b) Xuất thông tin một sinh viên ra màn hình.
c) Tính điểm tổng kết của sinh viên.
Điểm tổng kết = điểm quá trình * 40% + điểm thi * 60%
d) Tính xếp loại của sinh viên theo quy tắc:
ĐTK >= 8.5  “A”; 7 <= ĐTK < 8.5  “B”; 5.5 <= ĐTK <7  “C”; 4 <= ĐTK <5.5
 “D”; ĐTK < 4: “F”.
Bài tập 3: Sử dụng thông tin đã cài đặt ở bài tập 2. Dùng lớp LinkedList trong java
để viết chương thực hiện các yêu cầu sau:
a) Nhập và xuất N sinh viên (N<=10000) từ bàn phím.
b) Tính điểm tổng kết, xếp loại của N sinh viên.
c) Cho biết số lượng sinh viên có ĐTK >= 4.
d) Cho biết ĐTK cao nhất, ĐTK thấp nhất.
e) Hiển thị thông tin của 2 sinh viên có điểm thi cao nhất.
g) Sắp xếp danh sách sinh viên giảm dần theo điểm tổng kết.

Trang 9
h) Sắp xếp danh sách sinh viên tăng dần theo MSSV.
i) Nhập vào một chuỗi s là mssv. Cho biết có tồn tại sinh viên có mã s trong mảng
hay không? Nếu có thì cho biết vị trí và xuất thông tin của sinh viên đó.
Bài tập 4: Cho danh sách sl chứa các phân số, biết mỗi phân số có 2 thành phần là tử
số (tuSo) và mẫu số (mauSo). Hãy viết chương trình cho phép:
a) Tạo các lớp PhanSo, ListPS.
b) Tối giản các phân số.
c) Nhập/xuất danh sách có n phân số.
d) Tính tổng/tích của danh sách phân số.
e) Cho biết phân số lớn nhất, phân số nhỏ nhất.
f) Tăng mỗi phân số của danh sách lên 1 đơn vị.
g) Xuất các phân số tại các vị trí chẵn.
h) Tìm 1 phân số p có trong danh sách sl hay không?
Bài tập 5: Hãy định nghĩa DSLK đơn sl để lưu trữ một đa thức (gồm nhiều đơn thức)
có dạng: p(x) = a0xn + a1xn-1 + … + an-1x1 + an và cài đặt các hàm sau:
a) Nhập/xuất đa thức.
b) Sắp xếp đa thức theo chiều giảm dần của bậc (số mũ).
c) Rút gọn đa thức.
d) Thêm một đơn thức mới vào sao cho vẫn giữ nguyên tính thứ tự của bậc.
e) Xóa một đơn thức khi biết bậc.
f) Tính giá trị của đa thức khi biết giá trị của x.
g) Thực hiện việc cộng/trừ/nhân 2 đa thức P và Q để tạo ra một đa thức mới.
2.2. Ngăn xếp
2.2.1. Xây dựng lớp ngăn xếp
Ví dụ 1: Xây dựng lớp stack
Bước 1: Xây dựng lớp Node và lớp SimpleList
Bước 2:
class Nganxep{
SimpleList sl;
public Nganxep(){
sl = new SimpleList();
}
public Boolean Empty(){
if(sl.getHeader()==null) return true;
return false;
}
public void push(Node p){
sl.insertAfferNode(null,p);

Trang 10
}
public Node pop(){
return sl.deleteAfferNode(null);
}
}
Ví dụ 2: Xây dựng ứng dụng đổi 1 số nguyên sang hệ cơ số 2.
class Songuyen{
int a;
public Songuyen(int x){
a=x;
}
public void Doicoso(int hecoso){
Nganxep s=new Nganxep();
int n=a;
while(n != 0){
s.push(new Node(n % hecoso));
n=n / hecoso;
}
while(s.Empty()!=true)
System.out.print(s.pop().value);
}
public static void main(String[] args) {
// TODO code application logic here
Songuyen s=new Songuyen(26);
s.Doicoso(2);
}
}
2.2.2. Bài tập thực hành
Bài tập 6: Viết chương trình thực hiện đổi 1 số nguyên sang hệ cơ số 16. Sử dụng lớp
Stack trong java (java.util.Stack).
Bài tập 7: Viết chương trình kiểm tra dấu mở và đóng ngoặc trong 1 biểu thức đúng
hay sai. Ví dụ: ((8*2-2)+1*2). Kết quả: true.
Bài tập 8: Viết chương trình sử dụng stack trong việc khử đệ quy thuật toán
QuickSort.
Bài tập 9: Viết chương trình sử dụng stack trong việc khử đệ quy thuật toán tháp Hà
Nội.
Bài tập 10: Viết chương trình một bảng tính cho phép thực hiện các phép tính +, - , * ,
/. Ví dụ: 8*2-2+1*2. Kết quả: 16.
Bài tập 11: Cài đặt chương trình cho phép nhập vào một biểu thức gồm các số, các
toán tử + , -, * , / , % , các hàm toán học sin, cos, tan, ln, ex, dấu mở đóng ngoặc “(”,
”)” và tính toán giá trị của biểu thức.
2.3. Hàng đợi

Trang 11
2.3.1. Xây dựng lớp hàng đợi
Ví dụ 1: Xây dựng lớp queue
Bước 1: Xây dựng lớp Node và lớp SimpleList
Bước 2:
class Hangdoi{
SimpleList sl;
public Hangdoi(){
sl = new SimpleList();
}
public Boolean Empty(){
if(sl.getHeader()==null) return true;
return false;
}
public void offer(Node p){
sl.insertAfferNode(sl.tailer,p);
}
public Node poll(){
return sl.deleteAfferNode(null);
}
}
Ví dụ 2: Viết chương trình kiểm tra 1 số nhập vào có phải là số Palindromes. Yêu cầu
sử dụng cả stack và queue.
Ví dụ: + Palindromes: “radar”, “deed”, “aibohphobia”, 1328231.
+ Non-palindromes: “data”, “little”, 34523
class Palindrome{
int a;
public Palindrome(){
a=0;
}
public Boolean checkPalindrome(){
Nganxep s=new Nganxep ();
Hangdoi q=new Hangdoi();
int n=a;
while(n > 0){
s.push(new Node(n % 10));
q.offer(new Node(n % 10));
n=n / 10;
}
while (s.Empty()==false)
if(s.pop().value != q.poll().value)
return false;
return true;
}
public static void main(String[] args) {
// TODO code application logic here

Trang 12
Palindrome s=new Palindrome(26);
if(s.checkPalindrome())
System.out.print(a+" la so Palindrome");
else
System.out.print(a+" khong la so Palindrome");
}
}
2.3.2. Bài tập thực hành
Bài tập 12: Viết chương trình kiểm tra 1 số nhập vào có phải là số Palindromes. Yêu
cầu sử dụng cả stack và queue hoặc deque trong thư viện java
Bài tập 13: Dựa trên bài toán người sản xuất (NSX) - người tiêu dùng (NTD). NSX
sản xuất ra hàng hóa và chất vào kho theo thứ tự, NTD lấy hàng hóa ra theo thứ tự của
hàng đợi, cái gì chất vào trước thì tiêu thụ trước (giả sử hàng hóa không bị hỏng). Hãy
viết chương trình giúp quản lý kho hàng với những chức năng như sau:
a) Nhập một danh sách n (n>0) mặt hàng vào kho.
b) Xem thông tin tất cả hàng hóa trong kho.
c) Xem thông tin mặt hàng chuẩn bị được xuất kho.
d) Xuất kho một mặt hàng và cho xem thông tin của mặt hàng đó.
e) Xem thông tin mặt hàng mới vừa nhập vào kho.
f) Tìm và xem thông tin của một mặt hàng bất kỳ trong kho.
g) Xuất toàn bộ hàng hóa trong kho.

Trang 13
Trường ĐH CNTP TP.HCM
Khoa CNTT BÀI 3
Bộ môn KHMT MA TRẬN LIÊN KẾT
MSMH:

A. MỤC TIÊU
- Cài đặt được các mảng danh sách liên kết, ma trận thưa, ma trận vuông và bảng
băm.
- Xây dựng ứng dụng trên bảng băm, ma trận vuông.
B. DỤNG CỤ - THIẾT BỊ THỰC HÀNH CHO MỘT SINH VIÊN:
STT Chủng loại – Quy cách vật tư Số lượng Đơn vị Ghi chú
1 Computer 1 1

C. NỘI DUNG THỰC HÀNH


3.1. Mảng danh sách liên kết
3.1.1. Cài đặt mảng danh sách liên kết

Ví dụ 1: Xây dựng mảng danh sách liên kết và phương thức sắp xếp mảng danh sách
liên kết tăng dần theo từng dòng.
public class ArrayDSLK{
LinkedList<Integer> [] arr;
int n;

Trang 14
public ArrayDSLK(int l){
arr=new LinkedList[l];
n=l;
}
public void printArrayDSLK(){
System.out.println("Xuat ma tran:");
for(LinkedList<Integer> i : arr){
Iterator<Integer> iterator = i.iterator();
while (iterator.hasNext())
System.out.print(iterator.next() + "\t");
System.out.println();
}
}
public void createArrayDSLK(){
System.out.print("Nhap so dong ma tran:");
Scanner scan = new Scanner(System.in);
n=scan.nextInt();
for(int i=0; i<n; i++){
System.out.print("Nhap spt tren dong "+i+":");
int m=scan.nextInt();
arr[i]=new LinkedList<>();
for(int j=0; j<m; j++){
System.out.print("Nhap
arr["+i+"]"+"["+j+"]=");
Integer t=scan.nextInt();
arr[i].add(t);
}
System.out.println();
}
}
public void SXArrayTangtheodong(){
for(int i=0; i<n; i++){
int m= arr[i].size();
for(int j=0; j<m; j++)
for(int k=j+1; k<m; k++)
if( arr[i].get(j) > arr[i].get(k) ){
Integer t = arr[i].get(j);
arr[i].set( j, arr[i].get(k));
arr[i].set( k, t);
}
}
}
public static void main(String[] args){
ArrayDSLK a =new ArrayDSLK(10);
a.createArrayDSLK();
a.printArrayDSLK();
a.SXArrayTangtheodong();
a.printArrayDSLK();
}
}

Trang 15
3.1.2. Bài tập thực hành
Bài tập 1: Viết chương trình tìm phần tử lớn nhất của mảng DSLK.
Bài tập 2: Viết chương trình tính tổng dòng thứ i của mảng DSLK.
Bài tập 3: Viết chương trình tính tổng tất cả các phần tử trên mảng DSLK.
Bài tập 4: Viết chương trình đếm số lần xuất hiện một phần tử x bất kỳ.
Bài tập 5: Viết chương trình sắp xếp tăng theo tổng từng dòng trên mảng DSLK.
Bài tập 6: Viết chương trình sắp xếp các phần tử tăng dần trên mảng DSLK theo hình
zic zắc (từ trái sang phải và từ trên xuống dưới).
Bài tập 7: Cho mảng DSLK có n dòng. Viết chương trình kiểm tra mảng DSLK có đối
xứng qua dòng thứ (n/2) hay không.
3.2. Ma trận liên kết
3.2.1. Cài đặt ma trận liên kết
Cấu tạo ma trận liên kết như sau:

Cài đặt ma trận liên kết với phương thức cộng 2 ma trận
public class Matrix{
class Node{
public int cot;
public Integer value;
public Node(int c, Integer v){
cot=c;
value=v;
}
public Node(Node x){
cot=x.cot;
value=x.value;
}
}
LinkedList<Node> [] arr;
int n;

Trang 16
public Matrix(int l){
arr=new LinkedList[l];
n=l;
}
public void printMatrix(){
System.out.println("Xuat ma tran:");
for(LinkedList<Node> i : arr){
Iterator<Node> iterator = i.iterator();
while (iterator.hasNext())
System.out.print(iterator.next().value+"\t");
System.out.println();
}
}
public void createMatrix(){
System.out.print("Nhap so dong ma tran:");
Scanner scan = new Scanner(System.in);
n=scan.nextInt();
for(int i=0; i<n; i++){
System.out.print("Nhap spt tren dong " +
i+":");
int m=scan.nextInt();
arr[i]=new LinkedList<>();
for(int j=0; j<m; j++){
System.out.print("Nhap
arr["+i+"]"+"["+j+"]=");
Node t=new Node(scan.nextInt(),
scan.nextInt());
arr[i].add(t);
}
System.out.println();
}
}
public Matrix AddMatrix(Matrix B){
Matrix C=new Matrix(n);
for(int i=0; i<n; i++){
int m= arr[i].size(), m1=B.arr[i].size();
C.arr[i]=new LinkedList<>();
int j=0, j1=0;
for(; j<m && j1<m1; ){
if(arr[i].get(j).cot<B.arr[i].get(j1).cot)
C.arr[i].add(new Node(arr[i].get(j++)));
if(arr[i].get(j).cot>B.arr[i].get(j1).cot)
C.arr[i].add(new Node(B.arr[i].get(j1++)));
if(arr[i].get(j).cot==B.arr[i].get(j1).cot)
C.arr[i].add(new Node(arr[i].get(j++).cot,
arr[i].get(j++).value + B.arr[i].get(j1++).value));
}//for
for(;j<m;)
C.arr[i].add(new Node(arr[i].get(j++)));
for(;j1<m1;)
C.arr[i].add(new Node(B.arr[i].get(j1++)));

Trang 17
}//for
return C;
}
public static void main(String[] args){
Matrix a =new Matrix(10);
a.createMatrix();
a.printMatrix();
Matrix b =new Matrix(10);
b.createMatrix();
b.printMatrix();
Matrix c = a.AddMatrix(b);
c.printMatrix();
}
}
3.2.2. Bài tập thực hành
Bài tập 8: Viết chương trình hiện thực phép trừ, nhân 2 ma trận liên kết.
Bài tập 9: Bài toán người bán hàng. Một người bán hàng cần đến thăm N khách hàng
ở N địa điểm khác nhau. Tìm một hành trình cho người bán hàng trên sao cho: Mỗi địa
điểm thăm 1 lần, sau đó quay về điểm xuất phát.
Hướng dẫn: Xét đồ thị có hướng G gồm n đỉnh sao cho mỗi đỉnh ứng với một địa điểm
và có một cung nối từ địa điểm này đến địa điểm kia.
Bài tập 10: Trong một đợt thi đấu bóng bàn có n (n>=2) đấu thủ tham gia. Mỗi đấu
thủ gặp từng đấu thủ khác đúng một lần. Trong thi đấu bóng bàn chỉ có khả năng thắng
hoặc thua. Viết chương trình xếp tất cả các đấu thủ đứng thành một hàng dọc sao cho
người đứng sau thắng người đứng trước.
Hướng dẫn: Xét đồ thị có hướng G gồm n đỉnh sao cho mỗi đỉnh ứng với một đấu thủ
và có một cung nối từ đấu thủ này thắng đấu thủ kia.
Bài tập 11: Có n đại biểu từ n nước đến dự hội nghị quốc tế. Mỗi ngày họp một lần
ngồi quanh một bàn tròn. Hỏi phải bố trí bao nhiêu ngày và bố trí như thế nào sao cho
trong mỗi ngày, mỗi người có hai người kế bên là bạn mới. Lưu ý rằng n người đều
muốn làm quen với nhau.
Hướng dẫn: Xét đồ thị gồm n đỉnh, mỗi đỉnh ứng với mỗi người dự hội nghị, hai đỉnh
kề nhau khi hai đại biểu tương ứng muốn làm quen với nhau. Như vậy, ta có đồ thị đầy
đủ Kn. Đồ thị này là Hamilton và rõ ràng mỗi chu trình Hamilton là một cách sắp xếp
như yêu cầu của bài toán.
Bài tập 12: Cho hai ma trận vuông. Em hãy viết chương trình hiện thực các phương
thức sau:
a) Kiểm tra tính đối xứng của các phần tử trên đường chéo chính.

Trang 18
b) Tính tổng các phần tử của tam giác trên đường chéo chính.
c) Tính tổng các phần tử của tam giác dưới đường chéo chính.
d) Kiểm tra tính đối xứng của các phần tử trên đường chéo phụ.
e) Tính tổng các phần tử của tam giác trên đường chéo phụ.
f) Tính tổng các phần tử của tam giác dưới đường chéo phụ.
g) Tìm ma trận chuyển vị.
h) Kiểm tra 2 ma trận bằng nhau hay không.
i) Tính định thức của ma trận vuông
j) Tìm ma trận nghịch đảo.
Bài tập 13: Cho hệ phương trình gồm m phương trình n ẩn có dạng:

Với aij, bi R, x1, x2, ..., xn là các ẩn số.


Hãy viết chương trình tìm nghiệm của hệ phương trình trên.
Bài tập 14: Sử dụng phương pháp Cramer để giải hệ phương trình trên.
Bài tập 15: Sử dụng phương pháp Gauss để giải hệ phương trình trên.
3.3. Bảng băm (HashTable)
3.3.1. Cài đặt bảng băm với bài toán từ điển
public class _HashTable{
class Cell{
public String key, value; public Cell next;
public Cell(String k, String v){
key=k;value=v;
next=null;
}
public Cell(Cell x){
key=x.key;
value=x.value;
next=x.next;
}
}
LinkedList<Cell> []arr; int n; //số slot
_HashTable(int size){
arr=new LinkedList[size+1];

Trang 19
n=size;
}
public int GetSlot(char k){
return (int)k - 97;
}
public void Insert(Cell x){
int j=GetSlot(x.key.charAt(0));
arr[j].add(new Cell(x));
}
public String Search(String s){
int j=GetSlot(s.charAt(0));
for(Cell i: arr[j])
if( i.key.equals(s) )
return i.value;
return null;
}
public static void main(){
_HashTable ht=new _HashTable();
Cell x=new Cell("hello", "helˈəʊ");
ht.Insert(x);
x=new Cell("love", "lʌv");
ht.Insert(x);
x=new Cell("head", "hed");
ht.Insert(x);
System.out.print("love"+"/"+ht.Search("love")+"/");
}
}
3.3.2. Bài tập thực hành
Bài tập 16: Dữ liệu từ điển anh – anh được lưu từ file. Em hãy Xây dựng từ điển anh –
anh lấy dữ liệu từ file và sử dụng lớp Hashtable trong thư viện java.

Trang 20
Trường ĐH CNTP TP.HCM
Khoa CNTT BÀI 4
Bộ môn KHMT CÂY LIÊN KẾT
MSMH:

A. MỤC TIÊU
- .
B. DỤNG CỤ - THIẾT BỊ THỰC HÀNH CHO MỘT SINH VIÊN:
STT Chủng loại – Quy cách vật tư Số lượng Đơn vị Ghi chú
1 Computer 1 1

C. NỘI DUNG THỰC HÀNH


4.1. Cây nhị phân tìm kiếm cân bằng
4.4.1. Cài dặt cây nhị phân tìm kiếm cân bằng
4.4.2. Bài tập thực hành
4.2. Cây B-Tree
4.2.1. Cài đặt cây B-Tree
4.2.2. Bài tập thực hành

Trang 21
TÀI LIỆU THAM KHẢO
[1] Robert Sedgewick and Kevin Wayne. Algorithms Fourth Edition. Princeton
University. 2011.
[2] Robert Lafore. Data structures & Algorithms in Java. Sams Publishing. 2003.
[3] Nguyễn Tiến, Nguyễn Văn Hoài, Đặng Xuân Hưởng, Nguyễn Hữu Bình. Cấu trúc
dữ liệu và giải thuật trong Java. NXB Thống kê. 2001
[4] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein.
Introduction to Algorithms Third edition. Massachusetts Institute of Technology. 2009.
[5] C. Thomas Wu. An introduction to Object-Oriented programming with Java.
Published by McGraw-Hill. 2010.

Trang 22

You might also like