Đề Xuất 6/2023 # Cấu Trúc Dữ Liệu Set Trong Python # Top 9 Like | Sieuphampanorama.com

Đề Xuất 6/2023 # Cấu Trúc Dữ Liệu Set Trong Python # Top 9 Like

Cập nhật nội dung chi tiết về Cấu Trúc Dữ Liệu Set Trong Python mới nhất trên website Sieuphampanorama.com. Hy vọng thông tin trong bài viết sẽ đáp ứng được nhu cầu ngoài mong đợi của bạn, chúng tôi sẽ làm việc thường xuyên để cập nhật nội dung mới nhằm giúp bạn nhận được thông tin nhanh chóng và chính xác nhất.

Python khác với các ngôn ngữ lập trình khác, nó đưa ra rất nhiều các cấu trúc dữ liệu dạng đa giá trị, trong bài trước chúng ta đã học về List và Tuple, bài này chúng ta tìm hiểu về hai cấu trúc dữ liệu tiếp theo của Python là Set (tập hợp).

1. Tập hợp (Set)

Các phần tử của tập hợp phải là các dữ liệu không thể thay đổi như một số (int), một chuỗi (string), hoặc một Tuple.

1.1 Khai báo tập hợp

Tập hợp (Set) trong Python có một số tính chất mà bạn cần nhớ:

Các phần tử trong tập hợp không có thứ tự.

Các phần tử này là duy nhất, không cho phép lặp lại.

Set có thể thay đổi (thêm bớt phần tử) nhưng các phần tử của tập hợp phải ở dạng không thể thay đổi (tức là xác định được dung lượng bộ nhớ ngay khi khai báo).

Chúng ta sử dụng các dấu ngoặc nhọn trong khai báo Set, ví dụ:

friends = {"Rolf","Bob","Anne"} print(friends)

Chú ý:

[] sử dụng khai báo List

() sử dụng khai báo Tuple

{} sử dụng khai báo Set

1.2 Thay đổi tập hợp

Các phần tử trong tập hợp có thể thêm hoặc loại bỏ. Python hỗ trợ rất nhiều các phương thức để thực hiện thao tác thay đổi tập hợp.

1.2.1 Phương thức .add()

Phương thức sử dụng để thêm một phần tử vào tập hợp.

Ví dụ:

friends = {"Rolf","Bob","Anne"} friends.add("Jen") print(friends) # Kết quả là {"Bob","Jen","Anne","Rolf"}

Chú ý, kết quả có thể khác đi do Set không sắp xếp các phần tử theo một trật tự nào cả.

1.2.2 Phương thức .remove()

Loại bỏ một phần tử trong tập hợp.

Ví dụ:

friends = {"Rolf","Bob","Anne"} friends.remove("Anne") print(friends) # Kết quả là {"Rolf","Bob"} friends.remove("Jen") print(friends) # Kết quả là lỗi KeyError: "Jen"

Khi loại bỏ một phần tử, nếu phần tử đó không tồn tại trong tập hợp, chương trình sẽ dừng và một thông báo lỗi KeyError xuất hiện.

1.2.3 Phương thức .discard()

Giống như phương thức .remove() loại bỏ phần tử trong tập hợp, tuy nhiên nếu phần tử đó không tồn tại thì nó không báo lỗi gì cả.

friends = {"Rolf","Bob","Anne"} friends.discard("Anne") print(friends) # Kết quả là {"Rolf","Bob"} friends.discard("Jen") print(friends) # Kết quả là {"Rolf","Bob"}

1.2.4 Phương thức .pop()

Loại bỏ một phần tử ngẫu nhiên khỏi tập hợp.

friends = {"Rolf","Bob","Anne"} friends.pop() print(friends) # Kết quả là {"Bob","Rolf"}

Bạn cần chú ý về thứ tự các phần tử trong tập hợp, nó không được sắp xếp theo bất kỳ quy tắc nào.

1.2.5 Phương thức .clear()

Loại bỏ tất cả các phần tử trong tập hợp, khi đó tập hợp được gọi là tập rỗng.

friends = {"Rolf","Bob","Anne"} friends.clear() print(friends) # Kết quả là set()

1.2.6 Phương thức .update()

Phương thức .add() ở trên chỉ thêm được 1 phần tử vào tập hợp với 1 câu lệnh, để thêm nhiều phần tử, chúng ta sử dụng .update(). Chú ý, đầu vào của .update() có thể là một Set, một List hoặc một Tuple.

friends = {"Rolf","Bob","Anne"} friends.update(["Jen","Charlie"],{"Jonhny", "Sara"},("Laura","Elite")) print(friends) # Kết quả là {'Anne', 'Laura', 'Elite', 'Rolf', 'Jonhny', 'Charlie', 'Bob', 'Sara', 'Jen'}

