1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo đồ án lập trình

51 18 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 51
Dung lượng 498,01 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

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 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 2

Nộ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&GT 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 3

2.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 4

LỜ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&GT 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 5

CHƯƠ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 6

dụ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 7

Python 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 9

List: Đượ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 10

cá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 11

Cú 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 12

CHƯƠNG 2: XÂY DỰNG CÁC CTDL&GT 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 14

2.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 15

Triể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 19

Xó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 20

2.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 21

print('{} 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 22

print("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 25

while 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]

Ngày đăng: 06/09/2022, 08:52

w