Thuật toán là gì?


12

Chính xác thì thuật toán là gì, như trong Thuật toán có nghĩa là gì? Tôi hiểu từ này là nó không đặc trưng cho một ngôn ngữ cụ thể hoặc mẫu thiết kế, thay vào đó là một trong những nguyên tắc cơ bản nhất (vì vậy tôi đoán câu hỏi này khiến tôi trông thật ngu ngốc).

Một trong những "lựa chọn" mà tôi có để hiểu về nó, đó là nó có nghĩa là phương pháp để hoàn thành một cái gì đó, có thể được viết dưới dạng một danh sách trong mã giả.

Khi tôi viết mã phức tạp hơn, tôi nghĩ những gì cần phải được thực hiện, với những gì và làm thế nào tôi sẽ đến đó (không phải bằng ngôn ngữ lập trình), sau đó viết mã đó. Đó có phải là cách tốt để nói về nó, và đó có phải là bất cứ điều gì để làm với các thuật toán không?

. nơi khác, tôi xin lỗi nếu tôi nên hỏi ở đó)



1
@Apalala: Tôi không nghĩ những giới hạn đó được áp dụng.
Josh K

2
@Apalala: Hữu hạn , không biết .
Josh K

2
@Jonathan: "những từ mà tôi phải tìm kiếm"? Những từ nào? Hãy cụ thể . Trang web này không phải là phép thuật. Chúng tôi không biết bạn. Chúng tôi không biết những gì bạn đọc. Chúng tôi không biết điều gì làm bạn bối rối. Hãy cụ thể .
S.Lott

1
@Apalala: "Finite" có nghĩa là "giới hạn", không có gì hơn. Một thuật toán được đảm bảo để dừng lại đôi khi. Việc chứng minh tính hữu hạn sẽ dễ dàng hơn nhiều khi bạn có một số cách dự đoán nó sẽ kết thúc, vì vậy thuật toán có xu hướng dự đoán được, nhưng khả năng dự đoán không nằm trong định nghĩa thông thường của thuật toán.
David Thornley

Câu trả lời:


19

Một thuật toán là một chuỗi hữu hạn của các hướng dẫn được xác định rõ để tính toán một hàm (hoặc thực hiện một thủ tục) kết thúc ở trạng thái kết thúc được xác định rõ.


1
+1. "Hữu hạn, được xác định rõ ràng và hiệu quả" là ba tiêu chí trong mục Wikipedia. Bạn có cả ba ở đây, cũng có.
S.Lott

Tôi được thiết lập để xem các video được trích dẫn bởi @ Jörg, nhưng quan điểm hiện tại của tôi là không chỉ các bước phải là hữu hạn. Nếu các tài nguyên (bao gồm cả thời gian) không bị ràng buộc, thì thủ tục có thể được gọi hoặc được gắn nhãn là bất cứ điều gì, nhưng không phải là một thuật toán .
Apalala

@Apalala - Tôi đã quay lại sách giáo khoa của mình và tôi không thấy hạn chế đó ở bất cứ đâu. Có thể đối với một tập dữ liệu cụ thể hoặc đầu vào, thuật toán có thể không chấm dứt (các thuật toán như phương pháp Newton-Raphson để tìm gốc có thể bị kẹt trong một vòng lặp không bao giờ kết thúc), nhưng điều đó không làm cho thuật toán không phải là thuật toán.
John Bode

@John Dao động có thể và thường xuyên được phát hiện trong Newton-Raphson.
Apalala

1
@Apalala: nghe giống như định nghĩa của một chương trình hơn là thuật toán. Ý tưởng về các bước rời rạc này hiện diện trong các máy Turing, máy đăng ký, máy truy cập ngẫu nhiên, và tất nhiên trong các máy tính vật lý thực tế của chúng tôi, cũng có khá nhiều ngôn ngữ lập trình và thậm chí, mặc dù rõ ràng hơn, trong phép tính lambda. Nhưng đó là một hạn chế tùy ý không có trong thuật toán. Các thuật toán tương tự , ví dụ, không có các bước riêng biệt (trên thực tế, đó là định nghĩa của thuật toán tương tự) và chúng thực sự có thể được thực hiện với một máy tính tương tự.
Jörg W Găngag