Kết quả của bạn có thể có thứ tự khác đi, một chú ý nữa là không sử dụng chuỗi để cập nhập vào tập hợp mà các phần tử là chuỗi bởi vì chuỗi sẽ được coi là một danh sách các ký tự, ví dụ:

friends = {"Rolf","Bob","Anne"} friends.update("Jen") print(friends) # Kết quả là {'n', 'e', 'Rolf', 'Bob', 'Anne', 'J'}

Không như mong đợi phải không, bạn có thể sử dụng phương thức .add() hoặc có thể chuyển chuỗi thành Set, List hoặc Tuple có 1 phần tử:

friends = {"Rolf","Bob","Anne"} friends.update(("Jen",)) # hoặc friends.update(["Jen"]) # hoặc friends.update({"Jen"})

1.3 Các phép toán trong tập hợp

Các tập hợp có lợi thế hơn các cấu trúc dữ liệu khác ở chỗ nó thực hiện được các phép toán tập hợp như hợp, hiệu, giao… Để mô tả dễ hiểu hơn, chúng ta có hai tập hợp art_friends và science_friends là tập hợp các bạn trong lớp Mỹ thuật và tập hợp các bạn trong lớp Khoa học.

art_friends = {"Rolf", "Anne", "Jen"} science_friends = {"Jen", "Charlie"}

Các phép toán được mô tả như hình sau:

Hợp của hai tập hợp cho kết quả là tất cả các phần tử trong hai tập hợp, chú ý phần tử nào lặp lại sẽ chỉ xuất hiện 1 lần trong tập kết quả. Trong Python, để thực hiện phép hợp, chúng ta sử dụng phương thức .union(). Chú ý, sử dụng tập hợp nào trước cũng cho kết quả như nhau, art_friends.union(science_friends) cũng cho kết quả như science_friends.union(art_friends).

art_friends = {"Rolf", "Anne", "Jen"} science_friends = {"Jen", "Charlie"} all_friends = art_friends.union(science_friends) print(all_friends) # Kết quả {'Rolf', 'Anne', 'Jen', 'Charlie'}

Chú ý, “Jen” có mặt trong cả hai lớp nhưng với tập kết quả cuối cùng thì “Jen” chỉ xuất hiện 1 lần.

1.3.2 Phép trừ (Difference)

Hiệu của một tập A trừ đi một tập B cho kết quả là tất các phần tử thuộc A nhưng không thuộc B. Sử dụng phương thức .difference() để thực hiện phép trừ hai tập hợp.

art_friends = {"Rolf", "Anne", "Jen"} science_friends = {"Jen", "Charlie"} art_but_not_science = art_friends.difference(science_friends) science_but_not_art = science_friends.difference(art_friends) print(art_but_not_science) # Kết quả {'Rolf', 'Anne'} print(science_but_not_art) # Kết quả {'Charlie'}

Trong ví dụ trên, tập hợp art_but_not_science chứa các bạn học lớp Mỹ thuật nhưng không học lớp Khoa học, chú ý “Jen” học cả hai lớp nên không có mặt trong tập hợp này.

1.3.3 Hiệu đối xứng của hai tập hợp (Symmetric difference)

Hiệu đối xứng của hai tập A và B được kết quả là tập hợp các phần tử thuộc cả A và B nhưng không đồng thời thuộc cả tập A và B. Phương thức .symmetric_difference() cho kết quả là hiệu đối xứng của hai tập hợp. Chú ý, do tính chất đối xứng nên art_friends.symmetric_difference(science_friends) và science_friends.symmetric_difference(art_friends) cho kết quả như nhau.

art_friends = {"Rolf", "Anne", "Jen"} science_friends = {"Jen", "Charlie"} not_in_both_1 = art_friends.symmetric_difference(science_friends) print(not_in_both_1) # Kết quả {'Rolf', 'Charlie', 'Anne'} not_in_both_2 = science_friends.symmetric_difference(art_friends) print(not_in_both_2) # Kết quả {'Rolf', 'Anne', 'Charlie'}

1.3.4 Phép giao (Intersection)

Phép giao hai tập hợp cho kết quả là các phần tử đồng thời thuộc cả hai tập hợp. Trong Python sử dụng phương thức .intersection() để thực hiện phép giao, chú ý tập hợp nào đứng trước cũng được, do đó kết quả art_friends.intersection(science_friends) và science_friends.intersection(art_friends) là như nhau.

art_friends = {"Rolf", "Anne", "Jen"} science_friends = {"Jen", "Charlie"} art_and_science = art_friends.intersection(science_friends) print(art_and_science) # Kết quả là {"Jen"}

Tập hợp art_and_science chứa các bạn học đồng thời cả lớp Mỹ thuật và lớp Khoa học, do đó kết quả chỉ có “Jen” học cả hai lớp này.

1.3.5 Thay đổi tập hợp dựa trên phép toán tập hợp

