Trong khoa học máy tính, thuật toán tất định là một thuật toán có đầu ra (output) hoàn toàn có thể dự đoán được (xác định được) qua đầu vào (input), và máy chạy thuật toán đó luôn thực hiện các phép tính toán như nhau và có cùng một chuỗi trạng thái. Cho đến hiện tại, thuật toán tất định là loại thuật toán được nghiên cứu và được nhiều người quen thuộc nhất, cũng như là một trong các loại thuật toán thiết thực nhất, bởi lẽ loại thuật toán này có thể thực thi hiệu quả được trên các máy thực.
Nói ngắn gọn, tính tất định của thuật toán có nghĩa là:
- Nếu input giống nhau trên mỗi lần chạy, luôn có cùng một output
- Thời gian chạy, lượng bộ nhớ và tài nguyên cần thiết là như nhau trên mỗi lần chạy nếu input là giống nhau.
Định nghĩa chính thức
Thuật toán tất định có thể được định nghĩa theo máy trạng thái: một trạng thái mô tả đặc điểm của một máy đang hoạt động tại một thời điểm cụ thể trong thời gian chạy. Các máy trạng thái chuyển đổi rời rạc từ trạng thái này sang trạng thái khác. Ngay sau khi nhận đầu vào, máy nằm ở trạng thái ban đầu hay trạng thái khởi động. Nếu máy mang tính tất định, thì từ thời điểm này trở đi, trạng thái hiện tại của nó xác định trạng thái kế tiếp mà nằm trong tập trạng thái được định trước. Lưu ý rằng máy tất định vẫn có thể không dừng được hoặc kết thúc, do đó không có kết quả đầu ra.
Các ví dụ cụ thể của máy trừu tượng tất định gồm máy Turing mang tính xác định và máy tự động hữu hạn xác định.
Nguyên nhân làm cho thuật toán không xác định?
Một loạt các yếu tố khác nhau có thể khiến cho hành vi thuật toán không xác định được, hoặc bất định:
- Thuật toán sử dụng trạng thái bên ngoài mà không phải là đầu vào, như đầu vào của người dùng, biến toàn cục, giá trị bộ đếm thời gian phần cứng hoặc là giá trị ngẫu nhiên hoặc dữ liệu lưu trên ổ đĩa.
- Thuật toán nhạy cảm với thời gian, ví dụ nếu thuật toán có nhiều bộ xử lý ghi cùng lúc vào cùng một dữ liệu. Trong trường hợp này, thứ tự mà mỗi bộ xử lý ghi dữ liệu sẽ ảnh hưởng đến kết quả.
- Lỗi phần cứng làm cho trạng thái của thuật toán thay đổi theo cách không lường trước được.
Mặc dù các chương trình trong thực tế hiếm khi thực sự tất định, nhưng con người hoặc chương trình khác dễ dàng suy ra hơn về trạng thái của chương trình đó. Vì lý do này, hầu hết các ngôn ngữ lập trình và đặc biệt là các ngôn ngữ lập trình hàm nỗ lực ngăn chặn các sự kiện trên xảy ra hoặc xảy ra trong điều kiện kiểm soát.
Sự phổ biến của các bộ vi xử lý đa lõi đã dẫn đến sự quan tâm đến tính xác định trong lập trình song song và những thách thức của tính không xác định đã được tài liệu hóa một cách đầy đủ. Nhiều công cụ đã được phát triển để giúp đối phó với deadlocks và điều kiện đua.
Điểm bất lợi của sự tất định
Trong một số trường hợp, hành vi không xác định của chương trình là có lợi. Chẳng hạn như chương trình chia bài trong trò chơi blackjack phải khiến người chơi không thể dự đoán trước - ngay cả khi mã nguồn của chương trình là mở. Việc sử dụng một bộ tạo số giả ngẫu nhiên thường không đủ đảm bảo để người chơi không dự đoán được kết quả của việc chia bài. Một con bạc thông minh có thể đoán chính xác những con số bộ sinh tạo ra và do đó biết trước toàn bộ các lá bài trong canh bạc trước khi ván bài bắt đầu, cho phép hắn ăn gian. Những vấn đề này có thể được phòng tránh một phần nào đó thông qua việc sử dụng bộ sinh số giả ngẫu nhiên an toàn mật mã, nhưng việc sử dụng nguồn ngẫu nhiên không thể đoán trước để khởi động bộ sinh vẫn rất cần thiết, mà nguồn ngẫu nhiên này có thể được tạo bởi bộ sinh số ngẫu nhiên phần cứng.
Lưu ý rằng đáp án phủ định của bài toán P so với NP không ngụ ý về mặt lý thuyết rằng các chương trình với kết quả không xác định là hiệu quả hơn những chương trình có kết quả tất định. Lớp độ phức tạp NP có thể được định nghĩa mà không cần tham khảo đến tính không xác định qua việc sử dụng định nghĩa dựa trên xác minh.
Hạng mục tất định trong ngôn ngữ lập trình
Mercury
Ngôn ngữ lập trình hàm luận lý này tạo ra các phân loại tất định khác nhau cho các chế độ khác nhau.
Haskell
Haskell cung cấp một số cơ chế:
không xác định hoặc dấu hiệu Fail
- Kiểu dữ liệu Maybe và Either bao gồm dấu hiệu thành công trong kết quả.
- phương thức fail của lớp Monad, xem ngoại lệ là báo hiệu thất bại.
- Đơn nguyên Maybe và MaybeT có thể biến đổi cung cấp khi tính toán không thành công (ngừng tính toán và trả về Nothing).
xác định/không xác định với đa giải pháp
- Có thể truy xuất tất cả các kết quả có thể có của phép tính đa kết quả, bằng cách đóng gói kết quả trong đơn nguyên MonadPlus. (phương thức mzero làm cho một kết quả thất bại và phương thức mplus thu thập các kết quả thành công).
Họ ngôn ngữ ML và các dẫn xuất
Trong ngôn ngữ ML chuẩn, OCaml và Scala
- Kiểu option có chứa dấu hiệu thành công.
Java
- Giá trị tham chiếu null có thể biểu thị kết quả không thành công (ngoài miền giá trị).
Thể loại:Phân tích thuật toán
👁️
2 | 🔗 | 💖 | ✨ | 🌍 | ⌚
Trong khoa học máy tính, **thuật toán tất định** là một thuật toán có đầu ra (output) hoàn toàn có thể dự đoán được (xác định được) qua đầu vào (input), và máy chạy thuật
nhỏ| Để tìm kiếm một mục đã cho trong một danh sách theo thứ tự nhất định, có thể sử dụng cả thuật toán [[Tìm kiếm tuần tự|tìm kiếm nhị phân và tuyến tính (bỏ
Bài viết này là **danh sách các thuật toán** cùng một mô tả ngắn cho mỗi thuật toán. ## Thuật toán tổ hợp ### Thuật toán tổ hợp tổng quát * Thuật toán Brent: tìm
phải|nhỏ|[[Lưu đồ thuật toán (thuật toán Euclid) để tính ước số chung lớn nhất (ưcln) của hai số _a_ và _b_ ở các vị trí có tên A và B. Thuật toán tiến hành bằng
Trong tính toán lượng tử, **thuật toán lượng tử** là một thuật toán chạy bằng mô hình thực tế của tính toán lượng tử, mô hình được sử dụng phổ biến nhất là mô hình
Trong khoa học máy tính, **thuật toán dòng dữ liệu** là thuật toán để xử lý các dòng dữ liệu trong đó dữ liệu vào được cung cấp dưới dạng một dãy các phần tử,
Trong khoa học máy tính và trong toán học, **thuật toán sắp xếp** là một thuật toán sắp xếp các phần tử của một danh sách (hoặc một mảng) theo thứ tự (tăng hoặc giảm).
**Thuật toán phân tán** là một thuật toán được thiết kế để chạy trên phần cứng máy tính được xây dựng từ các bộ vi xử lý kết nối. Các thuật toán phân tán được
**Thuật toán Berlekamp–Massey** là một thuật toán tìm bộ ghi dịch hồi tiếp tuyến tính (LFSR) ngắn nhất sinh ra một dãy nhị phân cho trước. Thuật toán cũng tìm ra đa thức nhỏ nhất
Các **thuật toán tìm đường đi trong mê cung** là những phương pháp được tự động hóa để giải một mê cung. Các thuật toán chọn đường ngẫu nhiên, bám theo tường, Pledge, và Trémaux
**Thuật toán Christofides** (đặt tên theo Nicos Christofides) là một thuật toán xấp xỉ cho bài toán người bán hàng trong đó trọng số các cạnh thỏa mãn bất đẳng thức tam giác. Đặt
**Thuật toán Borůvka** là một thuật toán để tìm cây bao trùm nhỏ nhất trên đồ thị. Thuật toán này được xuất bản lần đầu năm 1926 bởi Otakar Borůvka dưới dạng một phương pháp
**Thuật toán Luhn** hoặc **công thức Luhn**, cũng được biết là thuật toán "modulus 10" hay "mod 10", nó được đặt theo tên người sáng tạo ra nó, nhà khoa học của IBM Hans Peter
Trong khoa học máy tính, **thuật toán song song** (hay còn gọi là **thuật toán đồng thời**) là thuật toán tương phản với thuật toán truyền thống tuần tự kiểu (nối tiếp) hay thuật toán
thumb|320x320px|Mã hóa khóa đối xứng: quá trình mã hóa và giải mã sử dụng cùng một khóa Trong mật mã học, các **thuật toán khóa đối xứng** (_tiếng Anh: symmetric-key algorithms_) là một lớp các
Trong hình học tính toán, **thuật toán Chan**, gọi theo tên của Timothy M. Chan, là một thuật toán phụ thuộc dữ liệu ra tối ưu cho việc tìm bao lồi của tập hợp _P_
**CYK** viết tắt của từ **Cocke-Younger-Kasami**, là một thuật toán dùng để xác định xem một xâu có được tạo ra (hay đoán nhận) bởi một văn phạm phi ngữ cảnh hay không (context-free grammar).
thumb|Tarjan's Algorithm Animation **Thuật Toán Tarjan** (được đặt theo tên của người tìm ra nó - Robert Tarjan) là một thuật toán trong lý thuyết đồ thị dùng để tìm thành phần liên thông mạnh
Trong khoa học máy tính, **thuật toán Floyd-Warshall** (còn được gọi là **thuật toán Floyd**, **thuật toán Roy-Warshall**, **thuật toán Roy-Floyd** hoặc **thuật toán WFI**) là một thuật toán để tìm đường đi ngắn nhất
Trong khoa học máy tính, **thuật toán Prim** là một thuật toán tham lam để tìm cây bao trùm nhỏ nhất của một đồ thị vô hướng có trọng số liên thông. Nghĩa là nó
**Thuật toán Bellman–Ford** hay **Giải thuật Bellman–Ford** là một thuật toán tính các đường đi ngắn nhất nguồn đơn trong một đồ thị có hướng có trọng số (trong đó một số cung có thể
**Thuật toán Kruskal** là một thuật toán trong lý thuyết đồ thị để tìm cây bao trùm nhỏ nhất của một đồ thị liên thông vô hướng có trọng số. Nói cách khác, nó tìm
Trong khoa học máy tính, **thuật toán Kosaraju-Sharir** là một thuật toán tìm thành phần liên thông mạnh trong đồ thị có hướng. Theo Aho, Hopcroft và Ullman, thuật toán này xuất hiện trong một
** Thuật toán so khớp chuỗi Knuth–Morris–Pratt** (hay **thuật toán KMP**) tìm kiếm sự xuất hiện của một "từ" W
trong một "xâu văn bản" S
bằng cách tiếp tục quá trình tìm kiếm khi
**Thuật toán Ford- Fulkerson** (đặt theo L. R. Ford và D. R. Fulkerson) tính toán luồng cực đại trong một mạng vận tải. Tên Ford-Fulkerson cũng thường được sử dụng cho thuật toán Edmonds-Karp, một
**Thuật toán Dijkstra**, mang tên của nhà khoa học máy tính người Hà Lan Edsger Dijkstra vào năm 1956 và ấn bản năm 1959, là một thuật toán giải quyết bài toán đường đi ngắn
**Thuật toán Dinitz** là một thuật toán thời gian đa thức mạnh cho việc tìm luồng cực đại trên đồ thị luồng, tìm ra năm 1970 bởi nhà nghiên cứu khoa học máy tính người
**Thuật toán ghép cặp của Edmonds** (còn gọi là thuật toán bông hoa) là một thuật toán trong lý thuyết đồ thị để tìm cặp ghép cực đại trong đồ thị. Thuật toán được tìm
**Thuật toán Johnson** được Donald B. Johnson tìm ra năm 1977. Thuật toán Johnson là một thuật toán giải quyết bài toán đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có hướng,
Trong khoa học máy tính và lý thuyết đồ thị, **thuật toán Karger** là một thuật toán Monte Carlo để tìm lát cắt nhỏ nhất của một đồ thị vô hướng. Bài toán lát cắt
**Mạch khuếch đại thuật toán** (tiếng Anh: operational amplifier), thường được gọi tắt là **op-amp** là một mạch khuếch đại "DC-coupled" (tín hiệu đầu vào bao gồm cả tín hiệu BIAS) với hệ số khuếch
**Lý thuyết độ phức tạp tính toán** (tiếng Anh: _computational complexity theory_) là một nhánh của lý thuyết tính toán trong lý thuyết khoa học máy tính và toán học tập trung vào phân loại
thumb|Thuật toán Euclid để tìm ước chung lớn nhất (ƯCLN) của hai đoạn thẳng BA và DC, độ dài của cả hai đều là bội của một "đơn vị" độ dài chung. Vì độ dài
Trong đồ thị này, đường đi rộng nhất từ Maldon tới Feering có chiều rộng 29, và đi qua Clacton, Tiptree, Harwich, và Blaxhall. **Bài toán đường đi rộng nhất**, còn gọi là **bài toán
Trong giáo dục, **Tư duy tính toán** hay **Tư duy máy tính** (Computational Thinking - CT) là một tập hợp các phương pháp giải quyết vấn đề liên quan đến việc diễn đạt các vấn
**Giải thuật tham lam** (tiếng Anh: _Greedy algorithm_) là một thuật toán giải quyết một bài toán theo kiểu metaheuristic để tìm kiếm lựa chọn tối ưu địa phương ở mỗi bước đi với hy
**Các định lý bất toàn của Gödel**, hay gọi chính xác là **Các định lý về tính bất hoàn chỉnh của Gödel** (tiếng Anh: **Gödel's incompleteness theorems**, tiếng Đức: **Gödelscher Unvollständigkeitssatz**), là hai định lý
Toán học trong nghệ thuật: Bản khắc trên tấm đồng mang tên _[[Melencolia I_ (1514) của Albrecht Dürer. Những yếu tố liên quan đến toán học bao gồm com-pa đại diện cho hình học, hình
Ví dụ về một bài toán xếp ba lô giới hạn 1 chiều: chọn các hộp nào để tổng giá trị các hộp trong ba lô là lớn nhất mà tổng khối lượng dưới 15 kg?
nhỏ|Phương pháp Monte Carlo Các **phương pháp Monte Carlo** là một lớp các thuật toán để giải quyết nhiều bài toán trên máy tính theo kiểu không tất định, thường bằng cách sử dụng các
Trong lý thuyết đồ thị và trí tuệ nhân tạo, **Thuật toán tô màu tham lam** (tiếng Anh: _Greedy coloring_) là một trong những phương pháp tô màu cho đồ thị áp dụng giải thuật
**Lý thuyết thông tin thuật toán** là một lĩnh vực của lý thuyết thông tin và khoa học máy tính liên quan đến mối quan hệ giữa tính toán và thông tin. Theo Gregory Chaitin,
GIƠI THIÊU SACH NHÂP MÔN THUÂT TOAN Cuốn sách này được viết hướng đến người đọc là giáo viên và học sinh từ cấp THCS lớp 8 trở lên theo nội dung lõi của định
} ## Bối cảnh thực tế Bài toán tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị liên thông có nhiều ứng dụng thực tế như: * Bài toán chọn hành trình
Trong khoa học máy tính, **độ phức tạp tính toán** hoặc đơn giản là **độ phức tạp** của thuật toán là lượng tài nguyên cần thiết để chạy nó. Tập trung đặc biệt được đưa
**Bài toán cây Steiner** hay bài toán tìm đường đi ngắn nhất từ 2 điểm cho trước được phát triển dựa trên bài toán Fermat của nhà toán học nổi tiếng người Pháp. Vào thế
Trong toán học dân gian,"**định lý không có bữa trưa miễn phí**"của David Wolpert và William G. Macready xuất hiện năm 1997 trong bài báo"Tối ưu các định lý không có bữa trưa miễn phí"(No
nhỏ|Nếu người bán hàng xuất phát từ điểm A, và nếu khoảng cách giữa hai điểm bất kì được biết thì đâu là đường đi ngắn nhất mà người bán hàng có thể thực hiện
Trong tài chính, **phân tích kỹ thuật** là một phương pháp phân tích chứng khoán dự báo hướng của giá cả thông qua việc nghiên cứu các dữ liệu thị trường quá khứ, chủ yếu
[[Siêu máy tính song song hàng loạt Blue Gene/P của IBM]] **Tính toán song song** (tiếng Anh: _Parallel computing_), là một hình thức tính toán trong đó nhiều phép tính và tiến trình được thực