15

Đây thực sự là một câu hỏi khá thú vị, và trên thực tế vẫn là một câu hỏi nghiên cứu mở.

Yuri Gurevich, một trong những người khổng lồ của Lý thuyết thuật toán, hiện đang đưa ra một loạt bài giảng video trên trang web cộng đồng của Kênh Channel9:

Như bạn có thể thấy, chính câu hỏi của bạn thực sự là tiêu đề của bài giảng thứ hai. Tuy nhiên, tôi thực sự khuyên bạn nên xem cả ba.

Cụ thể, cái đầu tiên chứa một vài ví dụ về các thuật toán làm mất hiệu lực khá nhiều tất cả các định nghĩa được đưa ra trong hầu hết các câu trả lời khác ở đây.


2
Cảm ơn các liên kết. Bạn sẽ nhận thấy những điều sau đây trong văn bản đi kèm với video đầu tiên, như là một phần của định nghĩa của thuật toán: "cuối cùng chấm dứt ở trạng thái kết thúc cuối cùng". Chấm dứt là một phần thiết yếu của định nghĩa của một thuật toán. Đó là lý do tại sao các hệ điều hành và máy chủ không kết thúc không phải là thuật toán.
LIProf

4

Một thuật toán giống như một công thức nấu ăn tốt . Bạn có một số đầu vào, một số bước trung gian được xác định rõ và nhận được kết quả cuối cùng.

Áp dụng cho lập trình, đó là một mô tả rõ ràng về các bước bạn cần thực hiện để giải quyết một vấn đề cụ thể. Bất cứ điều gì bạn có thể viết ra bằng ngôn ngữ lập trình bạn chọn đều có thể được xem là một thuật toán - nhưng thông thường thuật ngữ này chỉ được sử dụng cho các tác vụ logic hoặc toán học thông thường, chẳng hạn như sắp xếp hoặc tìm kiếm.


Có rất nhiều thuật toán không nhất thiết phải đưa ra kết quả cuối cùng. Ví dụ, một hệ điều hành hoặc máy chủ web là một thuật toán đưa ra kết quả cuối cùng thường được coi là một lỗi.
Jörg W Mittag

@ JörgWMittag nhưng hệ điều hành hay máy chủ web là "thuật toán"? Tôi nghĩ rằng họ không - họ có thể giải các bài toán con trong miền của họ bằng thuật toán - và trong mọi trường hợp, họ chắc chắn cần một kết quả cuối cùng - nhưng họ cũng có những phần không phải là thuật toán, và nói chung họ không phải là ' thuật toán t. (Giống như bạn đã nói trong một nhận xét khác - Hệ điều hành và máy chủ web là chương trình nhưng không nhất thiết phải là thuật toán ).
Andres F.

2

Thuật toán là một tập hợp các quy tắc hoặc quy trình (trong tính toán) được sử dụng để giải quyết vấn đề. Về cơ bản, có một vấn đề, bạn muốn có một giải pháp và quá trình cho giải pháp này là một thuật toán. Một thuật toán có một bộ quy tắc / quy trình hữu hạn để đi đến một giải pháp.

Nếu bạn giống như Edsger W. Dijkstra , bạn sẽ viết thuật toán của mình lên một tờ giấy và tìm ra / tinh chỉnh thuật toán trên giấy cho đến khi bạn hài lòng về thuật toán của mình. Mặt khác (đặc biệt là khi viết tài liệu), một sơ đồ được sử dụng để biểu diễn sơ đồ dòng chảy của một thuật toán / quy trình. Điều này cho phép những người khác phê bình sơ đồ và cải thiện nếu cần (mà không phải lo lắng về ngôn ngữ lập trình nào là cần thiết).