Trong phần trước chúng ta đã biết đến phương thức .update() để thêm nhiều phần tử vào một tập hợp. Dựa vào các phép toán tập hợp, Python cung cấp một số các phương thức khác để thay đổi tập hợp như sau:

.difference_update()

Phương thức này là sự kết hợp của .difference() và .update(). Nó thực hiện phép trừ tập hợp trước, được kết quả như thế nào sẽ cập nhật vào tập hợp đích.

A = {1, 2, 3, 4} B = {3, 4, 5, 6} A.difference_update(B) print(A) # Kết quả {1, 2}

.symmetric_difference_update()

Phương thức này là sự kết hợp của .symmetric_difference() và .update(). Nó thực hiện phép trừ đối xứng 2 tập hợp trước, được kết quả như thế nào sẽ cập nhật vào tập hợp đích.

A = {1, 2, 3, 4} B = {3, 4, 5, 6} A.symmetric_difference_update(B) print(A) # Kết quả là {1, 2, 5, 6}

.intersection_update()

Tương tự, Python thực hiện .intersection() trước sau đó thực hiện .update():

A = {1, 2, 3, 4} B = {3, 4, 5, 6} A.intersection_update(B) print(A) # Kết quả là {3, 4}

1.3.6 Một số các phép toán khác

.isdisjoint() Trả về True nếu hai tập hợp không giao nhau, tức là hai tập hợp không có phần tử chung.

A = {1, 2, 3, 4} B = {3, 4, 5, 6} print(not A.isdisjoint(B)) # Kết quả là True

Ở đây, chúng ta sử dụng toán tử logic not, để thực hiện trả về True khi hai tập giao nhau, nghe nó thuận tai hơn :D.

.issubset() Trả về True nếu tập này còn tập con của tập đích (tập trong ngoặc).

A = {3, 4} B = {3, 4, 5, 6} print(A.issubset(B)) # Kết quả là True

.issuperset() Trả về True nếu tập này là tập cha của tập đích (tập trong ngoặc).

A = {3, 4} B = {3, 4, 5, 6} print(A.issuperset(B)) # Kết quả là False A = {3, 4} B = {3, 4, 5, 6} print(A.issubset(B)) # Kết quả là True # Tương đương với print(A <= B) # Kết quả là True

1.4 “Đóng băng” tập hợp (Frozen Set)

Python cung cấp một hàm tên là frozenset(), kết quả trả về là một tập hợp (Set) không thể thay đổi. Khi đó, nếu bạn thực hiện các phương thức .add(), .remove(), .update()… sẽ báo lỗi.

“Đóng băng” tập hợp sẽ làm cho tập hợp đó giống như cấu trúc Tuple trong Python.

friends = {"Rolf", "Anne", "Jen"} frozen_friends = frozenset(friends) frozen_friends.add({"Jen", "Charlie"}) print(frozen_friends) # Kết quả lỗi: AttributeError: 'frozenset' object has no attribute 'add'

Đóng băng một tập hợp rất hữu ích trong trường hợp bạn muốn tập hợp đó không thể thay đổi. Ví dụ khi dùng một tập hợp làm key cho một từ điển (Dictionary), sẽ được giới thiệu trong phần tiếp theo.

A = {1, 2, 3} B = {'a', 'b', 'c'} C = {x: 'foo', y: 'bar'} # Kết quả lỗi: TypeError: unhashable type: 'set'

Tuy nhiên nếu bạn đóng băng các tập hợp này, sẽ không có lỗi nào xảy ra.

A = frozenset({1, 2, 3}) B = frozenset({'a', 'b', 'c'}) C = {x: 'foo', y: 'bar'} # Không có lỗi

2. Tập hợp sử dụng khi nào?

Toán tập hợp hay lý thuyết tập hợp là một trong những phần quan trọng của Toán học mà Khoa học dữ liệu (data science) và Machine Learning sử dụng kiến thức Toán rất nhiều, do vậy toán tập hợp trong Python là một phần không thể thiếu. Ngay từ đầu Python đã được phát triển cho mục đích Khoa học và Giáo dục, do vậy bạn có thể thấy các thiết kế mang hơi hướng Khoa học.

Set có các phần tử là không được thay đổi, do vậy khả năng tìm dữ liệu sẽ nhanh hơn.

Set cần thiết cho các logic liên đến các cặp (key:value) trong cấu trúc Dictionary của Python.

Các phần tử là duy nhất, do đó nếu bạn có một dữ liệu tương tự thì Set là một lựa chọn.

CÁC BÀI VIẾT KHÁC

Kiểu Dữ Liệu Có Cấu Trúc

