Chương trình máy tính so với thuật toán


8

Người ta nói rằng một chương trình bao gồm các thuật toán, tuy nhiên nếu chúng ta đề cập đến định nghĩa của chúng, thuật toán là một chuỗi các hướng dẫn được viết để thực hiện một tác vụ được chỉ định và một chương trình máy tính cũng là một chuỗi các hướng dẫn để thực hiện (một số) tác vụ với máy tính.

Vậy thì điều gì làm cho một chương trình khác với một thuật toán? nó là một loại thuật toán quá?

Trong thực tế, tôi tìm các định nghĩa chính thức cho một thuật toán và một chương trình máy tính để tôi có thể phân biệt chúng với nhau hoặc xác định các thuật toán trong một chương trình.

Cập nhật : Tôi đã nhận thấy trên Wikipedia bởi một định nghĩa không chính thức (ít nhất là về mặt cú pháp), bất kỳ chương trình nào cũng là một thuật toán.

Một định nghĩa không chính thức có thể là "một tập hợp các quy tắc xác định chính xác một chuỗi các hoạt động." trong đó bao gồm tất cả các chương trình máy tính , bao gồm các chương trình không thực hiện tính toán số. Nói chung, một chương trình chỉ là một thuật toán nếu cuối cùng nó dừng lại .

Câu trả lời:


11

Tôi sẽ đưa ra câu trả lời giống như tôi đã đưa ra lần trước câu hỏi này.

Trước tiên, hãy hiểu rằng không có định nghĩa chính thức tốt về "thuật toán" tại thời điểm viết. Từ khóa ở đây là "chính thức".

Tuy nhiên, có những người thông minh làm việc trên nó.

Những gì chúng ta biết là bất kể "thuật toán" là gì, nó nằm ở đâu đó giữa "hàm toán học" và "chương trình máy tính".

Một hàm toán học là khái niệm chính thức của ánh xạ từ đầu vào đến đầu ra. Vì vậy, ví dụ, "sort" là ánh xạ giữa một chuỗi các mục có thể sắp xếp và một chuỗi các mục có thể sắp xếp cùng loại, ánh xạ từng chuỗi theo trình tự được sắp xếp. Hàm này có thể được thực hiện bằng các thuật toán khác nhau (ví dụ: sắp xếp hợp nhất, sắp xếp heap). Lần lượt, mỗi thuật toán có thể được thực hiện bằng các chương trình khác nhau (thậm chí được cung cấp cùng ngôn ngữ lập trình).

Vì vậy, cách xử lý tốt nhất mà chúng ta có về "thuật toán" là gì, đó là một loại lớp tương đương trên các chương trình, trong đó hai chương trình tương đương nhau nếu chúng thực hiện "về cơ bản giống nhau". Bất kỳ hai chương trình thực hiện cùng một thuật toán đều phải tính toán cùng một hàm, nhưng điều ngược lại là không đúng.

Tương tự, có một lớp tương đương giữa các thuật toán, trong đó hai thuật toán tương đương nếu chúng tính toán cùng một hàm toán học.

Phần khó trong tất cả những điều này là cố gắng nắm bắt những gì chúng ta muốn nói là "về cơ bản là cùng một thứ".

Có một số điều rõ ràng mà chúng ta nên bao gồm. Ví dụ, hai chương trình về cơ bản là giống nhau nếu chúng chỉ khác nhau bởi các lần đổi tên. Hầu hết các mô hình ngôn ngữ lập trình đều có các khái niệm nguyên gốc về "tính tương đương" (ví dụ: giảm beta và chuyển đổi eta trong phép tính lambda), vì vậy chúng ta cũng nên đưa chúng vào.

Bất cứ mối quan hệ tương đương nào chúng ta chọn, điều này cho chúng ta một số cấu trúc. Các thuật toán tạo thành một thể loại bởi thực tế rằng chúng là thể loại thương số của các chương trình. Một số quan hệ tương đương thú vị được biết là làm phát sinh các cấu trúc phân loại thú vị; ví dụ, phạm trù thuật toán đệ quy nguyên thủy là một đối tượng phổ quát trong phạm trù các phạm trù. Bất cứ khi nào bạn thấy cấu trúc thú vị như thế, bạn biết rằng dòng điều tra này có thể sẽ hữu ích.


