heapprivate Key[] keys; Mảng chứa giá trị gốc* Các phương thức: public IndexMaxPQint maxN Hàm tạo có tham số maxN là dung lượng tối đapublic boolean isEmpty Kiểm tra xem mảng có rỗng hay
Trang 1TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢIKHOA CÔNG NGHỆ THÔNG TIN
-o0o -BÁO CÁO THỰC HÀNH MÔN HỌC PHÂN TÍCH
THIẾT KẾ THUẬT TOÁN
Giảng viên : Trần Văn DũngSinh viên thực hiện: Đinh Thành LộcMã sinh viên : 221230909 Lớp: CNTT 2 K63
Hà Nội, tháng 5 năm 2024
Trang 2heapprivate Key[] keys; Mảng chứa giá trị gốc
* Các phương thức:
public IndexMaxPQ(int maxN) Hàm tạo có tham số maxN là dung lượng tối đapublic boolean isEmpty() Kiểm tra xem mảng có rỗng hay không Ɵ(1)public boolean contains(int
i) Kiểm tra hàng đợi có chứa phần tử chỉ số‘i’ không (1)
Ɵ
public void insert(int i, Key
public Key keyOf(int i) Trả về ‘key’ của phần tử có chỉ số ‘i’ trong
Ɵ
Trang 3public void changeKey(int i, Key key) Thay đổi ‘key’ của phần tử có chỉ số ‘i’ (log n)public void
decreaseKey(int i, Key key)
Giảm giá trị ‘key’ của phần tử tại chỉ số ‘I’ Ɵ(log n)public void increaseKey(int
i, Key key) Tăng giá trị ‘key’ của phần tử tại chỉ số ‘I’ (log n)
private void exch(int i, int
Ɵ
private void swim(int k) phần tử có chỉ số ‘k’ lên vùng heap cho đến
khi thuộc tính heap được thỏa mãn (n)
Ɵ
private void sink(int k) phần tử có chỉ số ‘k’ xuống heap cho đến khi
thuộc tính heap được thỏa mãn (n)
Ɵ
public Iterator<Integer> iterator() trả về một trình vòng lặp lặp lại các phần tử trong hàng ưu tiên theo thứ tự tăng dần của
các ‘key’ của chúng
(1)Ɵ
b) Kết quả chạy:
Trang 42 Cài đặt DijkstraAllPairs: tìm mọi đường đi giữa hai đỉnh
a)
*Thành phần dữ liệu :
private DijkstraSP[] dijkstrasp Mảng lưu trữ đường đi ngắn nhất từ đỉnh nguồn
điểm mọi đỉnh*Các phương thức :
public DijkstraAllPairsSP(EdgeWeightedDigraph G) Hàm tạo nhận một đồ thị có trọng số trên cạnh G là đối
số
O(V x (V + E) log V),V là số đỉnh, E là số cạnh
public Iterable<DirectedEdge> path(int s, int t) Iterable chứa các cạnh từ đỉnh s đến đỉnh t trên đường
đi ngắn nhất
O(1)public boolean hasPath(int s, int t) Kiểm tra đường đi có tồn tại
Trang 6private boolean[] marked; Đánh dấu đỉnh có thuộc cây ko private IndexMinPQ<Double>
Phương thức khởi tạo của lớp thực thi thuậttoán Prim tìm cây bao trùm
O(ElogV),private void
prim(EdgeWeightedGraph G, int s)
private void scan(EdgeWeightedGraph G, int v)
Quét đỉnh v trong đồ thị và cập nhật thông
public Iterable<Edge> edges() Trả về giá trị các cạnh trong cây bao trùm min 𝑂( )𝑉public double weight() Tính tổng trọng số cây bao trùm Min O(E)private boolean
check(EdgeWeightedGraph G)
Kiểm tra tính đúng của cây bao trùm 𝑂( )𝐸
b) Kết quả chạy:
Trang 74 Đóng gói ba lô có phương thức: taobalo(), tonggiatri(), dovat()
Lớp Item: đại diện cho một vật trong bài toàn xếp balo
public int getWeight() Trả về trọng lượng của vật Ɵ(1)
public int setWeight() Cập nhập giá trị cho trọng lượng Ɵ(1)Public String setProfit() Cập nhập giá trị cho giá trị Ɵ(1)
Lớp Knapsack: giải quyết, lưu trữ kết quả và cung cấp phương thức truy cập kết quả
* Thành phần dữ liệu:
private int capacity Sức chứa tối đa của baloprivate Item[] item; Mảng chứa các đối tượngprivate boolean[][] sol; Mảng lưu trữ các giải pháp
* Các phương thức:
public int maxProfit() Tính toán và trả về lợi nhuận tối đa có thể
đạt được dựa trên sức chứa và danh sách cácđối tượng
(N x W),Ɵ
public void inBag() Xác định các đối tượng nào được chọn để
đạt lợi nhuận tối đa và in ra danh sách các đối tượng đó
(N x W)Ɵ
Trang 8main Tạo danh sách đổi tượng và chạy chương
addSolution(int[][] solution)
thêm một ma trậnpublic void
printSolutions() in ra tất cả giải phápprivate void
printBoard(int[][] board) In ra 1 giải pháp Lớp NQueensss
* Thành phần dữ liệu:
Trang 9private int N; Lưu trữ số lượng hậu private List<SolutionN>
solutions;
Danh sách chứa tất cả các giải pháp của bài toán, mỗi giải pháp được biểu diễn bằng đối tượng SolutionNPrivate void solve() Tìm tất cả các giải pháp của bài toán
private boolean isSafe(int row, int col,int board[][])
Kiểm tra việc đặt quân hậu đã hợp lí chưaprivate boolean
solveNQUtil(int col,int board[][])
Đệ quy tìm tất cả các giải pháp
* Các phương thức:
public AllSolNQueen(int N) Hàm tạo nhận số lượng quân hậupublic void printAllSolutions() In ra tất cả các giải pháppublic int getResults() Trả về tổng kết quảpublic void printSolution(int board[][]) In ra một giải pháp bẳng ma trận
* Hàm Main
public static void main(String args[]) Hàm main chạy chương trìnhb)Kết quả
Trang 106 Đóng gói: FileFrequencyIndex: các phương thức Đọc file, query(word)
* Các phương thức:
public FileFrequencyindex(String name)
Hàm tạo có tham số là chuỗi tên các tệp cần xử lý
Public void query(String key) Tìm kiếm xem ‘key’ xuất hiện trong các tệp nào và tần suất xuất hiện trong mỗi tệp (1)
Ɵ
Public static void
Ɵ
b)File text
Trang 11c)Kết quả chạy
7 Cài đặt lớp Sinh vien Sinhvien: tính diem TBC, tinh diem TBC hoc ky(kythu), NhapdiemmonSV(Mon m, Integer diem)
a)
Trang 12Các hàm getter setter và constructor Dùng để lấy và nhập giá trị và
khởi tạo đối tượngpublic void themMonHoc(Monhoc
monhoc)
Thêm 1 môn học vào danh sáchmôn hjc của sinh viên
O(1)
public double diemTBCHocKy(int hocKy)
Tình điểm trung bình 1 kì O(1)
học
b) Kết quả chạy:
8 TopM sinh vien: theo tiêu chí: Trẻ, Điểm TBC, Tên và họ đệm
Lớp Student: quản lý thông tin sinh viên và các phương thức quản lý
Trang 13* Các phương thức:
Main Chứa các hàm sắp xếp và chạy chương triình Ɵ(n)
Trang 14(ƟmaxFlow * V^2)
b) Kết quả chạy:
10 Sử dụng Inversion trong Project Beyond: Cho một file Text danh sách sinh viên,mỗi sinh viên 1 dòng Danh sách sinh viên trên chưa được sắp xếp theo (tên, họ và đệm) Tìm số nghịch thể trong danh sách đã cho và sắp xếp lại theo thứ tự tên, họ đệm
a)
* Các phương thức
private CountingInversions() Phương thức tạo (constructor)private static long merge(int[] a, int[]
aux, int lo, int mid, int hi) Thực hiện việc kết hợp hai mảng con đã sắp xếp thành một mảng
con lớn và đếm số lượng đảo ngược trong quá trình này
O(n log n)private static long count(int[] a, int[]
b, int[] aux, int lo, int hi)
Dếm số lượng đảo ngược trong một mảng
O(n log n)public static long count(int[] a) Hàm được sử dụng để tính số
lượng đảo ngược trong một mảng
số nguyên a
O(nlog n)
Trang 15private static <Key extends Comparable<Key>> long merge(Key[] a, Key[] aux, int lo, int mid, int hi)
Như hàm merge nhưng cho phép sử dụng bất kì kiểu dữ liệu nào khi gọi phuong thức
private static <Key extends Comparable<Key>> long count(Key[]a, Key[] b, Key[] aux, int lo, int hi)public static <Key extends Comparable<Key>> long count(Key[]a)
private static <Key extends Comparable<Key>> boolean less(Keyv, Key w)
Dược sử dụng để so sánh hai đối
private static <Key extends Comparable<Key>> long brute(Key[]a, int lo, int hi)
Đếm số lượng dảo ngược trong một mảng của các đối tượng có a
thể so sánh được với chính chúng
O(n^2)
private static long brute(int[] a, int lo,
b) File text
c) kết quả chạy :
Trang 1611 Dựa trên Closest Pairs trong Project Beyond cài đặt FarthestPair: tìm 2 diểm xa nhau nhất
* Các phương thức:
ublic static double distance(Point p1,
ublic static double farthestDistance(Point[] points) Tìm khoảng cách xa nhất O(n^2)main Khởi tạo và tính toán O(1)
b) Kết quả chạy:
12 Đóng gói xếp lịch Weighted Interval Scheduling: đọc trong bài giảng Dynamic programming 1 và dựa trên file Job trong Context
a) Class Job*Phương thức
public int compareTo (Job y) So sánh hai công việc dựa trên
thời gian kết thúc của chúng O(1)
public static int Thực hiện tìm kiếm nhị phân O(log n)
Trang 17findLastNonConflictingJob(List<Job>jobs, int n) trong danh sách các công việc đãđược sắp xếp theo thời gian kết
thúcpublic static int maxProfit(List<Job> jobs) Sắp xếp các công việc theo thời gian kết thúc tăng dần O(n log n)
Class WeightedIntervalScheduling*Phương thức
WeightedIntervalScheduling(List<Job>jobs)
Xây dựng, sắp xếp, lưu trữ đối tượng
O(n log n)public List<Job> getSelectedJobs() Trả về danh sách các công việc
đã chọn
O(1)public void printSelectedJobs() In ra thông tin của các công việc
public FileFrequencyIndex() Khởi tạo đối tượng
“FileFrequencyIndex” với HashMap để lưu trữ index
O(1)public void addFile(Path filePath) Đọc từng dòng trong tệp và đếm
private Map<String, Integer> countWords(Path filePath)
Đọc từng dòng trong tệp và đếm tần suất xuất hiện
O(m)public List<FileCount> query(String
word)
Truy vấn index để tìm từ được truy vấn
O(n log n)
Trang 18b) File text
c) Kết quả
14 Cài đặt Edmond-Branching
a) Class EdmondsBranching*Phương thức
b) Kết quảpublic List<Edge> findMaximumBranching(Graph graph, int root)
Danh sách các cạnh thuộc cây tốiđa
O(n)
private void detectCycle(int node, Map<Integer, Edge> maxEdgeTo, Set<Integer> visited, Set<Integer> cycle)
phát hiện các chu trình trong đồ
public static void main(String[] args) Khởi tạo một đối tượng và chạy
chương trình
Trang 1915 Cài đặt thuật toán Erliest-Finish-Time-First cho bài toán Interval Scheduling trong Bài giảng Greedy Algorithm
a) Class VietNamDate*Phương thức
public static void intervalScheduling(List<Interval> intervals)
Sắp xếp danh sách các khoảng thời gian theo thời gian kết thúc tăng dần
O(n log n)
public static void main(String[] args) Tạo một danh sách các khoảng
thời gian và gọi phương thức
intervalScheduling để lựa chọn
các khoảng thời gian
O(n log n)
b) Kết quả