Chúng ta đã làm quen với các kiểu dữ liệu đơn giản là các kiểu vô hướng ( Integer, Char, Boolean, Real, kiểu liệt kê) và đoạn con. Trong Pascal tồn tại các kiểu dữ liệu có cấu trúc là các kiểu dữ liệu được tạo ra từ các phần tử có kiểu dữ liệu đơn giản bằng một cách nào đó. Chúng được đặc trưng bằng kiểu dữ liệu của các phần tử và quan trọng hơn cả là phương pháp cấu thành kiểu dữ liệu mới (điều đó cũng có nghĩa là phương pháp truy nhập vào kiểu dữ liệu có cấu trúc). Tính có cấu trúc của dữ liệu là một đặc trưng của ngôn ngữ lập trình có cấu trúc.

Pascal có tất cả 4 kiểu dữ liệu có cấu trúc mà chúng ta sẽ lần lượt ngiên cứu : mảng ( Array), tập ( Set), bản ghi ( Record) và tệp ( File).

2.Kiểu dữ liệu có cấu trúc: MẢNG (ARRAY)

Một mảng dữ liệu gồm một số hữu hạn phần tử có cùng kiểu gọi là kiểu cơ bản. Số phần tử của mảng được xác định ngay từ khi định nghĩa ra mảng. Mỗi phần tử của mảng đựoc truy nhập trực tiếp thông qua tên mảng cùng với chỉ dẫn truy nhập được để giữa hai ngoặc vuông [ ].

Định nghĩa kiểu mảng T có kiểu các phần tử là KPT, có kiểu chỉ dẫn KCD để hướng dẫn cách tổ chức mảng cũng như cách truy nhập vào các phần tử mảng được viết trong Pascal như sau :

Type Kiểu_mảng T = Array[ Kiểu_chỉ_dẫn KCD ] Of Kiểu_phần_tử KPT ;

hay viết tắt thành : T = Array[ KCD ] Of KPT ;

Khi đó việc khai báo một biến A có kiểu là Kiểu_mảng có thể được viết như sau :

Var A : Kiểu_mảng T ;

hoặc ta có thể khai báo trực tiếp biến A cùng với kiểu của mảng trong phần khai báo biến khi không có định nghĩa kiểu trong phần Type :

Var A : Array[ KCD ] Of KPT ;

Chúng ta hãy xét một số ví dụ định nghĩa và khai báo sau :

Type AI = Array[ 1.. 10 ] Of Integer ;

AC = Array [ 1.. 10 ] Of Char ;

Color = ( Red, Blue, Green, White, Black ) ;

Var

A, B, C : AI ;

X, Y : AC ;

M1, M2 : Array[ -3.. 5 ] Of Real ;

MC : Array[ ‘A’.. ‘Z’ ] Of Integer ;

MM : Array[ Color ] Of Boolean ;

AI, AC là hai kiểu mảng gồm 10 phần tử được đánh số thứ tự từ 1 đến 10 thông qua kiểu chỉ dẫn là một đoạn con các số nguyên 1.. 10. Các phần tử của AI có kiểu là số nguyên còn các phần tử của AC có kiểu là các kí tự. A, B, C là các biến có kiểu là AI.

Còn M1, M2 là hai biến được định nghĩa kiểu luôn khi khai báo. Đây là hai biến mảng gồm 9 phần tử là các số thực, được đánh số từ -3 đến 5.

MC là một biến mảng gồm 26 số nguyên được đánh số qua các chỉ dẫn là các chữ cái từ ‘A’ đến ‘Z’.

MM là một mảng gồm 5 phần tử kiểu Boolean, các phần tử đựoc đánh dấu qua chỉ dẫn là tên của 5 màu sắc.

Một điều lưu ý là khi khai báo mảng, kiểu chỉ dẫn chí có thể là các kiểu đơn giản như sau : kí tự ( như biến MC ), đoạn con ( ví dụ đoạn con Integer như các kiểu AI, AC ), kiểu liệt kê do người sử dụng định nghĩa (như biến MM) và kiểu Boolean. Kiểu chỉ dẫn không được là kiểu Real hoặc Integer. Nghĩa là không được viết :

X : Array[ Integer ] Of Integer ;

Y : Array[ Real ] Of Integer ;

Việc truy nhập vào một phần tử nào đó của mảng được thực hiện qua tên biến mảng, theo sau là giá trị chỉ dẫn để trong ngoặc vuông như :

MM[ Red ] := True ;

MC[ ‘B’ ] := 5 ;

Do thời gian truy nhập vào một phần tử của mảng không phụ thuộc vào giá trị của chỉ dẫn nên cấu trúc mảng thuộc kiểu cấu trúc truy nhập trực tiếp.

Ví du1:

Gán tất cả 5 giá trị của mảng B ( như đã định nghĩa ở trên ) qua bàn phím, ta sẽ dùng thêm một biến I có kiểu là Integer để làm biến chỉ dẫn :

Writeln (‘ Vao so lieu cho mang B ‘ ) ;

For I := 1 To 5 Do

Begin