Cảm ơn bạn đã trả lời chính xác của bạn, chỉ là một câu hỏi khác. Nếu chúng tôi xem xét bất kỳ chương trình nào, bất kể nó làm gì, họ vẫn nhận được một số đầu vào và làm theo một số hướng dẫn, và đưa ra một số kết quả khi chúng được thực thi. Họ thậm chí có thể không giải quyết bất kỳ vấn đề nào (như chúng ta gọi), nhưng nó vẫn là một ánh xạ. họ có thể được biết thuật toán, ý tôi là bất kỳ chương trình nào?
Ahmad

1
Nếu tôi đang đọc chính xác, bạn đang hỏi liệu một định nghĩa chính thức về "thuật toán" nên hay không nên mang theo điều kiện rằng nó phải "hữu ích". Tôi sẽ nói "không", nếu chỉ vì không thể chính thức hóa quan niệm đó.
Bút danh

lấy làm tiếc! Tiếng Anh của tôi không tốt, sau đó bạn nói "không" với cái gì? Bạn thừa nhận rằng không thể chính thức hóa tính hữu dụng của một chương trình và theo định nghĩa, bất kỳ chương trình nào cũng là một thuật toán? hoặc bạn nói rằng chúng tôi cần xem xét tính hữu dụng bên cạnh thuật toán?
Ahmad

1
Tôi không nghĩ rằng một định nghĩa chính thức về "thuật toán" nên yêu cầu nó phải hữu ích, bởi vì "hữu ích" không thể được định nghĩa chính thức.
Bút danh

Câu trả lời của bạn là hữu ích nhất trong chủ đề này +1. Tôi tin rằng "về cơ bản là cùng một thứ", bạn có nghĩa là "tương đương về mặt ngữ nghĩa". Ngoài ra, tôi nghĩ rằng tất cả các chương trình về cơ bản là các thuật toán (như OP nói), vì tất cả các chương trình là các triển khai ánh xạ một số đầu vào thành một số đầu ra, ngay cả khi ánh xạ này được ẩn. Như bạn đã nêu, tất cả phụ thuộc vào quan điểm.
doubleOrt

7

Cuối cùng, sự khác biệt là một trong những quan điểm. Chương trình là một chương trình: một chuỗi các câu lệnh trong một số ngôn ngữ, có thể là ngôn ngữ lập trình hoặc hướng dẫn cấp độ máy. Các thuật toán thường được mô tả ở mức cao hơn so với hướng dẫn máy hoặc câu lệnh ngôn ngữ lập trình nhưng mức độ cao là khá linh hoạt. Ví dụ: trong một số trường hợp, "Sắp xếp mảng, sau đó nhìn vàokphần tử thứ "là một mô tả hoàn toàn tốt về thuật toán tìm kiếm kđối tượng lớn nhất trong một mảng; trong các trường hợp khác, bạn có thể muốn chỉ định chi tiết hơn nhiều về cách sắp xếp diễn ra.

Như bạn nói, một thuật toán là một cái gì đó giống như "một quy trình hoặc bộ quy tắc được tuân theo trong các tính toán hoặc các hoạt động giải quyết vấn đề khác, đặc biệt là bởi một máy tính." Vì vậy, theo nghĩa đen, mỗi chương trình một thuật toán. Thông thường, mặc dù, chúng ta nói về các chương trình thực hiện các thuật toán. Thông thường, khi mô tả một thuật toán, chúng tôi tránh chi tiết cấp thấp về chính xác cách thức mọi thứ được thực hiện, giả sử rằng một lập trình viên có năng lực sẽ có thể thực hiện nó theo ngôn ngữ mà họ chọn.


Tôi nghĩ rằng độ chính xác của thuật toán có liên quan đến khái niệm toán học, lambda-tính toán hoặc máy Turing, vẫn không biết ngôn ngữ trừu tượng đó là gì? toán học hoặc một ngôn ngữ tự nhiên với nhiều phát biểu mờ nhạt
Ahmad

8
@AHmad Thuật toán là một khái niệm không chính thức. Nó không có định nghĩa chính thức. Theo một nghĩa nào đó, nó giống như một bằng chứng toán học, khác với một bằng chứng chính thức trong một hệ thống chứng minh chính thức. Chúng tôi tin rằng bằng chứng không chính thức có thể được "bổ sung" thành bằng chứng chính thức trong bất kỳ hệ thống chứng minh chính thức nào (đủ mạnh), giống như mọi thuật toán có thể được thực hiện đầy đủ trong bất kỳ ngôn ngữ lập trình (Turing-Complete) nào.
Yuval Filmus

