Tại sao chúng ta có thể giả sử một thuật toán có thể được biểu diễn dưới dạng một chuỗi bit?


17

Tôi đang bắt đầu đọc một cuốn sách về Độ phức tạp tính toán và Máy Turing. Đây là trích dẫn:

Một thuật toán (nghĩa là một máy) có thể được biểu diễn dưới dạng một chuỗi bit một khi chúng ta quyết định một số mã hóa chính tắc.

Khẳng định này được cung cấp như một thực tế đơn giản, nhưng tôi không thể hiểu nó.

Ví dụ: nếu tôi có một thuật toán lấy làm đầu vào và tính toán hoặc:x(x+1)2

int function (int x){
   x = x + 1; 
   return x**2; 
}

Làm thế nào mà điều này có thể được biểu diễn dưới dạng chuỗi bằng bảng chữ cái ?{0,1}*


38
Bạn không biết kiến ​​thức tối thiểu tuyệt đối để hiểu cách văn bản được mã hóa. Hôm nay là một ngày tuyệt vời để học hỏi! joelonsoftware.com/2003/10/08/NH
Eric Lippert

1
Tôi nghĩ OP có thể sẽ đến đây từ một quan điểm khác dựa trên sự mơ hồ trong văn bản được trích dẫn. Tôi đoán OP có nghĩa là 'làm thế nào toàn bộ máy và thuật toán có thể được xây dựng dưới dạng một chuỗi bit', chứ không phải đầu vào cho chính máy Turing. Văn bản được trích dẫn ngụ ý rằng toàn bộ thuật toán có thể tự thực thi, nhưng một bit được mã hóa utf của ngôn ngữ c không nói gì về cách một máy thực sự hoạt động trên chuỗi đó.
Sentinel

3
... Tôi nghĩ rằng tất cả mọi người ở đây đang hiểu sai về nguồn gốc và đưa trò đùa đi quá xa, với cái giá là thiếu kinh nghiệm của Roma. Hầu hết các ý kiến ​​và câu trả lời này đang nói về việc mã hóa văn bản để truyền tùy ý, trong khi trích dẫn nói về việc mã hóa thuật toán để tiêu thụ bởi một máy turing. Câu trả lời (hiện tại) được chấp nhận ít nhất là chạm vào nó trong câu thứ hai.
Izkata

2
@Izkata Tôi không chắc bạn có biết rằng, do tính phổ quát, hai tuyên bố này là tương đương nhau.
Konrad Rudolph

15
Điều buồn cười là để tôi có thể đọc được thuật toán được mã hóa của bạn, nó nhất thiết phải được biến thành một chuỗi bit ngay khi bạn gõ nó. Nó không bao giờ được thể hiện khác nhau - tất cả các cách từ bàn phím của bạn đến màn hình của tôi. Nó có một đại diện không nhị phân chỉ trong tâm trí của chúng tôi; và ở cấp độ sinh lý, khi bạn nhìn vào các khớp thần kinh, thậm chí điều đó còn gây tranh cãi.
Peter - Tái lập Monica

Câu trả lời:


45

Câu trả lời đơn giản và ngây thơ nhất cho câu hỏi của bạn là mã được cung cấp (và mã máy được biên dịch) trên thực tế được biểu diễn dưới dạng chuỗi cú pháp của {0,1} *. Ngoài ra, vì bạn đang nói về máy turing, các chương trình họ chạy là một danh sách các thao tác / hướng dẫn tuyến tính, không có lý do gì chúng không thể được biểu diễn dưới dạng bit / byte.


Làm thế nào chính xác để bạn đại diện cho máy Turing như một danh sách các hướng dẫn? Định nghĩa thông thường là một cái gì đó như thế này .
Svick

@svick Như đã đề cập trong câu trả lời của tôi dưới đây, bạn sử dụng TM phổ quát, lấy mô tả của TM làm đầu vào (được mã hóa theo kiểu phù hợp)
dseuss

@svick Một ngôn ngữ lập trình với các hướng dẫn đơn giản để di chuyển con trỏ qua băng? Tôi tin rằng một ví dụ như vậy có thể là ngôn ngữ lập trình bí truyền Brainfuck . Mã ví dụ
LukStorms

@LukStorms Tôi không nghĩ bạn có thể gọi đó là "máy Turing" nữa.
Svick

52

Bạn đã có một đại diện của chức năng đó như văn bản. Chuyển đổi mỗi ký tự thành giá trị một byte bằng mã hóa ASCII. Sau đó, kết quả là một chuỗi các byte, tức là, một chuỗi các bit, tức là một chuỗi trong bảng chữ cái . Đó là một ví dụ mã hóa.{0,1}*