Tôi không biết nếu câu trả lời cho câu hỏi của bạn.


Tôi không thích từ được đặt vì nó có nghĩa là "không được đặt hàng". Tôi thích "trình tự", hoặc bộ sự kiện ở lại trong khu vực toán học
BenjaminB

@ Ubiquité, Set không nhất thiết có nghĩa là "không được đặt hàng". Bạn có thể phân loại một bộ theo thứ tự bạn muốn (ví dụ: thứ tự ngẫu nhiên). Tuy nhiên, điều đó không yêu cầu downvote vì cách giải thích của mọi người về từ "set". Thêm vào đó, bạn có thể có một tập hợp, đó là một nhóm các tập hợp, cũng là một phần của các thuật toán. Do đó "tập hợp" có thể là bất cứ điều gì, miễn là nó được sử dụng một cách thích hợp như một giải pháp thuật toán cho một vấn đề.
Buhake Sindi

Tôi đã không downvote!
BenjaminB

Xin lỗi, tôi không có ý đổ lỗi cho bạn về downvote. Downvoter nên cung cấp rõ ràng lý do cho downvote.
Buhake Sindi

1

Thuật toán: một tập hợp các hoạt động được sắp xếp hợp lý là 1) không rõ ràng và 2) có thể tính toán hiệu quả sao cho việc thực hiện các hoạt động bắt đầu từ lần đầu tiên tạo ra kết quả sau một số lượng hoạt động hữu hạn.


Ví dụ truy cập: một hệ điều hành. Nó không tạo ra một kết quả nào cả , trên thực tế, mà thường được coi là một lỗi.
Jörg W Mittag

@ Jörg, hệ điều hành tạo ra nhiều kết quả, được thực hiện cùng nhau, tạo ra kết quả chung của việc cung cấp dịch vụ hệ thống cho các ứng dụng.
ThomasMcLeod

@ JörgWMittag Giống như tôi đã nói trong các bình luận khác với bạn, một kết luận cho quan sát của bạn là trên thực tế, một hệ điều hành không phải là một thuật toán;)
Andres F.

1

Thuật toán Đó là sự kết hợp của các bước tuần tự (các bước này có thể là tính toán, xử lý dữ liệu và tác vụ lý luận) sử dụng để giải quyết vấn đề theo cách rất đơn giản và hiệu quả.

Nó được thiết kế hiệu quả nhất mà nó có thể được thể hiện trong một khoảng không gian và thời gian hữu hạn. chúng ta có thể thực hiện nó trong bất kỳ ngôn ngữ lập trình nào.

Thuộc tính của một thuật toán: sau đây là các thuộc tính chính của thuật toán: -

Một thuật toán phải có một tên duy nhất. Nó nên có bộ đầu vào và đầu ra được xác định rõ ràng. Một thuật toán phải theo thứ tự tuần tự với các hoạt động rõ ràng. Nó phải có một số điểm cuối, nghĩa là, nó dừng lại trong một khoảng thời gian hữu hạn. bấm vào đây để tìm hiểu về Thiết kế và Phân tích Thuật toán


0

Tôi sử dụng thuật ngữ để mô tả một công thức để giải quyết một vấn đề cụ thể. Công thức không nhất thiết phải được viết bằng toán học hoặc có mối quan hệ 1: 1 với một phương thức. Trong các thuật toán trường học và cấu trúc dữ liệu có liên quan chặt chẽ và có thể được viết dưới dạng công thức toán học hoặc được chứng minh bằng các bằng chứng.


0