5

Các thuật toán trong tư duy hoàn chỉnh Turing thường được chỉ định bởi đầu vào và đầu ra. Các chương trình thực sự làm nhiều hơn; họ

  • giao tiếp với người dùng
  • giao tiếp với các máy khác
  • phản ứng với môi trường
  • không chấm dứt và vẫn hữu ích,

và hơn thế nữa. Những điều này thường không được xem xét trong các thuật toán hoặc lý thuyết tính toán, nhưng rất cần thiết cho hầu hết các chương trình.


Đây là một điểm rất tốt. Nhưng bạn có nghĩa là "thường được chỉ định là phương tiện để ánh xạ đầu vào thành đầu ra"? Chỉ cần xác định đầu vào và đầu ra là không đủ: ví dụ: mergesort và quicksort tạo ra cùng một đầu ra từ bất kỳ đầu vào nào nhưng không được coi là cùng một thuật toán.
David Richerby

@DavidR Richby Tôi đã nghĩ đến đặc tả theo nghĩa PL; chúng tôi không chỉ định bất cứ điều gì khác, vì vậy các thuật toán có thể không làm gì khác. Tất nhiên, chúng ta phải đưa ra nhiều hơn đặc điểm kỹ thuật để mô tả một thuật toán cụ thể.
Raphael

Điểm hay, nhưng nếu chúng tôi thừa nhận rằng cuối cùng thì bất kỳ chương trình nào cũng là một thuật toán, tôi không biết những vấn đề bạn giải quyết được đo lường như thế nào về một thuật toán. Có lẽ là một chủ đề AI?!
Ahmad

Ai sẽ thừa nhận điều đó, và tại sao? Và bạn có ý nghĩa gì khi đo ở đây? (Và tôi chắc chắn không nhìn thấy góc AI ở đây.)
Raphael

@Raphael Tôi có thể thừa nhận nó (bằng cách nhìn vào cú pháp, tất cả các chương trình trông giống nhau, chúng là các chuỗi hướng dẫn hoặc ánh xạ đầu vào thành đầu ra), tôi chỉ không biết làm thế nào các tính năng khác của chương trình (những người bạn đã giải quyết) có thể được trích từ định nghĩa đó. ví dụ: sự khác biệt giữa sắp xếp nhanh và MATLAB hoặc Windows Media Player !!
Ahmad

2
  • Một thuật toán là một cách tiếp cận có hệ thống để giải quyết một vấn đề cụ thể.

  • Một chương trình là một tập hợp các hướng dẫn cho một máy tính để làm theo.

Do đó, một chương trình thậm chí không cần phải giải quyết vấn đề. Tôi chắc rằng tất cả chúng ta có thể nghĩ về một số chương trình đã gây ra nhiều vấn đề hơn những gì họ đã giải quyết. Một chương trình có thể là một triển khai của nhiều thuật toán hoặc một thuật toán có thể được thực hiện bằng cách vá nhiều chương trình lại với nhau. Một chương trình thậm chí có thể không chứa thuật toán. Ví dụ, chương trình trống chỉ đơn giản là thoát, hoặc thậm chí là Hello World, có thể được coi là chương trình không có thuật toán.

Vì một thuật toán giải quyết một vấn đề cụ thể, nó được tập trung vào một khái niệm cụ thể. Do đó, một thuật toán cung cấp các bước trừu tượng để xử lý một bộ thông tin liên quan thành một bộ thông tin dẫn xuất khác. Một chương trình không yêu cầu các thành phần của nó phải liên quan đến khái niệm. Ví dụ, một chương trình có thể có một quả trứng Phục sinh, nhưng một thứ gọi là thuật toán đúng thì không nên. Bạn có thể có virus hoặc trojan ẩn nấp trong một chương trình, nhưng không phải trong thuật toán. Thuật toán gần nhất có thể đạt được điều này sẽ giống như một cửa hậu trong thuật toán mã hóa, trong đó lỗ hổng được lên kế hoạch là một phần của mối quan hệ thông tin được thiết lập bởi thuật toán.