Chính xác. Và như tôi đã nói ở trên, nó đã xảy ra trong khi Roma viết nó. Ngay cả các glyph mà tôi thấy trên màn hình của mình là các pixel b & w, tức là thông tin nhị phân, được gửi qua kết nối dữ liệu nhị phân từ bộ nhớ nhị phân được kết nối với mạng nhị phân thông qua bộ điều khiển nhị phân. Có thể biểu diễn mọi thuật toán dưới dạng một chuỗi bit không? Hơn thế nữa: không thể tránh khỏi trừ khi bạn giới hạn bản thân trong phương tiện truyền thông tương tự và giao tiếp mặt đối mặt.
Peter - Tái lập lại

@ PeterA.Schneider Sử dụng phương tiện tương tự hoặc trực diện không nhất thiết ngụ ý rằng không có mã hóa rời rạc nhúng. Sử dụng một ngôn ngữ tự nhiên không phải là xa với việc sử dụng một mã hóa rời rạc, phải không?
Jean-Baptiste Yunès

32

Tôi không thể cưỡng lại ...

⡂⡀⣀⢀⣄⡀⣰⡉⡀⠀⡀⡀⣀⠀⢀⣀⢀⣄⡀⡂⢀⣀⡀⢀⢀⡀⠀⡰⣀⠀⣀⠀⡂⡀⣀⢀⣄⡰⡀⢠⠂
⡇⡏⠀⡇⡇⠀⢸⠀⡇⢀⡇⡏⠀⡇⣏⠀⠀⡇⠀⡇⣏⠀⣹⢸⠁⢸⠀⡇⢈⠷⡁⠀⡇⡏⠀⡇⡇⠀⡇⢼⠀
⠁⠁⠀⠁⠈⠁⠈⠀⠈⠁⠁⠁⠀⠁⠈⠉⠀⠈⠁⠁⠈⠉⠁⠈⠀⠈⠀⠱⠉⠀⠉⠀⠁⠁⠀⠁⠈⠱⠁⠘⠄
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢤⡀⡤⠀⣀⣀⣀⠀⢤⡀⡤⠀⠀⢰⠀⠀⢹⠠⠀
⠀⠀⠀⣠⠛⣄⠀⠒⠒⠒⠀⣠⠛⣄⠀⠉⢹⠉⠁⢸⢀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀
⠀⠀⠀⣄⢄⠤⢄⢴⠤⢠⠀⢠⢠⡠⢠⡠⢄⠀⢤⡀⡤⢺⡖⠐⣷⠂⠊⢉⡆
⠀⠀⠀⡇⠸⣍⣉⠸⣀⠸⣀⢼⢸⠀⢸⠀⢸⠀⣠⠛⣄⠀⠀⠀⠀⠀⣴⣋⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

⢱⠀
⢸⠁
⠊

(Các dấu chấm ở trên đại diện cho những cái, số 0 trống).


5
Gây cười (+1) nhưng nó phục vụ để nhấn mạnh bản chất cơ bản tùy ý của mã hóa.
John Coleman

4
Hãy vui vẻ viết trình biên dịch cho việc này :)
Barmar


1
@Barmar Nghe có vẻ như là một thách thức đối với codegolf.stackexchange.com
IMSoP

1
@RomaKarageorgievich đây là chức năng kết xuất thành các ký tự chữ nổi. Đây là một trình bao bọc đơn giản cho phép gọi nó từ dòng lệnh.
leftaroundabout

13

Máy tính của bạn lưu trữ mọi thứ theo trình tự 01, bao gồm cả câu hỏi bạn đã nhập để hỏi nó hoạt động như thế nào. Ví dụ, mỗi chữ cái và ký hiệu được biểu thị bằng 8 bit (Tôi đang nói về việc mọi thứ đã từng như thế nào, ngày nay nó là 16 bit và phức tạp hơn). Bạn có thể thấy chúng ở đây . Chà, họ không hiển thị các bit, mà là các mã thập lục phân và bát phân. Bạn có biết làm thế nào để chuyển đổi một số để đại diện kỹ thuật số của nó?


6
Đó chỉ là 16 byte trên Windows và trong một số thư viện như Qt hoặc ICU, sử dụng UTF-16. Và thậm chí không phải tất cả các chữ cái đều có một đơn vị mã nói chung, ngay cả trong UTF-32, vì vậy chúng có thể dài hơn. Vì vậy, tôi nghĩ tốt hơn là nên gắn bó với ASCII trong cuộc thảo luận này, việc đưa Unicode vào đây sẽ dẫn đến một sự phức tạp.
Ruslan

8

