Báo cáo Đồ án Lập trình TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG □□□□ BÁO CÁO ĐỒ ÁN LẬP TRÌNH Đề tài Lập trình Python và Xây dựng Cấu trúc dữ liệu và Giải thuật với Py.
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
-□□&□□ -BÁO CÁO ĐỒ ÁN LẬP TRÌNH
Đề tài: Lập trình Python và Xây dựng Cấu trúc dữ liệu
và Giải thuật với Python Tìm hiểu về Machine Learning.
Giảng viên hướng dẫn: PGS.TS Đỗ Phan Thuận
Sinh viên thực hiện Đỗ Trường Thịnh – 20193124
HÀ NỘI, tháng 8, năm 2022
Trang 2Nội dung
LỜI MỞ ĐẦU 4
CHƯƠNG 1 TỔNG QUAN VỀ PYTHON 5
1.1 Giới thiệu 5
1.2 Một số khái niệm cơ bản trong Python 6
1.2.1 Comment 6
1.2.2 Biến 6
1.2.3 Đầu vào 6
1.2.4 Các toán tử cơ bản 6
1.3 Cấu trúc dữ liệu trong Python 7
1.3.1 Một số kiểu dữ liệu 7
1.3.2 Cấu trúc điều khiển 7
1.3.3 Các cấu trúc dữ liệu 8
1.4 Một số thư viện trong Python 9
1.4.1 NumPy 9
1.4.2 SciPy 9
1.4.3 Pandas 9
1.4.4 Scikit-learn 10
1.4.5 Matplotlib 10
1.5 Hàm trong Python 10
CHƯƠNG 2: XÂY DỰNG CÁC CTDL> VỚI PYTHON 12
2.1 Cấu trúc dữ liệu và giải thuật cơ bản 12
2.1.1 Mảng 12
2.1.2 Ngăn xếp 12
2.1.3 Hàng đợi 14
2.1.4 Danh sách liên kết đơn 15
2.1.5 Giải thuật tìm kiếm 19
2.1.6 Giải thuật sắp xếp 23
2.1.7 Cấu trúc dữ liệu cây 26
2.2 Giải thuật nâng cao 30
2.2.1 Thuật toán tham lam 30
2.2.2 Thuật toán quay lui 32
Trang 32.2.5 Thuật toán BFS và DFS trên đồ thị 37
CHƯƠNG 3: TÌM HIỂU VỀ MACHINE LEARNING 42
3.1 Giới thiệu về Machine Learning 42
3.2 Dữ liệu trong Machine Learning 43
3.2.1 Làm việc với file csv 43
3.2.2 Hình dung dữ liệu 44
3.2.3 Chuyển đổi dữ liệu 45
KẾT LUẬN 49 DANH MỤC THAM KHẢO 50
Trang 4LỜI MỞ ĐẦU
Ngày nay trong cuộc sống 4.0 của chúng ta gần như không thể thiếu được những khái niệm liên quan đến công nghệ thông tin, từ các phương tiện truyền thông, xã hội cho đến lĩnh vực kinh doanh, quản lý… Mọi thứ đều cần những phần mềm cũng như sản phẩm của công nghệ thông tin đễ hỗ trợ giúp nâng cao phát triển vững mạnh hơn.Ví dụ trong lĩnh vực kinh doanh buôn bán hàng hóa theo cách truyền thống vẫn còn tồn tại nhiều nhược điểm như thống kê chi tiết chưa chính xác, quy trình thanh toán chưa được chặt chẽ và nhanh chóng Cùng với sự phát triển của nhiều ngôn ngữ lập trình web như PHP, Ruby, Scheme thì Python là một cái tên đáng chú ý Hiện nay ngôn ngữ Python được xếp hạng thứ 1 trong Top 10 các ngôn ngữ lập trình phổ biến nhất đang được thế giới sử dụng Python là một ngôn ngữ có hình thái rất sáng sủa, cấu trúc rõ ràng, thuận tiện cho người mới bắt đầu học lập trình Cấu trúc của Python còn cho phép người sử dụng viết mã lệnh với số lần gõ phím tối thiểu nhất Python là một ngôn ngữ lập trình đơn giản nhưng lại rất hiệu quả Bên cạnh đó, Python là một ngôn ngữ có tính hướng đối tượng cao.Với ngôn ngữ lập trình python là một ngôn ngữ lập trình đa năng với nhiều ưu điểm vượt trội, và đang đứng ở vị trí số một trong top các ngôn ngữ lập trình hiện nay
Trong bài báo cáo này, em sẽ trình bày những kiến thức em đã tìm hiểu trong học
kỳ vừa qua về ngôn ngữ lập trình Python và Học máy Bài báo cáo được tổ chức như sau:
CHƯƠNG 1: TỔNG QUAN VỀ PYTHON Chương này nghiên cứu tìm hiểu ngôn ngữ lập trình Python gồm các khái niệm, các cấu trúc dữ liệu, một số thưviện phổ biến
CHƯƠNG 2: XÂY DỰNG CÁC CTDL> VỚI PYTHON Chương này
sẽ xây dựng lại một số giải thuật cơ bản và nâng cao với ngôn ngữ lập trình Python
CHƯƠNG 3: TÌM HIỂU VỀ MACHINE LEARNING Chương này nghiên cứu tìm hiểu các khái niệm tổng quan về Học máy
Trang 5CHƯƠNG 1 TỔNG QUAN VỀ PYTHON
1.1 Giới thiệu
Lịch sử hình thành
Python đã được hình thành vào cuối những năm 1980 và được bắt đầu thực hiện vào tháng 12/1989 bởi Guido van Rossum tại CWI tại Hà Lan như là người kế thừacủa ngôn ngữ ABC (tự lấy cảm hứng từ SETL) có khả năng xử lý ngoại lệ và giao tiếp với hệ điều hành Amoeba Van Rossum là tác giả chính của Python, và vai trò trung tâm của ông tiếp tục trong việc quyết định hướng phát triển của Python được phản ánh trong tiêu đề mà cộng đồng Python dành cho ông “Độc tài nhân từ cho cuộc sống” (benevolent dictator for life)(BDFL)
Python 2 0 được phát hành vào ngày 16/10/2000, với nhiều tính năng chính mới bao gồm một bộ dọn rác đầy đủ và hỗ trợ Unicode Với phiên bản này, quá trình phát triển đã được thay đổi và trở thành minh bạch hơn và được cộng đồng ủng hộ Python 3 0 (còn được gọi là Python 3000 hoặc Py3k), một bản phát hành lớn, không tương thích ngược, được phát hành vào ngày 03/12/2008 sau một thời gian dài thử nghiệm Nhiều trong số các tính năng chính của nó đã được điều chỉnh để tương thích ngược với Python 2 6 và 2 7 Các tính năng và triết lý phát triển
Python là 1 ngôn ngữ lập trình đa hình: lập trình hướng đối tượng và hướng cấu trúc được hỗ trợ đầy đủ, và có 1 số tính năng của ngôn ngữ hỗ trợ lập trình theo chức năng và lập trình hướng khía cạnh (Aspect-oriented programming) Nhiều mô hình khác được hỗ trợ bằng việc sử dụng các phần mở rộng, bao gồm thiết kế theo hợp đồng (design by contract) và lập trình luận lý
Các trang như Mozilla, Reddit, Instagram và PBS đều được viết bằng Python
Ngôn ngữ lập trình Python được dùng vào các mục đích:
Phát triển web (trên máy chủ)
Phát triển phần mềm 17
Tính toán một cách khoa học
Lên kịch bản cho hệ thống
Python cũng hỗ trợ hàm, thủ tục, hay kể cả lập trình hướng đối tượng
Để viết mã nguồn Python, ta có thể sử dụng bất kỳ một trình soạn thảo nào, kể cảnhững trình soạn thảo đơn giản nhất như NotePad Tuy nhiên, để phát triển các ứng
Trang 6dụng một cách hiệu quả hơn, ta nên sử dụng một IDE, để có thể tiết kiệm thời gian
và công sức viết code
1.2 Một số khái niệm cơ bản trong Python
1.2.1 Comment
Comment hay còn gọi là chú thích được dùng để giải thích các dòng code, giúp chongười đọc hay chính người viết code sau này hiểu được source code dễ dàng hơn Các ký tự và đoạn code trong comment sẽ không ảnh hưởng tới kết quả chương trình
Trong Python có 2 loại comment là comment trên một dòng và comment trên nhiềudòng
Comment trên 1 dòng: Comment trên một dòng sẽ được bắt đầu với ký tự #
Comment trên nhiều dòng: Comment trên nhiều dòng trong ngôn ngữ lập trình
Python sẽ bắt đầu bằng 3 dấu nháy đơn (''') hoặc 3 dấu nháy kép (""") và kết thúc cũng bằng 3 dấu nháy đơn (''') hoặc 3 dấu nháy kép (""")
1.2.2 Biến
Khái niệm biến trong lập trình cũng giống khái niệm biến trong toán
học, biến được sử dụng để lưu trữ dữ liệu trong chương trình Dữ liệu được lưu
trữ trong một biến có thể thay đổi trong khi chạy chương trình
1.2.3 Đầu vào
Để nhập dữ liệu đầu vào, ta dùng hàm input() Ví dụ:
# Nhập dữ liệu cho biến name từ bàn phím
name = input()
print("Hello " + name)
Khi nhập dữ liệu cho một biến từ bàn phím thì kiểu dữ liệu của biến đó luôn
là str (kể cả bạn có nhập giá trị số cho biến đó)
Vì vậy khi muốn kiểu dữ liệu nhập vào là ở dạng khác như int, float,… chúng tacần ép kiểu cho đầu vào Ví dụ ép kiểu với kiểu dữ liệu int:
age = int(input())
1.2.4 Các toán tử cơ bản
Trang 7Python xây dựng 7 loại hình tính toán trên toán tử như sau:
Python Arithmetic Operator (toán tử số học): +, -, *, /, **, //, %
Python Relational Operator (toán tử quan hệ): >, <, >=, <=, ==, !=
Python Assignment Operator (toán tử gán): =, +=, -=, /=, *=, **=, //=, %=
Python Membership Operator (toán tử membership): in, not in
Python Identity Operator (toán tử identity): is, is not
Python Logical Operator (toán tử logic): and, or, not
Python Bitwise Operator (toán tử thao tác bit)
1.3 Cấu trúc dữ liệu trong Python
1.3.1 Một số kiểu dữ liệu
Một số kiểu dữ liệu cơ bản trong Python:
int: đây là kiểu dữ liệu được dùng để lưu trữ các số nguyên (1, 2, 3, 4, ).
float: đây là kiểu dữ liệu dùng để lưu trữ các biến kiểu số thực (1.43, 5.34,
3.333, )
bool: đây là kiểu dữ liệu dùng để lưu trữ các giá trị luận lý (True hoặc False)
str: đây là kiểu dữ liệu dùng để lưu trữ các xâu ký tự ("Viet
Nam", "Codelearn", )
1.3.2 Cấu trúc điều khiển
Câu lệnh điều kiện
Câu lệnh if được sử dụng để kiểm tra một điều kiện: nếu điều kiện là đúng sẽchạy một khối các câu lệnh
Trang 8 Sử dụng elif hoặc câu lệnh điều kiện lồng nhau trong trường hợp câu lệnh có
3 nhánh
Cấu trúc vòng lặp
Trong Python có 2 kiểu vòng lặp: for và while
Vòng lặp for: Vòng lặp for ở trong Python có tác dụng lặp các biến dữ liệu có kiểu
dữ liệu list, tuple hoặc string, Sử dụng cú pháp như sau:
for variable in data:
stop: số nguyên kết thúc, chuỗi sẽ kết thúc với tham số này
step: số nguyên xác định khoảng cách giữa các số bên trong chuỗi Giá trị mặc định là 1
Kết hợp range với for cho phép tạo vòng lặp dễ dàng hơn:
for number in range(5):
Trang 9List: Được sử dụng để lưu trữ dữ liệu của các loại dữ liệu khác nhau một cách tuần
tự Có các địa chỉ được gán cho mọi thành phần của danh sách, được gọi là Index Giá trị chỉ mục bắt đầu từ 0 và tiếp tục cho đến khi phần tử cuối cùng được gọi là chỉ số dương
Dictionary: Được sử dụng để lưu trữ các cặp key-value Để hiểu rõ hơn, hãy nghĩ đến một thư mục điện thoại nơi hàng trăm và hàng ngàn tên và số tương ứng củachúng đã được thêm vào Bây giờ các giá trị không đổi ở đây là Tên và Số điệnthoại được gọi là các phím Và các tên và số điện thoại khác nhau là các giá trị đãđược đưa vào các phím Nếu truy cập các giá trị của các phím, sẽ nhận được tất cảtên và số điện thoại Vì vậy, đó là những gì một cặp key-value Và trong Python,cấu trúc này được lưu trữ bằng Dictionary
Set: Là một tập hợp các yếu tố không có thứ tự là duy nhất Có nghĩa là ngay cả khi
dữ liệu được lặp lại nhiều lần, nó sẽ chỉ được nhập vào tập hợp một lần
Tuple (các bộ dữ liệu): Tuples giống như các list với ngoại lệ là dữ liệu một khi
được nhập vào bộ dữ liệu không thể thay đổi bất kể điều gì Ngoại lệ duy nhất làkhi dữ liệu bên trong Tuple có thể thay đổi, chỉ sau đó dữ liệu Tuple có thể đượcthay đổi
1.4 Một số thư viện trong Python
1.4.1 NumPy
Được tạo bởi Travis Oliphant, NumPy là một “ngựa kéo” phân tích thực sự củaPython Nó cung cấp cho người dùng cách làm việc với các mảng nhiều chiều,cùng một số lượng lớn các hàm để xử lý trên các toán tử toán học nhiều chiều trêncác mảng đó Mảng là các khối dữ liệu được sắp xếp theo nhiều chiều dựa trên cácvéc tơ và ma trận trong toán học Mảng thường hữu ích không chỉ trong việc lưu dữliệu mà cả việc tính toán nhanh các ma trận, điều không thể thiếu khi giải quyết cácvấn đề liên quan đến khoa học dữ liệu
1.4.2 SciPy
Là một dự án gốc bởi Travis Oliphant, Pearu Peterson, and Eric Jones, SciPy hoànthiện các tính năng của NumPy, nhằm cung cấp các thuật toán cho đại số tuyếntính, không gian ma trận, xử lý tín hiệu và xử lý ảnh, tối ưu, biến đổi Fourier, …
1.4.3 Pandas
Pandas là thư viện thực hiện mọi thứ mà NymPy và SciPy không thể làm Nó làm
việc với các đối tượng cấu trúc dữ liệu, DataFrames và Chuỗi (Series) pandas chophép bạn có thể xử lý các bảng dữ liệu phức tạp của nhiều loại khác nhau (điều mà
Trang 10các mảng của NumPy thông thể làm được) và chuỗi thời gian Bạn sẽ dễ dàng tải
dữ liệu từ nhiều nguồn khác nhau, sau đó slide, dice, xử lý các thành phần cònthiếu, thêm, đổi tên, tổng hợp (aggregate), reshape và cuối cùng là trực quan dữliệu theo ý của bạn
1.4.4 Scikit-learn
Bắt đầu như một phần của SciKits, Scikit-learn là lõi hoạt động của khoa học dữliệu trên Python Nó cung cấp tất cả những gì bạn cần để tiền xử lý dữ liệu, họcgiám sát và không giám sát, lựa chọn mô hình, validate và error metrics
1.4.5 Matplotlib
Matplotlib là một thư viện vẽ đồ thị cho ngôn ngữ lập trình Python và phần mở rộng toán học số NumPy của nó Nó cung cấp một API hướng đối tượng để nhúng các lô vào ứng dụng bằng cách sử dụng các bộ công cụ GUI có mục đích chung như Tkinter, wxPython, Qt hoặc GTK
1.5 Hàm trong Python
Trong Python, hàm là một nhóm các lệnh có liên quan đến nhau được dùng để thực hiện một tác vụ, nhiệm vụ cụ thể nào đó Hàm giúp chia chương trình Python thànhnhững khối/phần/mô-đun nhỏ hơn Khi chương trình Python quá lớn, hoặc cần mở rộng, thì các hàm giúp chương trình có tổ chức và dễ quản lý hơn
Trang 11Cú pháp của lệnh return:
return [danh_sach_bieu_thuc]
Lệnh này có thể chứa biểu thức được tính toán và giá trị trả về Nếu không có biểu thức nào trong câu lệnh hoặc không có lệnh return trong hàm thì hàm sẽ trả về None
Phạm vi biến
Biến toàn cục: Các biến được khai báo ở bên ngoài tất cả các hàm thì được gọi là
biến toàn cục (external or global variable) Các biến toàn cục có thể truy xuất và sửdụng ở mọi hàm trong chương trình Biến toàn cục cũng tồn tại cho tới khi chương trình kết thúc
Biến cục bộ: Các biến được khai báo trong 1 hàm được gọi là các biến cục bộ Các
biến cục bộ này chỉ tồn tại và chỉ có thể sử dụng bên trong hàm trong khi hàm đó đang thực thi
Trang 12CHƯƠNG 2: XÂY DỰNG CÁC CTDL> VỚI PYTHON
2.1 Cấu trúc dữ liệu và giải thuật cơ bản
2.1.1 Mảng
Mảng là một phần cơ bản của tất cả các ngôn ngữ lập trình, nó là tập hợp các phần
tử của một kiểu dữ liệu duy nhất, ví dụ mảng số nguyên, mảng chuỗi Không giống như mảng, mỗi list có thể lưu trữ phần tử với bất kỳ kiểu dữ liệu nào và làm được mọi thứ mà mảng có thể làm Trong Python, không có cấu trúc dữ liệu mảng gốc nên người ta thường sử dụng các list Python thay cho mảng
Nếu muốn tạo mảng thực sự trong Python, ta cần phải sử dụng cấu trúc dữ liệu mảng của NumPy Để giải quyết các vấn đề toán học thì mảng NumPy sẽ hiệu quả hơn
Cài đặt cấu trúc dữ liệu ngăn xếp sử dụng cấu trúc lưu trữ kế tiếp với phần tử
dữ liệu là số nguyên:
# Xay dung lop
class Stack:
Trang 13# Ham khoi tao
Trang 142.1.3 Hàng đợi
Cũng giống như ngăn xếp, hàng đợi là một cấu trúc dữ liệu tuyến tính Hàng đợilưu trữ các mục sử dụng nguyên tắc FIFO (Nhập trước xuất trước) để chèn và xóa
Cách triển khai hàng đợi trong Python
Có nhiều cách khác nhau để triển khai hàng đợi trong Python Các cách phổ biến là:
Sử dụng cấu trúc dữ liệu Danh sách dựng sẵn
Sử dụng thư viện collection.deque
Triển khai một hàng đợi trong Python với một danh sách
Phương thức append () và pop () của danh sách được sử dụng để chèn và xóa các phần tử khỏi hàng đợi
Trang 15Triển khai hàng đợi bằng Python với collection.deque
Lớp deque từ mô-đun bộ sưu tập python cũng có thể được sử dụng để triển khai hàng đợi Nó hiệu quả hơn vì deque cung cấp các hoạt động xếp hàng và xếp hàng nhanh hơn
from collections import deque
deque(['Black', 'White', 'Orange'])
2.1.4 Danh sách liên kết đơn
Danh sách liên kết đơn là một tập hợp các Node được phân bố động, được sắp xếp
theo cách sao cho mỗi Node chứa một giá trị (Data) và một con trỏ (Next) Con trỏ
sẽ trỏ đến phần tử kế tiếp của danh sách liên kết đó Nếu con trỏ mà trỏ tới NULL, nghĩa là đó là phần tử cuối cùng của linked list.
Tạo danh sách liên kết đơn
Trong Python, DSLK đơn có thể được biểu diễn như một lớp và mỗi nút là một lớp riêng biệt khác như sau:
Trang 16# Lớp Node
class Node:
# Hàm khởi tạo đối tượng nút
def init (self, data):
def init (self, data):
self.data = data # Assign data
self.next = None # Initialize next as null
Trang 17# Tạo 3 nút có dữ liệu lần lượt là 1, 2, 3
llist.head = Node(1)
second = Node(2)
third = Node(3)
llist.head.next = second; # Liên kết nút đầu với nút 2
second.next = third; # Liên kết nút thứ 2 với nút thứ 3
Duyệt danh sách liên kết đơn
Giả sử đã có một DSLK đơn, duyệt DSLK đơn có nghĩa là truy cập tới từng nút của DSLK bắt đầu từ nút đầu tiên đến nút cuối cùng và tiến hành các xử lý cần thiết với mỗi thành phần của DSLK
def printList (self):
temp = self.head
while (temp):
print (temp.data
temp = temp.next
Chèn nút mới vào đầu DSLK đơn:
# Hàm push() chèn nút mới vào đầu DSLK đơn
def push (self, new_data):
Trang 18# Hàm chèn nút mới vào sau nút prev_node cho trước
def insertAfter (self, prev_node, new_data):
# 1 Kiểm tra sự tồn tại của nút prev_node
if prev_node is None:
print ( "Nút pre_node không thể rỗng." )
return
# 2 Tạo nút mới &
# 3 Đặt dữ liệu cho nút mới
Chèn nút mới vào sau nút cuối:
# Hàm thêm nút mới vào sau nút cuối
def append (self, new_data):
# 1 Tạo nút mới
# 2 Đặt dữ liệu cho nút mới
# 3 Cho next = None
Trang 19Xóa một nút khỏi danh sách liên kết đơn
# Xóa nút có giá trị khóa trong DSLK đơn
def deleteNode (self, key):
temp = self.head
# Nếu nút đầu có giá trị khóa thì xóa nút đầu
if (temp is not None):
Tìm kiếm một nút trong danh sách liên kết đơn
# Kiểm tra nút có giá trị khóa x có trong DSLK không
def search (self, x):
Trang 202.1.5 Giải thuật tìm kiếm
Tìm kiếm tuyến tính (Linear Search)
# python program for linear search using for loop
#define list
lst = []
#take input list size
num = int(input("Enter size of list :- "))
for n in range(num):
#append element in list/array
numbers = int(input("Enter the array of %d element :- " %n))
lst.append(numbers)
#take input number to be find in list
x = int(input("Enter number to search in list :- "))
# Recursive function to linear search x in arr[l r]
def recLinearSearch( arr, l, r, x):
Trang 21print('{} was found at index {}.'.format(x, res))
else:
print('{} was not found.'.format(x))
Tìm kiếm nhị phân (Binary Search)
#Trả về chỉ số của x trong arr nếu tồn tại, nếu không có sẽ trả về -1
def binary_search(arr, low, high, x):
#Trường hợp cơ sở
if high >= low:
mid = (high + low) // 2
#Nếu phần tử có tồn tại ở phần giữa của mảng
return binary_search(arr, low, mid - 1, x)
#Nếu không, phần tử sẽ nằm bên phải
Trang 22print("Phần tử cần tìm có chỉ số là", str(result))
else:
print("Phần tử cần tìm không có trong mảng.")
Tìm kiếm nội suy (Interpolation Search)
# If x is present in arr[0 n-1], then returns index of it, else returns -1.
def interpolationSearch(arr, lo, hi, x):
# Since array is sorted, an element present in array must be in range defined
by corner
if (lo <= hi and x >= arr[lo] and x <= arr[hi]):
# Probing the position with keeping uniform distribution in mind.
pos = lo + ((hi - lo) // (arr[hi] - arr[lo]) * (x - arr[lo]))
Trang 25while j>=gap and alist[j-gap] > alist[j]:
alist[j-gap], alist[j] = alist[j], alist[j-gap]
j -= gap
gap = gap / 2
lst = [54,26,93,17,77,31,44,55,20]