Thuật toán là một bản tóm tắt của chương trình máy tính và bao gồm một tập hợp các hướng dẫn để đạt được một số nhiệm vụ được xác định rõ trong một số bước hữu hạn, mặc dù ràng buộc về số bước có thể rất lớn và các bước riêng lẻ có thể phức tạp ( hữu hạn) nhiệm vụ trong quyền riêng của họ. Mặc dù có các chương trình (chính xác) là tổng thể đã biết - không phải là thuật toán, tất cả chúng đều hoạt động bằng cách lặp lại các phần thuật toán theo một số mẫu. (Thú vị hơn là các chương trình mà tình trạng chấm dứt không được biết đến, nhưng hầu hết các lập trình viên không thực sự xử lý những điều đó một cách có chủ ý; Tôi biết tôi không biết!)


0

IMO không ai biết rõ :) Tôi đã thấy thuật ngữ chỉ áp dụng cho các hàm tính toán, cho bất kỳ hàm nào nhận đầu vào và tạo đầu ra, và cho bất kỳ thứ gì có đầu vào và thực hiện một số thao tác trên nó.

Bạn có xem xét bất kỳ / tất cả những điều sau đây là một thuật toán không?

  1. Một hàm tính lãi suất của khoản vay trong khoảng thời gian 20 năm
  2. Logic nghiệp vụ kiểm tra nếu tất cả thông tin đã được nhập vào đơn xin vay tiền
  3. Một finderchức năng truy vấn cơ sở dữ liệu cho một đối tượng khách hàng
  4. Một chức năng "trợ giúp" giúp dọn dẹp và định dạng nhập dữ liệu
  5. Một hàm phân tích tệp XML và ánh xạ dữ liệu tới các đối tượng kinh doanh
  6. Một lớp nhận đầu vào và ghi chúng vào một tệp văn bản

0

Thuật toán là một ý tưởng, một phương pháp, một kỹ thuật, "thông minh" để tính toán hoặc thực hiện một nhiệm vụ trừu tượng trong tự nhiên, nhưng khi nó chạy trên các máy tính trong thế giới thực, chúng tôi mong muốn nó sử dụng ít tài nguyên nhất có thể , đó là, trong thế giới máy tính, Thời gian và bộ nhớ.


0

Một thuật toán là một chuỗi các bước được xác định rõ ràng tạo ra kết quả trong thời gian hữu hạn.

Bước được xác định rõ: Đó là điều bạn có thể làm hoặc tính toán được xác định chính xác. Chỉ cần đọc bước bạn biết bạn phải làm gì và làm như thế nào. Cụ thể, bạn có thể viết nó bằng ngôn ngữ lập trình mà bạn biết và chắc chắn đoạn chương trình khớp chính xác với bước.

Trình tự: Các bước được thực hiện theo thứ tự được chỉ định. Các bước có thể được thực hiện nhiều lần tùy thuộc vào dữ liệu (vòng lặp) hoặc hoàn toàn không được thực hiện tùy thuộc vào dữ liệu (nếu câu lệnh). Các thuật toán song song chỉ áp đặt một phần thứ tự cho các bước, vì vậy tôi áp dụng quá mức ở đây. Sẽ đúng hơn khi mô tả nó như một tập hợp được sắp xếp một phần so với một chuỗi, nhưng tôi muốn giữ các từ đơn giản hơn một chút. Bên cạnh đó, có thể dễ dàng nhúng một bộ được đặt hàng một phần theo thứ tự đầy đủ.

Kết quả: Một trạng thái kết thúc hoặc giá trị. Nó không phải được dự đoán trước, nhưng nó phải là một kết thúc chắc chắn thỏa mãn một số điều kiện. Điều này không có nghĩa là một hệ điều hành không phải là một thuật toán, mặc dù nó sử dụng rất nhiều trong số chúng.