Write (‘ B[ ‘, I, ‘ ] = ‘) ;

Readln ( B[ I ] ) ;

End ;

Kết quả thể hiện ra màn hình với các con số là do người sử dụng gõ vào :

Vao so lieu cho mang B

B[1] = 2

B[2] = 12

B[3] = 612

B[4] = 2

B[5] = 34

Nếu bạn muốn vào số liệu của cả một hàng của Array trên cùng một dòng màn hình thì bạn phải ghi rõ tất cả các biến cần đọc ( là các phần tử của mảng ) trong thủ tục Readln. Khi này sẽ không áp dụng vòng For được nữa :

Write (‘ Vao so lieu hang 1 ‘) ;

Readln ( B[1], B[2], B[3], B[4], B[5] ) ;

Kết quả hiện ra màn hình :

Vao so lieu hang 1 : 2 12 612 2 34

Giữa các số gõ là các dấu cách với số lượng tùy ý nhưng ít nhất phải là 1.

Ví du 2:

Cộng hai mảng C = A + B ( A, B, C với định nghĩa như trên thực ra là các mảng hay ma trận một chiều ) :

For I := 1 To 10 Do

C[ I ]:=A[ I ] + B[ I ] ;

Var

I : Integer ;

Ch : Char ;

MC : Array[ ‘A’.. ‘Z’ ] Of Integer ;

BEGIN

(* Xóa mảng MC về không *)

For Ch := ‘A’ To ‘Z’ Do MC[ Ch ] := 0 ;

(* Đọc 100 kí tự và đếm *)

For I := 1 To 100 Do

Begin

Readln ( Ch ) ;

(* Hàm Upcase biến chữ thường thành chữ hoa, Ví dụ ‘a’ thành ‘A’ *)

Ch := Upcase ( Ch ) ;

(* Đếm số lần xuất hiện từng kí tự *) ;

Inc ( MC[ Ch ] ) ;

End ;

(* Chỉ in ra kết quả trên màn hình các chữ đã xuất hiện *)

For Ch := ‘A’ To ‘Z’ Do

Writeln ( ‘ So chu ‘, Ch,’ = ‘, MC [Ch ] : 4 ) ;

END.

Kết quả hiện ra trên màn hình có dạng :

So chu A = 2

So chu C = 68

……………………

So chu Z = 8

Cách làm:

Đầu tiên đem phần tử thứ nhất so sánh với các phần tử tiếp theo, nếu nó lớn hơn thì đem đổi chỗ giá trị của hai phần tử so sánh. Kết quả sau lượt đầu tiên giữ giá trị nhỏ nhất. Tiếp theo vòng 2, Đem phần tử thứ 2 so sánh với các phần tử tiếp theo.

Program SAP_XEP ;

Const N = 5 ;

Var MI : Array[ 1.. N ] Of Integer ;

T : Integer ; (* T là biến trung gian *)

I, J : Integer ;

BEGIN

(* Đọc các số cần sắp xếp vào mảng MI *)

For I := 1 To N Do

Begin

Write (‘ MI[ ‘, I ,’ ] = ‘) ;

Readln ( MI[ I ] ) ;

End ;

(* Sắp xếp *)

For I := 1 To N – 1 Do

For J := I + 1 To N Do

Begin

Begin

T := MI[ I ] ;

MI[ I ] := MI[ J ] ;

MI[ J ] := T ;

End ;

End ;

(* In ra kết quả *)

Writeln ;

Writeln ( ‘ Sau khi sap xep ‘ ) ;

For I := 1 To N Do Writeln ( MI[ I ] : 6 ) ;

END.

Kết quả chương trình hiện ra trên màn hình :

M[ 1 ] = – 1

M[ 2 ] = 456

M[ 3 ] = 34

M[4 ] = – 312

M[ 5 ] = – 56

Sau khi sắp xếp :

-312 -56 -1 34 456

Kiểu phần tử của mảng không bị hạn chế nhiều như kiểu chỉ dẫn. Nó còn có thể là các kiểu có cấu trúc. Ví dụ sau cho thấy việc khai báo một mảng có các phần tử cũng là mảng.

Ví du:

Type PT = Array [ 1.. 5 ] Of Real ;

Color = ( Red, Blue, Green, White, Black ) ;

Var MPT : Array [ 1.. 3 ] Of Pt ;

Z : Array [ 1.. 3, ‘A’.. ‘C’ ] Of Color ;

hoặc viết một lần như sau :

Var MPT : Array [ 1.. 3 ] Of Array [ 1.. 5 ] Of Real ;

hoặc thường được viết gọn lại :

Var MPT : Array [ 1.. 3, 1.. 5 ] Of Real ;

MPT được định nghĩa như trên chính là ma trận hai chiều 3 hàng và 5 cột.