Và cuối cùng, một chương trình, vì nó là viết tắt của một chương trình máy tính, về mặt tự nhiên đòi hỏi phải có một máy tính. Một thuật toán không. Nếu tôi tách riêng áo sơ mi, quần và tất ra khỏi đồ giặt trước khi cất chúng đi thì đây là một thuật toán. Nó liên quan đến các đầu vào và đầu ra liên quan, có thể được mô tả trong biểu đồ dòng chảy và có các hậu quả có thể tính toán về mặt hiệu quả (ví dụ: số lượng quần áo phải được so sánh để tìm vớ phù hợp).


2

Một thuật toán là một khái niệm hoặc ý tưởng. Đó là một cách tiếp cận chính thức để giải quyết một vấn đề. Các thuật toán có thể được thể hiện hoặc thực hiện bằng nhiều ngôn ngữ lập trình (thông thường, hầu như mọi ngôn ngữ đều có thể thực hiện bất kỳ thuật toán nào). Đối với một số ví dụ, bạn nên đọc qua Thuật toán sắp xếp trong Wikipedia.

Một chương trình máy tính là một chuỗi các hướng dẫn cụ thể trong một ngôn ngữ lập trình cụ thể. Một chương trình có thể chứa việc thực hiện nhiều thuật toán. Excel là một chương trình, nhưng khả năng sắp xếp của nó là biểu hiện của thuật toán.


1

Một thuật toán là một tập hợp các bước hoạt động độc lập được thực hiện để giải quyết một vấn đề cụ thể hoặc một lớp các vấn đề.

Chương trình máy tính là một chuỗi các hướng dẫn tuân thủ các quy tắc của ngôn ngữ lập trình cụ thể, được viết để thực hiện một tác vụ được chỉ định với máy tính.

Các thuật toán là chung và phải được dịch sang một ngôn ngữ lập trình cụ thể (được triển khai).


1
Nhưng toàn bộ vấn đề là một chương trình (mã nguồn của nó hoặc nhị phân được biên dịch) "một tập hợp các bước hoạt động độc lập được thực hiện để giải quyết một vấn đề cụ thể hoặc một loại vấn đề."
David Richerby 15/2/2015

Nhưng nó không phải là. Một chương trình không phải là các hoạt động đó, mà là một triển khai của chúng: một cái gì đó thực thi chúng trong một bối cảnh cụ thể. Ví dụ, sorttiện ích Unix không phải là thuật toán sắp xếp, nó sử dụng thuật toán sắp xếp.
rebierpost

1

Một thuật toán đang thể hiện ý tưởng hoặc giải pháp của chúng tôi cho vấn đề cụ thể theo cách tiếp cận từng bước. Nó chỉ là giải quyết vấn đề và cách tiếp cận dễ hiểu của con người không dành cho hệ thống máy tính

Chương trình là hướng dẫn từng bước được thực hiện để giải quyết vấn đề bằng hệ thống máy tính. Nó phải được hiểu bởi không chỉ lập trình viên mà cả máy tính.


Chào mừng bạn đến với Sàn giao dịch Khoa học Máy tính. Vui lòng đọc cs.stackexchange.com/tour.if bạn chưa làm như vậy.
babou

1

Các câu trả lời khác ở đây, tôi nghĩ, bỏ lỡ một điểm quan trọng. Định nghĩa của 'thuật toán' mà tôi được dạy bao gồm yêu cầu rằng thủ tục tạm dừng trên tất cả các đầu vào . Đương nhiên, điều đó làm cho 'chương trình' trở thành một lớp thủ tục rộng hơn 'thuật toán', vì một số chương trình tạm dừng trên tất cả các đầu vào và các chương trình khác thì không.


Đây không phải là phổ quát. Định nghĩa tôi được dạy không bao gồm yêu cầu đó.
rebierpost

1

Dưới đây là một số cách để vẽ ranh giới giữa thuật toán và chương trình:

Mục đích có ý nghĩa

Các chương trình được viết với một mục đích và thể hiện nỗ lực để đạt được mục tiêu. Các thuật toán có thể được xem là công cụ để đạt được mục tiêu đó.