Giả thuyết cơ bản đằng sau khái niệm này là luận án Church-Turing . Có thể khó thấy rằng bất kỳ thuật toán nào cũng có thể được biểu diễn dưới dạng một chuỗi bit, bởi vì thuật ngữ "thuật toán" có thể được nghĩ theo các thuật ngữ rất không chính thức. Trong luận án Church-Turing, họ sử dụng một khái niệm được xác định rất chặt chẽ về thuật toán là gì (và thậm chí sau đó đã có một vài câu hỏi về từ ngữ). Tuy nhiên, thuật ngữ của họ đã nhận được rất nhiều ảnh hưởng mà nó đôi khi người ta lập luận rằng những định nghĩa cho những từ như "thuật toán" rất hiệu quả mà chúng ta chỉ đơn giản là chấp nhận chúng như những định nghĩa.

Church-Turing tuyên bố rằng mọi thuật toán có thể được thực hiện dưới dạng tính toán trên Máy Turing. Cho rằng mô tả của Máy Turing là một tập hợp các giá trị hữu hạn, thật đơn giản để xem cách ánh xạ mô tả này thành một chuỗi các số, sau đó thành một chuỗi 0 và 1.

Như các câu trả lời khác đã đề cập, việc trình bày thuật toán ví dụ của bạn bằng cách sử dụng mã hóa ASCII hoặc các bảng mã khác là chuyện nhỏ.

Tôi nghĩ lý do tại sao cuốn sách của bạn đưa ra tuyên bố này là một thực tế bắt nguồn từ thực tế là nhiều người chỉ đơn giản sử dụng luận điểm Church-Turing làm cơ sở cho định nghĩa của họ về thuật toán. Nếu bạn sử dụng một định nghĩa như vậy, thì rõ ràng là "5 là một con số" bởi vì về cơ bản bạn đã định nghĩa nó như vậy.


9
Luận án Church-Turing không phải là một định lý và nó không liên quan đến bất kỳ định nghĩa nào cho khái niệm thuật toán, đây là một định nghĩa không chính thức. Tôi cũng không thấy sự cần thiết phải viện dẫn luận án Church-Turing cho việc này. Lý do "sâu" tại sao một số đối tượng có thể được biểu diễn dưới dạng chuỗi hữu hạn và một số không thể là một số bộ có thể đếm được và một số thì không.
quicksort

Tôi đang thấy "một thuật toán có thể được mã hóa thành một chuỗi nếu chúng ta chỉ định một phép tiêm giữa các thành phần của đặc tả máy và bộ chuỗi trong một ngôn ngữ." OP thực hiện điều này trong ví dụ của mình, lấy máy đại diện bởi " $ (x + 1) ^ 2 $ " và biểu diễn lại nó dưới dạng một chuỗi trong ngôn ngữ của các hàm C (hoặc BCPL, C ++, et al.) .
Tháp Eric

1
@EricTowers Mà không yêu cầu luận án Church-Turing. Mặt khác, người ta không thể chắc chắn rằng có tồn tại một đặc tả máy của một thuật toán cho tất cả các thuật toán.
Cort Ammon - Tái lập lại

1
Tôi khẳng định rằng "thuật toán [đó] đòi hỏi số lượng biểu tượng vô hạn vô hạn để thể hiện" không thể được thể hiện. Một biểu thức như vậy phải sử dụng vô số ký hiệu, nếu không, nó có thể được biểu thị bằng một ngôn ngữ con nhỏ hơn. Hơn nữa, bất kỳ biểu thức (không ngớ ngẩn) nào trong bảng chữ cái vô hạn đều có một lượng entropy vô hạn trong hầu hết tất cả các biểu tượng của nó, do đó, bất chấp biểu thức (nghĩa là không thể thực sự giao tiếp với người nhận). Tất cả các logic hợp lý từ chối hoạt động trên các chuỗi vô hạn như vậy và tôi không nhận thức được logic vô hạn sẽ cho phép làm việc trên các chuỗi không đếm được.
Tháp Eric

1
Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
DW

4

Tuyên bố này dựa trên sự tồn tại của các TM phổ quát . Đây là những TM cơ bản có thể lập trình có thể mô phỏng bất kỳ TM nào khác với nhiều nhất là chi phí poly. Do đó, chương trình của bạn chỉ đơn giản là một phần của đầu vào được mã hóa dưới dạng số không và số đầu vào.


