PHẦN 1: Giải thuật cơ bản
Bài 1: tổng quan về giải thuật
1. Tổng quan môn học
Giải thuật(Algorithms) hay thuật toán là một tập hợp hữu hạn các hướng dẫn được xác định rõ ràng, có thể thực hiện bằng máy tính, thường để giải quyết một lớp vấn đề hoặc thực hiện một phép tính.
Đặc điểm của thuật toán
Tính xác định: Thuật toán phải rõ ràng và không mơ hồ. Mỗi một bước phải rõ ràng và chỉ mang một mục đích nhất đinh.
Kết quả đầu ra: Một thuật toán phải có 1 hoặc nhiều dữ liệu đầu ra rõ ràng và phù hợp với đầu ra mong muốn.
Tính hữu hạn: Thuật toán phải kết thúc sau một số bước hữu hạn.
Tính khả thi: Một thuật toán phải khả thi với các nguồn lực có sẵn (tài nguyên, thiết bị hiện có)
Độc lập: Một thuật toán nên có hướng dẫn từng bước độc lập với bất kỳ code lập trình nào
Độ phức tạp của thuật toán (wiki, toidicodedao.com)
$\bullet$ Video: Khái niệm Big-O
$\bullet$ Video: Sử dụng Big-O
Big O Notation có thể dùng cho cả thời gian chạy – số lượng câu lệnh chạy, cũng như lượng bộ nhớ mà thuật toán cần sử dụng. Để dễ phân biệt, người ta phân ra thành:
- Time Complexity: Số lượng câu lệnh phải chạy – thời gian chạy của thuật toán dựa theo lượng phần tử đầu vào
- Space Complexity: Số lượng bộ nhớ thêm mà thuật toán cần, dựa theo số lượng phần tử đầu vào
Cấu trúc dữ liệu
$\bullet$ Bài đọc: cấu trúc dữ liệu vietjack.com
$\bullet$ Video: Tại sao cần phải học cấu trúc dữ liệu
Cấu trúc dữ liệu là một cách lưu dữ liệu trong máy tính sao cho nó có thể được sử dụng một cách hiệu quả.
2. Một số bài toán về giải thuật cơ bản
- Trường hợp cơ sở (hoặc các trường hợp) đơn giản - một kịch bản kết thúc không sử dụng đệ quy để đưa ra câu trả lời
- Bước đệ quy - một bộ quy tắc giảm tất cả các trường hợp khác đối với trường hợp cơ sở
$\bullet$ Ví dụ về đệ quy
- Tìm số fibonacci thứ n.
dãy fibonacci có công thức truy hồi là
$F(n)=\begin{cases}0& \text{ khi } n=0 \\ 1& \text{ khi } n=1 \\F(n-1)+F(n-2)& \text{ khi } x \geq 2 \end{cases}$
import sys
def fibonacci(n):
if n<=1:
return n
else:
return fibonacci(n-1)+fibonacci(n-2)
while True:
try:
n=int(input('nhập vào số tự nhiên n: '))
if n>=0:
break
except:
print(sys.exc_info()[0])
print('số fibonacci thứ {} là: F({}) ='.format(n,n),fibonacci(n))
![]() |
Mô phỏng cây đệ quy của hàm fibonacci |
Gọi $T(n)$ là số dòng code của hàm fibonacci(n), ta có
$T(n)=\begin{cases}2 & \text{nếu } n \leq 1 \\ T(n-1)+T(n-2)+3 & \text{nếu } n>1 \end{cases}$
$T(n)=T(n-1)+T(n-2) +3 < 2T(n-1)+3 <...< 2^n+3<2.2^n, \forall n >1$
import sys
def fibonacci(n):
F=[0]*(n+1)
F[0]=0
F[1]=1
for i in range(2,n+1):
F[i]=F[i-1]+F[i-2]
return F[n]
while True:
try:
n=int(input('nhập vào số tự nhiên n: '))
if n>=0:
break
except:
print(sys.exc_info()[0])
print('số fibonacci thứ {} là: F({}) ='.format(n,n),fibonacci(n))
Không có nhận xét nào:
Đăng nhận xét