Hữu hạn: Một thuật toán được đảm bảo dừng lại đôi khi, ít nhất là trên một máy có thể chạy đủ lâu. Nó không nhất thiết được đảm bảo dừng lại trong một thời gian dự đoán và không đảm bảo rằng nó sẽ dừng lại trước khi mặt trời mở rộng và chuyển sang màu đỏ trên bất kỳ máy hiện có nào. Điều này cũng có nghĩa là một hệ điều hành không phải là một thuật toán, vì lý tưởng là nó sẽ chạy mãi mãi. Tôi đã thấy từ "thủ tục" được sử dụng để mô tả một cái gì đó sẽ là một thuật toán nếu chúng tôi chắc chắn rằng nó sẽ dừng lại vào lúc nào đó. (Có thể có một thuật toán sẽ dừng trong một khoảng thời gian không xác định. Giả sử, giả thuyết của Goldbach đã được chứng minh là sai về mặt toán học, trong một bằng chứng phi cấu trúc, do đó, có một số chẵn> 2 không phải là tổng của hai số nguyên tố Một thuật toán chỉ đơn giản là kiểm tra các số chẵn cuối cùng sẽ chấm dứt,

Thuật toán là một thứ trừu tượng có chủ ý, vì vậy chúng tôi không xem xét các câu hỏi như "Có thể thực hiện điều này trước khi cái chết nóng của Vũ trụ không?". Họ quá khó để trả lời. Nếu nó liên quan đến hoạt động của máy tính, thật dễ dàng để thực hiện nó bằng ngôn ngữ lập trình.


-1

Nếu tôi phải đưa ra một định nghĩa chung, tôi sẽ nói thuật toán là một công thức để giải quyết vấn đề điện toán phức tạp hơn và kết quả là hiệu quả hơn so với giải pháp rõ ràng / vũ phu.

Ngoài ra, điều quan trọng cần lưu ý là thuật toán không phải là bất kỳ mã nguồn cụ thể nào; Đó là sự tính toán. Trong số những thứ khác, điều này có nghĩa là bất kỳ ngôn ngữ hoàn chỉnh Turing nào cũng có thể thực hiện bất kỳ thuật toán nào mà bất kỳ ngôn ngữ hoàn chỉnh Turing nào khác có thể thực hiện.


Tôi thích câu trả lời này rất nhiều, và tôi nghĩ rằng chúng ta có thể đưa nó đi xa hơn một chút và nói (mặc dù không liên quan đến câu hỏi ban đầu): bất kỳ thuật toán nào cũng là tối ưu hóa của giải pháp tìm kiếm cây / lực lượng vũ phu. Đã tự hỏi nếu nó có thể được chứng minh chính thức.
mojuba

-1 "Thuật toán" là một thuật ngữ toán học được xác định rõ.
Apalala

1
@Apalala vì vậy điều gì ngăn bạn xác định lại nó vì mục đích rõ ràng hoặc, nói, hiểu rõ hơn về bản chất của nó? Thuật toán như một "bộ hướng dẫn" hầu như không nói gì với tôi.
mojuba

1
@mojuba Tôi thực sự không quan tâm nếu thuật ngữ này sẽ được xác định lại, nhưng tôi nghĩ rằng định nghĩa truyền thống là hữu ích, bởi vì nó ít nhất phân biệt giữa các cách tiếp cận vấn đề: Thuật toán là một công thức để giải quyết vấn đề sử dụng tài nguyên hữu hạn . Thay đổi định nghĩa đó, và hậu quả có thể thấy trước là chúng ta sẽ phải đưa ra một từ khác có nghĩa tương tự. Chết tiệt! Tất cả các kiến ​​thức thu được trong thế kỷ qua về khả năng tính toán và độ phức tạp biến mất mà không có một định nghĩa âm thanh của thuật toán !
Apalala

1
Một tìm kiếm vũ phu là một thuật toán. Nó thường không phải là một thuật toán đẹp và thường không đáng để viết lên. Tôi không thấy bất kỳ sự hữu ích thực sự nào trong việc loại trừ lực lượng vũ phu, và trong nhiều trường hợp, điều đó không rõ ràng "tốt hơn lực lượng vũ phu" thực sự có nghĩa là gì.
David Thornley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.