Việc truy nhập đối với mảng có định nghĩa phức tạp như MPT được tiến hành qua hai lần đóng mở ngoặc vuông. Ví dụ MPT [3] [5] hoặc MPT [ 3, 5 ] biểu diễn phần tử ở hàng 3 và cột 5.

Cách viết MPT[i] [j] và MPT[ i, j ] là tương đương nhau. Mảng được định nghĩa như trên có thể hiểu là ma trận nhiều chiều. Phần tử MPT[ i, j ] sẽ là phần tử ở hàng thứ I, cột thứ J của MPT

Chương trình nhân hai ma trận vuông cấp N

C = A * B

Phần tử của ma trận tích được tính theo công thức :

Const N = 3 ;

Phay = ‘, ‘ ; (* Hằng kí tự : Dấu phẩy *)

Var A, B, C : Array[ 1.. N, 1.. N ] Of Integer ;

I, J, K : Integer ;

BEGIN

(* Đọc giá trị của ma trận A *)

For I := 1 To N Do

For J := 1 To N Do

Begin

Write ( ‘ A[ ‘, I, phay, J, ‘ ] = ‘ ) ;

Readln ( A[ I, J ] ) ;

End ;

(* Đọc giá trị của ma trận B *)

For I := 1 To N Do

For J := 1 To N Do

Begin

Write ( ‘ B[ ‘, I, phay, J, ‘ ] = ‘ ) ;

Readln ( B[ I, J ] ) ;

End ;

(* Nhân hai ma trận vuông cấp N C = A * B *)

For I := 1 To N Do

For J := 1 To N Do

Begin

C[ I, J ] := 0 ;

For K := 1 To N Do

C[ I, J ] := C[ I, J ] + A[ I, K ] * B[ K, J ] ;

End ;

(* In kết quả theo kiểu viết ma trận *)

Writeln (‘ Tich cua hai ma tran = ‘) ;

For I := 1 To N Do

Begin

For J := 1 To N Do Write ( C[ I, J ] : 5 ) ;

Writeln ;

End ;

END.

Trong chương trình trên, việc đọc ma trận được tiến hành qua từng dòng cho mỗi phần tử của mảng. Bạn có thể sửa lại đọc vào ma trận dưới dạng từng dòng tương ứng với từng hàng của ma trận:

(* Đọc vào giá trị của ma trận A theo từng hàng *)

For I := 1 To N Do

Begin

Write (‘ Hang ‘, I, ‘ : ‘ ) ;

Readln ( A [ I, 1 ], A [ I, 2 ], A [ I, 3 ] ) ;

End ;

Cách làm này không cho dùng vòng For mà ta phải ghi trực tiếp các phần tử cần đọc vào thủ tục Readln.

Một cách khác lười hơn đỡ phải đọc ma trận trong khi thử, hãy làm một đoạn chương trình tạo số ngẫu nhiên cho các phần tử của ma trận. Bạn cần nhớ lại hoặc tra cứu hàm Random và Randomize.

Mảng có thể dùng làm tham số cho chương trình con và mảng không bao giờ dùng làm kết quả của Function . Tuy nhiên cần lưu ý khai báo kiểu của tham số trong vùng khai báo Type chứ không định nghĩa trực tiếp ngay trong phần khai báo tham số của chương trình con.

Cộng hai ma trận C = A + B

Type MT = Array [ 1.. 3, 1.. 5 ] Of Real ;

Var X, Y, Z : MT ;

Procedure Cong_ma_tran ( A, B : MT ; Var C : MT ) ;

Var I, J : Integer ;

Begin

For I := 1 To N Do

For J := 1 To N Do

C [ I, J ] := A [ I, J ] + B [ I, J ] ;

End ;

BEGIN

……………..

Cong_ma_tran ( X, Y, Z ) ;

……………..

END.

Bài tập 1: Viết chương trình tìm giá trị lớn nhất của một mảng chứa các số nguyên gồm N phần tử. Ý tưởng:

– Cho số lớn nhất là số đầu tiên: Max:=a[1].

Uses Crt;

Type Mang = ARRAY[1..50] Of Integer;

Var A:Mang;

N,i,Max:Integer;

Begin

{Nhập mảng}

Write(‘Nhap N=’); Readln(N);

For i:=1 To N Do

Begin

Write(‘A[‘,i,’]=’); Readln(A[i]);

End;

{Tìm phần tử lớn nhất}

Max:=A[1];

For i:=2 To N Do

If Max<A[i] Then Max:=A[i];

{In kết quả ra màn hình}

Writeln(‘Phan tu lon nhat cua mang: ‘, Max);

Readln;

End.

Bài tập 1: Viết chương trình tính tổng bình phương của các số âm trong một mảng gồm N phần tử. Ý tưởng:

Duyệt qua tất cả các phần tử A[i] trong mảng: Nếu A[i]<0 thì cộng dồn (A[i]) 2 vào biến S.