1
@Discretelizard, tôi không theo dõi bạn. Bất kỳ thuật toán nào đều có thể biểu thị như một đầu vào cho một TM phổ quát. Ngôn ngữ có thể tính toán hoặc không tính toán được; Tôi không quen thuộc với bất kỳ khái niệm tiêu chuẩn nào về khả năng tính toán cho các thuật toán, vì vậy tôi không chắc bạn đang làm gì. Điều gì có nghĩa là có một thuật toán không thể tính toán? Có lẽ bạn đang nghĩ về các thuật toán không nhất thiết phải chấm dứt? Nhưng một TM phổ quát vẫn có thể chạy các thuật toán như vậy.
DW

@Discretelizard Tôi cũng không theo dõi bạn. Có thể chạy được trên máy Turing về cơ bản là định nghĩa của thuật toán. Tôi cho rằng bạn có thể nói về một "thuật toán", giả sử, một máy Turing có lời tiên tri cho vấn đề tạm dừng nhưng thông thường, "thuật toán" có nghĩa là "điều bạn có thể làm trên máy Turing".
David Richerby

@DavidR Richby Đúng, định nghĩa thực tế của thuật toán là nghiêm ngặt hơn, tôi cho rằng. Nhưng câu hỏi này liên quan đến lý do tại sao chúng tôi áp đặt một hạn chế nhẹ nhàng hơn nhiều và nói rằng có một hạn chế thậm chí còn mạnh mẽ hơn không phải là hướng dẫn, theo ý kiến ​​của tôi.
Thằn lằn rời rạc

4

Chà, hãy nói về các thuật toán không thể được biểu diễn dưới dạng một chuỗi bit hữu hạn cho bất kỳ loại mã hóa nào.

Hãy để tôi gõ một thuật toán như vậy cho bạn ... À, nhưng nếu tôi làm điều đó, tôi có thể biểu diễn thuật toán đó bằng mã hóa văn bản đã gõ của mình.

Làm thế nào về việc đại diện cho thuật toán của tôi bằng cách sử dụng một số 'phương tiện tương tự', nói theo vị trí của một vài đồng xu trên bàn của tôi. Mặc dù vị trí của những đồng tiền đó có thể được mô hình hóa bằng một số số thực (có thể trong một số mã hóa không thể biểu diễn chính xác), toàn bộ mô tả này một lần nữa có thể được coi là một đại diện cho thuật toán của tôi và có thể được mã hóa lại thành chuỗi bit!

Tôi hy vọng rằng những ví dụ này cho thấy rõ rằng nếu một số thuật toán không thể được biểu diễn bằng một chuỗi bit hữu hạn thì chúng ta không có phương tiện nào để mô tả thuật toán này cả!

Vì vậy, tại sao chúng ta sẽ xem xét sự tồn tại của một cái gì đó chúng ta không thể nói đến? Có lẽ thú vị cho triết học, nhưng không phải cho khoa học. Do đó, chúng tôi định nghĩa khái niệm thuật toán sao cho nó có thể được biểu diễn bằng chuỗi bit, vì vậy ít nhất chúng tôi biết rằng chúng tôi có thể nói về tất cả các thuật toán.


Mặc dù câu trả lời ở trên cho câu hỏi, tôi nghĩ rằng sự nhầm lẫn về ví dụ được đưa ra chủ yếu là do thực tế là một biểu diễn chỉ cần biểu diễn duy nhất một số thuật toán. Cách thức biểu diễn không cần liên quan đến các tính toán thực tế được thuật toán gọi! Điều này rất hữu ích, vì nó có nghĩa là chúng ta cũng có thể đại diện cho các thuật toán không thể tính toán!


rAr

1
ArR


r

@Raphael Có, và? Không có gì ngạc nhiên khi viết ra một số lượng thuật toán không thể đếm được là không thể. Và một lần nữa, bạn tuyên bố rằng bạn "diễn đạt" một số thuật toán không thể viết ra. Tôi không hiểu ý của bạn là "thể hiện", nhưng dường như ít nhất nó cũng bao hàm sự đại diện. Vì yêu cầu của tôi bắt đầu với giả định rằng thuật toán không được trình bày, tôi không thấy điều này mâu thuẫn với yêu cầu của tôi như thế nào.
Thằn lằn rời rạc

2

Một cách khác để thấy điều này là thông qua lý thuyết thông tin. Tất cả các mã hóa thông tin / câu hỏi có ý nghĩa / hữu ích có thể được tạo thành "chuỗi" nhị phân.

Phần lớn lĩnh vực đi vào câu hỏi, "cách nào để hỏi số lượng câu hỏi trung bình ít nhất để truyền đạt một thông tin có ý nghĩa?" Trong thực tế, điều này giống như "cách tiếp cận tối ưu để hỏi số câu hỏi có / không có ít nhất để hiểu những gì được truyền đạt hoặc nói?"

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.