Ví dụ, một tuốc nơ vít là một thuật toán để sửa đổi trạng thái của một ốc vít nhưng bản thân tuốc nơ vít không có mục đích để làm điều đó. Mục đích là trong đầu của người vận hành tuốc nơ vít giữ chương trình như đưa lên kệ.

Logic kinh doanh

Điểm này liên quan mạnh mẽ đến mục đích của một chương trình. Vì các chương trình có mục đích nên chắc chắn chúng có các bit của thế giới thực trong đó như ngày, phép đo, công nghệ, tên cụ thể, v.v.

Mặt khác, các thuật toán không chứa logic kinh doanh cũng như các bit của thế giới thực và thay vì hoạt động trên các giá trị cụ thể hoạt động trên các biến.

Ví dụ, theo nghĩa này, bạn có thể so sánh một hàm toán học như f(x) = x^2 là trừu tượng và hoạt động trên các biến với một công thức nấu ăn có chứa các giá trị chính xác (ít nhất là một để tham khảo).

Kết quả

Điểm này liên quan mạnh mẽ đến logic kinh doanh của một chương trình. Một tác nhân (như người dùng trình duyệt web) sử dụng kết quả của một chương trình không phải là kết quả của thuật toán.

Ví dụ, người tiêu dùng của một công thức nấu ăn tiêu thụ bánh không phải là kết quả của việc đánh kem hoặc lò sưởi.


Có lẽ sẽ tốt hơn khi nói rằng tuốc nơ vít không có ý định vặn ốc vít? Trong tiếng Anh hàng ngày, chúng tôi chắc chắn sẽ nói rằng một tuốc nơ vít không có mục đích quay vít: xoay vít là điều chính xác nó được thiết kế để làm.
David Richerby

Ngoài ra, tôi không chắc ý của bạn là "logic kinh doanh" (nhiều chương trình không liên quan gì đến kinh doanh) hoặc bằng cách nói rằng thuật toán "không chứa logic kinh doanh cũng không phải bit của thế giới thực". Ví dụ, tôi hoàn toàn có thể diễn đạt một thuật toán đường đi ngắn nhất về mặt thị trấn và đường hơn là các đỉnh và cạnh. Không phải thuật toán sau đó "chứa ... bit của thế giới thực" sao?
David Richerby

@DavidR Richby, bạn nói đúng, cụm từ của tôi rất mơ hồ. Ý tôi là một mục đích có ý nghĩa Xoay vít để vặn ốc vít là vô nghĩa cũng như sắp xếp một mảng không bao giờ được sử dụng. Theo logic kinh doanh, ý tôi là tất cả logic chương trình ngoại trừ logic tiện ích và công nghệ stack stack, tức là tất cả logic thực sự thực hiện mục đích của chương trình, tức là logic kinh doanh của việc nướng bánh là trộn nguyên liệu và nướng và không bao gồm học cách trộn hoặc nướng ( được sử dụng lại logic tiện ích trong trường hợp này).
Robert Mugattarov

@DavidR Richby, đối với các bit của thế giới thực , ý tôi là hiện thực hóa, tức là một chương trình không giống như một thuật toán phải giao tiếp theo cách nào đó với thế giới vật lý. Mặt khác, một thuật toán có thể là một khái niệm toán học thuần túy.
Robert Mugattarov

1

Tôi khá chắc chắn rằng các câu trả lời khác đủ tốt để dẫn đầu nhưng đây là cách tôi thấy sự khác biệt giữa thuật toán và chương trình

  • Một thuật toán bao gồm chỉ đơn giản là các bước (độc lập với máy) cần được tuân theo trong một số thứ tự để giải quyết vấn đề.

  • Một chương trình là một tập lệnh cho một loại máy cụ thể để đặt một thuật toán để thực hành .

Ví dụ.

Giả sử bạn có một thuật toán có một bước để đến một địa điểm cụ thể trước khi thực hiện một bước khác. Làm thế nào bước tiếp cận này sẽ không được xác định chính xác. Bạn có thể chọn đi bộ hoặc chạy hoặc đi xe buýt để thực hiện nhưng điều đó phụ thuộc vào cách bạn chọn thực hiện nó (đó là chương trình của bạn).

Bạn có thể nói rằng một thuật toán là một sự trừu tượng hóa của một chương trình tức là thiếu các chi tiết chính xác nhưng đưa ra một kế hoạch để làm một cái gì đó.

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.