Nếu x=A[i] thì vị trí cần tìm là i, ngược lại thì kết quả tìm là 0 (không tìm thấy).

Giải Thuật Chia Để Trị (Divide And Conquer) Trong Cấu Trúc Dữ Liệu Và Giải Thuật

Giải thuật chia để trị (Divide and Conquer)là gì ?

Phương pháp chia để trị (Divide and Conquer) là một phương pháp quan trọng trong việc thiết kế các giải thuật. Ý tưởng của phương pháp này khá đơn giản và rất dễ hiểu: Khi cần giải quyết một bài toán, ta sẽ tiến hành chia bài toán đó thành các bài toán con nhỏ hơn. Tiếp tục chia cho đến khi các bài toán nhỏ này không thể chia thêm nữa, khi đó ta sẽ giải quyết các bài toán nhỏ nhất này và cuối cùng kết hợp giải pháp của tất cả các bài toán nhỏ để tìm ra giải pháp của bài toán ban đầu.

Nói chung, bạn có thể hiểu giải thuật chia để trị (Divide and Conquer) qua 3 tiến trình sau:

Tiến trình 1: Chia nhỏ (Divide/Break)

Trong bước này, chúng ta chia bài toán ban đầu thành các bài toán con. Mỗi bài toán con nên là một phần của bài toán ban đầu. Nói chung, bước này sử dụng phương pháp đệ qui để chia nhỏ các bài toán cho đến khi không thể chia thêm nữa. Khi đó, các bài toán con được gọi là “atomic – nguyên tử”, nhưng chúng vẫn biểu diễn một phần nào đó của bài toán ban đầu.

Tiến trình 2: Giải bài toán con (Conquer/Solve)

Tiến trình 3: Kết hợp lời giải (Merge/Combine)

Hạn chế của giải thuật chia để trị (Devide and Conquer)

Giải thuật chia để trị tồn tại hai hạn chế, đó là:

Làm thế nào để chia tách bài toán một cách hợp lý thành các bài toán con, bởi vì nếu các bài toán con được giải quyết bằng các thuật toán khác nhau thì sẽ rất phức tạp.

Việc kết hợp lời giải các bài toán con được thực hiện như thế nào.

Ví dụ giải thuật chia để trị

Giải thuật sắp xếp trộn (Merge Sort)

Giải thuật sắp xếp nhanh (Quick Sort)

Giải thuật tìm kiếm nhị phân (Binary Search)

Nhân ma trận của Strassen

Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng….miễn phí. Tải ngay ứng dụng trên Android và iOS.

Theo dõi chúng tôi miễn phí trên mạng xã hội facebook và youtube:

Follow fanpage của team https://www.facebook.com/vietjackteam/ hoặc facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile…. mới nhất của chúng tôi.

Bài học Cấu trúc dữ liệu và giải thuật phổ biến tại vietjack.com:

Vật Liệu Polime Là Gì? Đặc Điểm, Cấu Trúc

Vật liệu polime là gì?

Polyme là cái tên để chỉ các hợp chất có khối lượng phân tử lớn, thế nhưng điểm khác biệt là có sự lặp đi lặp lại nhiều lần những mắt xích cơ bản trong cấu trúc của chúng. Bằng các liên kết cộng hóa trị các mắt xích này sẽ được kết nối chặt chẽ với nhau. Tức là cứ mỗi 2 phân tử hay nhiều hơn sẽ có thể kết nối với nhau bằng 1 cặp electron chung.

Bên cạnh đó còn có một khái niệm mới hơn về Polime, với tên gọi là mo-no-me. Ở đây, mo-no-me được định nghĩa là một đơn phân tử có khả năng liên kết với ít nhất là hai đơn phân tử khác. 

Khi chúng liên kết lại với nhau sẽ trải qua một quá trình được gọi là polime hóa. Lúc này, nếu hai phân tử riêng lẻ của hai loại giống hay khác nhau sẽ có khả năng kết hợp lại với nhau. Sự kết hợp này còn có tên gọi là liên kết cộng hóa trị. Nếu kết quả của những liên kết này cho ra các phân tử lớn hơn sẽ được gọi là polime. 

Phân loại polyme:

Theo nguồn gốc:

Polyme thiên nhiên: đây là những loại polyme có xuất xứ từ thiên nhiên.

Bao gồm như: Xenlulozơ, tơ tằm, cao su thiên nhiên, hay cao su thiên nhiên…

Polyme tổng hợp: người ta thường sản xuất loại polyme này bằng những phản ứng trùng ngưng hoặc trùng hợp.

Ví dụ như: Polypropylene ( hay còn gọi là nhựa PP), Polyvinyl clorua ( hoặc nhựa PVC), polyethylene ( hay nhựa PE)…

Polime bán tổng hợp, nhân tạo: từ các loại polime thiên nhiên con người có thể chế tạo thành những loại polymer mới này. 

