Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 56 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
56
Dung lượng
2,4 MB
Nội dung
GIÁO VÀ CÔNG TP.HCM T TRÚC Biên ThS Thanh Tùng TS www.hutech.edu.vn HÀNH HÀNH TRÚC *1.2022.COS334* Các ý góp tài tailieuhoctap@hutech.edu.vn này, xin e-mail ban biên : I .I III BÀI 1: PHÂN TÍCH THU T TỐN 1.1 1.2 1.3 1.4 1.5 NÂNG CAO QUY 2.1 2.2 2.3 BÀI 3: DANH SÁCH LIÊN K T 3.1 I 10 10 3.1.1 Danh sách liên k nguyên 10 3.1.2 Danh sách liên k t l 3.2 P - ng 13 P 14 n 14 p ng d ng 15 3.3 18 n 18 i ng d ng 19 BÀI 4: CÂY NH PHÂN TÌM KI M 20 4.1 20 4.2 23 4.3 NÂNG CAO 27 BÀI 5: THU T TOÁN S P X P 28 5.1 SELECTION SORT 28 5.2 BUBBLE SORT 28 5.3 INSERTION SORT 29 5.4 QUICK SORT 29 5.5 MERGE SORT 30 5.6 HEAP SORT 31 5.7 RADIX SORT 32 TH - CHU TRÌNH 34 6.1 34 II 6.2 39 6.3 BÀI TỐN CHU TRÌNH 40 BÀI 7: CÂY KHUNG - N NH T 42 7.1 42 7.2 44 ng gi i thu t BFS, DFS .44 ng gi i thu t Dijkstra .47 50 III MÔ T H C PH N hành trúc hành nâng cao thao tác trình Python Cung trúc sinh viên pháp pháp phát sau: giá quy Các - trúc danh sách liên trúc tìm - cho sinh viên hình thành nên - ngơn Hồn thành - (ngành KHDL) cung Các bao hàng phân, phân tìm cân th thơng N I DUNG H C PH N - 1: PHÂN TÍCH TỐN - 2: - 3: DANH SÁCH LIÊN - 4: CÂY - 5: - 6: - 7: CÂY KHUNG - QUY - PHÂN TÌM TỐN - CHU TRÌNH U C U H C PH N Có Có logic tốn trình Python - HÀNG phân IV CÁCH TI P C N N I DUNG H C PH N này, trúc trung làm ví tham trúc nghiên tốn tài tài mơn liêu thu hành cài hành nâng cao ghi không nhà, trao PHÁP GIÁ H C PH N giá - chuyên quy - 50% Hình dung viên tình hình hành hàng 50%: Trung bình phù p hành 1 BÀI 1: BÀI 1: PHÂN TÍCH Sau - xong giá TỐN sinh viên có - - ý ban 1.1 Xác GIÁ HÀM S hàm giá cho hàm trái a b c d e f g 1.2 SO SÁNH HÀM S hàm theo a b 1.3 XÁC Xác NH TH I GIAN TÍNH gian tính trình cách vào a BÀI 1: vào ma nguyên 3 giá def check(mat): tab = [False, False, False, False, False, False, False, False, False] for row in mat: for item in row: value = item tab[value - 1] = True for item in tab: if item is False: return False return True b vào array def algorithm(array): i = j = m = c = while i < len(array): if a[i] == a[j]: c = c + j = j + if j > len(array): if c > m: m = c c = i = i + j = i return m 1.4 GIÁ TH I GIAN TÍNH TỐN giá gian tính tốn a s = for i in range(n): for j in range(n*n): s = s + trình BÀI 1: b s = for i in range(n): for j in range(i): s = s + c s = for i in range(0, n): for j in range(i*i): for k in range(j): s = s + d s = for i in range(n): s = s + val = for j in range(n*n): val = val * j e s = for i in range(n): s = s + for j in range(n*n): compute_val(s,j) Bi t th c có th i gian tính f s = for i in range(1, n - 1): for j in range(i + 1, n): for k in range(j + 1, n + 1): s = s + g s = for i in range(1, n - 1): for j in range(1, n + 1): BÀI 1: j = j / s = s + 1.5 NÂNG CAO Xét tốn sau dùng có n tìm cách hai toán nguyên: ALGORITHM // input: // Output: for cách to for hai to if nguyên and return Hãy ra cách giá tốn Trình bày tốn 36 BÀI 6: - CHU TRÌNH 23 42 34 023 402 032 142 314 232 426 341 Khai báo ma class Graph(): def init (self, size): self.adjMatrix = [] for i in range(size): self.adjMatrix.append([0 for i in range(size)]) self.size = size def add_edge(self, v1, v2): if v1 == v2: print("Same vertex %d and %d" % (v1, v2)) self.adjMatrix[v1][v2] = self.adjMatrix[v2][v1] = def remove_edge(self, v1, v2): if self.adjMatrix[v1][v2] == 0: print("No edge between %d and %d" % (v1, v2)) return self.adjMatrix[v1][v2] = self.adjMatrix[v2][v1] = BÀI 6: def len (self): return self.size def print_matrix(self): for row in self.adjMatrix: for val in row: print('{:4}'.format(val)), print def main(): g = Graph(5) g.add_edge(0, g.add_edge(0, g.add_edge(1, g.add_edge(2, g.add_edge(2, 1) 2) 2) 0) 3) g.print_matrix() Khai báo danh sách class Vertex: def init (self, node): self.id = node self.adjacent = {} def add_neighbor(self, neighbor, weight=0): self.adjacent[neighbor] = weight def get_connections(self): return self.adjacent.keys() def get_id(self): return self.id def get_weight(self, neighbor): return self.adjacent[neighbor] class Graph: def init (self): self.vert_dict = {} self.num_vertices = - CHU TRÌNH 37 38 BÀI 6: - CHU TRÌNH def add_vertex(self, node): self.num_vertices = self.num_vertices + new_vertex = Vertex(node) self.vert_dict[node] = new_vertex return new_vertex def get_vertex(self, n): if n in self.vert_dict: return self.vert_dict[n] else: return None def add_edge(self, frm, to, cost = 0): if frm not in self.vert_dict: self.add_vertex(frm) if to not in self.vert_dict: self.add_vertex(to) self.vert_dict[frm].add_neighbor(self.vert_dict[to], cost) self.vert_dict[to].add_neighbor(self.vert_dict[frm], cost) def get_vertices(self): return self.vert_dict.keys() Bài sinh viên - vô - vô - có - có 12 có các mã ma khai báo danh sách cho phát sau: - ma In ma danh sách danh sách file cho file BÀI 6: - ma danh sách 6.2 THU T TỐN DUY T Có - TH pháp theo D sang ma - CHU TRÌNH theo sâu (Depth First Search-DFS) (Breadth First Search-BFS) def graphDFS(self,start): stack = [] visited = [] stack.append(start) while (len(stack)): s = stack[-1] stack.pop() if (s not in visited): visited.append(s) print(s) for node in self.get_vertex(s).get_connections(): if (node.id not in visited): stack.append(node.id) def graphBFS(self, start): queue = [] visited = [] queue.append(start) visited.append(s) while (len(queue)): s = queue.pop(0) for node in self.get_vertex(s).get_connections(): if (node.id not in visited): visited.append(node.id) queue.append(node.id) 39 40 BÀI 6: - CHU TRÌNH Bài t p: Sinh viên s ngu n S d ng ph n 6.1 d ng th c vi t th vô tốn v i t ng c giáo trình g i ý, k t h p v i ph n mã trình t ng nh c t o s nh b N u s ng nh th b ng cách: c in b ng th c DFS ho c BFS b ng v i t ng th có thành ph n liên thơng nh in c Vi t c a ph n 6.1 th c thi thu t th Ki m tra s thành ph n liên thông c a a Ki m tra s th theo DFS BFS hồn thi n s nh th c tr th có nhi u thành ph n liên thơng v n u nhi u thành ph n liên thơng tr v n u ch có thành ph n liên thơng 6.3 BÀI TỐN CHU TRÌNH Bài tốn: Ý tra K tra có chu trình Euler (câu 3c) khơng có hay chu trình Euler 1, xét a khơng có b có thì c Ví cịn Mã có chu trình Euler có thúc cịn khơng có chu trình hay ma def checkEuler(self): if(self.isConnect()==0): return odd = 0; for row in self.adjMatrix: for element in row: Euler Euler BÀI 6: - CHU TRÌNH 41 if element > 0: odd+=1 if odd == 0: return elif odd == 2: return elif odd > 2: return Bài Sinh viên hoàn t danh sách n 6.1 tính xác vơ tra chu trình 42 BÀI 7: CÂY KHUNG - BÀI 7: CÂY KHUNG - Sau - xong sinh viên có Cài Các có tốn thao tác tìm có tìm khung ma n khơng có khơng âm giá khơng có thêm giá giá nhiên thay có - 7.1 THU T TỐN TÌM CÂY KHUNG Ý boolean khung n giá true, v khơng khung # [] nút cha xây tìm giá vào mà def minKey(self, key, mstSet): = 999 for v in range(self.size): if key[v] < and mstSet[v] == False: = key[v] min_index = v return min_index khung giá khác khung có cách , 43 BÀI 7: CÂY KHUNG - xây khung def primMST(self): key = [999] * self.size parent = [None] * self.size key[0] = mstSet = [False] * self.size parent[0] = -1 for cout in range(self.size): cách # lý # u # src tiên u = self.minKey(key, mstSet) cách mstSet[u] = True # giá dist vào khung cách cách không t for v in range(self.size): if self.adjMatrix[u][v] > and mstSet[v] == False and key[v] > self.adjMatrix[u][v]: key[v] = self.adjMatrix[u][v] parent[v] = u self.printMST(parent) in khung parent def printMST(self, parent): print("Edge \tWeight") for i in range(1, self.size): print(parent[i], "-", i, "\t", self.adjMatrix[i][ parent[i] ]) g.primMST(); Bài t p: Xây d ng th c d a vào mã ngu n c a xác nh khung l n nh t th c c a thu t tốn Prim cho th vơ ng 44 BÀI 7: CÂY KHUNG - Chuy n th c cho thu t tốn tìm khung b ng thu t tốn Prim có th ch y ng v i danh sách k M t m ng máy tính ho t ng liên thơng, v i (hai chi u) Hàng tháng, nh ng c nh truy n n i Gi s có m t s máy tính i dùng ph i tr bi t máy i v i máy j (v i m i c p máy th y có m t s s m t s ch s b ng ch b A B B C D i x ng), máy 11 12 11 F lo i b tr ng G 12 E Tìm m t gi i pháp F c gán C G E D i dùng nh n m ng v n liên thông Thông A, B, , ch không n i máy A ti n thuê bao n i) Sau m t th i gian, c nh truy n th a, cn i ti n thuê bao c nh truy n n i tin c th v i b ng minh h a thuê bao hàng tháng T thông cho s cho 10 10 b t m t s c nh truy n mà v n ti n ph i thuê bao hàng tháng gi m m b o m ng liên c nhi u nh t Vi t trình th c hi n gi i pháp 7.2 THU T TỐN TÌM 7.2.1 Tìm tốn tìm DFS ng NG b ng gi i thu t BFS, DFS có BFS 45 BÀI 7: CÂY KHUNG - Ý Thêm tham Ví tìm DFS cho ma def DFS(self, start, goal, visited, path): start visited[start]=True path.append(start) vào if start==goal: return True thúc tra start for i in range(self.size): if(self.adjMatrix[start][i]!=-1): if not visited[i]: if self.DFS(i,goal,visited,path): return True #xóa danh sách path(backtrack) path.pop() False khơng return False #visited = [False]*g.size #path=[] #g.DFS(0,7,visited,path) #print(list(path)) tìm ma BFS def BFS(self,start, goal): visited = [] queue = [[start]] if start == goal: return start while queue: path = queue.pop(0) node = path[-1] if node not in visited: neighbours = self.adjMatrix[node] for i in range(self.size): if neighbours[i] != -1: new_path = list(path) new_path.append(i) 46 BÀI 7: CÂY KHUNG - queue.append(new_path) if i == goal: return new_path visited.append(node) #print(g.BFS(0,3))) Bài Chu hai BFS DFS cho thích danh sách Trên m t c vua kích quân mã ch s , v trí c a quân t t c t Quân mã t t ch c Hai quân c c quy n m t s ng t , theo ng xu ng di chuy n theo quân c khác Cho c vô h n có m t mã m t t t V trí c a i (t t, xen k ch s bàn c v trí dịng vua chu n Quân n v trí Khi m t quân c c v trí ban u c a hai quân c t th ng không n u th ng s ph i - Dòng nh - Dòng hai ghi hai - Dòng ba ghi 0/1 qn - Dịng vào v trí c a ghi hai c a quân c Hãy tính quân mã nh t ghi YES/NO dịng YES dịng c qn qn có khơng có - ng qn c v a di chuy n s th ng có kh - ngun có hai ghi 1000 47 BÀI 7: CÂY KHUNG - 7.2.2 Tìm ng b ng gi i thu t Dijkstra Ý - 1: cách cách ban cách Các a có sau 3: cách khơng xét danh sách danh sách ghi b nh a cách avào cách cách giá a b b thúc u ghi 4: Sau xét cách Ta xét b - nh khác 2: - #INF, a Lúc ta Quay cách danh sách danh sách toán def dijkstra(self, start_vertex): D = {v:float('inf') for v in range(self.size)} D[start_vertex] = pq = PriorityQueue() pq.put((0, start_vertex)) while not pq.empty(): (dist, current_vertex) = pq.get() self.visited.append(current_vertex) for neighbor in range(self.size): if self.adjMatrix[current_vertex][neighbor] != -1: distance = self.adjMatrix[current_vertex][neighbor] if neighbor not in self.visited: old_cost = D[neighbor] new_cost = D[current_vertex] + distance if new_cost < old_cost: pq.put((new_cost, neighbor)) 48 BÀI 7: CÂY KHUNG - D[neighbor] = new_cost return D # D= g.dijkstra(0) # for vertex in range(len(D)): # print("Distance from vertex to vertex", vertex, "is", D[vertex]) Bài Dijkstra cho Hùng mua Hà vào TP phù danh sách giá cho hành trình Chí Minh Hùng có giá bay Tuy nhiên có giá bay vào Dịng tiên có hai m nguyên n m: bay Sân bay có bay sân bay hành trình Các sân bay TP Chí Minh dịng mơ bay sân bay thành n bay bay Sân bay dịng có ba , thúc ngun sân bay thành Hà : giá bay Hà TP Chí Minh In nguyên: giá Khi bay giá cho làm tròn nguyên) Hà bay có giá x, giá TP Chí Minh thành x / BÀI 7: CÂY KHUNG - Ví Input Output 2 3 1 215 49 50 TÀI THAM [1] Bình (2021) Thành [2] trúc Cơng Chí Minh (2013) trúc toán, Bách Khoa Hà [3]Kent D Lee, , Steve Hubbard (2015) Data Structures and Algorithms with Python, Luther College, Decorah [4]https://vnspoj.github.io/problems/KANDP.html Truy [5]https://cses.fi/problemset/task/1195 Truy ngày 29/6/2022 ngày 29/6/2022