Theo cấu trúc:

Nếu xét theo cấu trúc cấu tạo, polyme sẽ được phân chia thành 3 loại:

Polime mạch không phân nhánh.

Chẳng hạn như:  Nhựa PVC, nhựa PE,  cao su, xenlulozơ, hay tinh bột…

Polyme có nhánh.

Chẳng hạn như: Glycogen, amilopectin…

Polime mạch không gian.

Chẳng hạn như: Cao su lưu hóa, nhựa rezit, hay nhựa bakelit…

Đánh giá ưu nhược điểm của vật liệu polime:

Ưu điểm:

Polymer nổi tiếng là loại vật liệu nhựa dẻo chất lượng cao, thế nhưng tùy theo từng loại polyme khác nhau sẽ sở hữu những đặc điểm riêng biệt Bên cạnh đó khi nhắc đến vật liệu polyme vẫn có một số đặc điểm chung sau đây: 

Khả năng tái chế rất cao

Do có đặc tính là nhựa dẻo nên nếu được nung nấu ở nhiệt độ thích hợp polyme sẽ dễ dàng tan chảy trở thành chất dẻo, khi đó con người hoàn toàn có thể chế tạo thành những vật liệu mới. 

An toàn tuyệt đối với hóa chất

Hầu hết với các hóa chất thuộc chất lỏng bao gồm như các chất tẩy rửa, dung dịch, chất làm sạch… sẽ đều được chứa đựng trong các vật liệu làm từ nhựa mà người dùng có thể yên tâm sử dụng, vì chúng không hề gây ra bất kỳ tác dụng phụ nào.

Không dẫn điện và dẫn nhiệt

Không những thế, vật liệu polyme còn được tin tưởng sử dụng với tính năng không dẫn nhiệt hiệu quả của nó. Nếu xem xét các loại nồi, chảo, hay lõi xốp của tủ lạnh và hoặc tủ đá, ly có chức năng cách nhiệt, làm mát, … bạn sẽ thấy rõ điều đó của polyme.

Trọng lượng nhẹ

Trọng lượng nhẹ có lẽ đã là điều không còn bàn cãi khi nói đến vật liệu polyme nữa, nhất là khi so với các loại vật liệu khác như đá, bê tông, thép, đồng, hay nhôm, … Do đó mà chúng cũng được yêu thích ứng dụng rộng rãi ở đa dạng các lĩnh vực khác nhau. 

Màu sắc vô cùng đa dạng

Không những có khả năng được chế tạo dễ dàng để thay thế một số loại vật liệu như sợi bông, lụa và len, sứ và đá cẩm thạch, thậm chí là nhôm và kẽm. Polymer còn sở hữu ưu điểm vượt trội là tái tạo được nhiều lần, mỗi lần lại mang màu sắc khác nhau vô cùng linh hoạt và đẹp mắt.  

Nhược điểm:

Trong quá trình xuất Polymer sẽ khó tránh khỏi tạo ra khí CO2 độc hại, điều này góp phần vào vấn đề ô nhiễm môi trường hiện nay, có thể kể đến những hậu quả như tăng hiệu ứng nhà kính, biến đổi khí hậu, hạn hán, lũ lụt, …

Khi chế tạo các loại polime nhân tạo người ta phải cho thêm một số chất phụ gia khác. Tuy nhiên chúng lại gây ảnh hưởng đến sức khỏe người dùng, điển hình là TOCP có thể gây tổn thương và làm thoái hóa thần kinh ngoại biên, hoặc gây tổn thương đến các cơ quan sinh dục nam do chất phụ gia DOP, …

Polymer nếu tồn tại trong đất và nước sẽ cực kỳ gây hại, chẳng hạn như hạn chế quá trình trao đổi oxy gây ra xói mòn, sạt lở đất, làm mất chất dinh dưỡng ảnh hưởng xấu đến quá trình sinh trưởng của cây cối, hay các sinh vật ở biển có thể ăn nhầm phải chất thải làm từ vật liệu polyme nên bị chết…

Polyme bị thải ra ngoài môi trường nếu không xử lý tốt sẽ gây ra các tình trạng tắc nghẽn cống, kênh rạch và ao hồ, gây ứ đọng nước… 

Nếu đốt những sản phẩm làm từ polyme sẽ gây độc cho cho con người và gây hại trực tiếp đến môi trường,…

Một số loại vật liệu Polime thường gặp:

Celluloid

Xenlulo

Cao su

Polietilen (P.E)

0903000320 – 0902544368

Bạn đang đọc nội dung bài viết Cấu Trúc Dữ Liệu Set Trong Python trên website Sieuphampanorama.com. Hy vọng một phần nào đó những thông tin mà chúng tôi đã cung cấp là rất hữu ích với bạn. Nếu nội dung bài viết hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!