Mô hình tính toán nào là người giỏi nhất?


41

Năm 1937 Turing đã mô tả một máy Turing. Kể từ đó, nhiều mô hình tính toán đã được giải mã trong nỗ lực tìm kiếm một mô hình giống như một máy tính thực sự nhưng vẫn đủ đơn giản để thiết kế và phân tích các thuật toán.

Kết quả là, chúng tôi có hàng tá thuật toán, ví dụ: vấn đề SORT cho các mô hình tính toán khác nhau. Thật không may, chúng tôi thậm chí không thể chắc chắn rằng việc triển khai thuật toán có thời gian chạy O (n) trong RAM từ với các hoạt động vectơ bit được phép sẽ chạy nhanh hơn so với triển khai thuật toán có thời gian chạy O (n⋅logn) trong một RAM từ (tất nhiên tôi chỉ nói về việc triển khai "tốt").

Vì vậy, tôi muốn hiểu mô hình hiện tại nào là "tốt nhất" để thiết kế thuật toán và tôi đang tìm kiếm một cuộc khảo sát cập nhật và chi tiết về các mô hình tính toán, đưa ra những ưu và nhược điểm của mô hình và sự gần gũi của chúng với thực tế.


1
Đăng chéo trên MathOverflow ( mathoverflow.net/questions/44558/ ), mặc dù được chuyển hướng ở đây.
Dave Clarke

@Tatiana, Câu hỏi hay, "ý nghĩa nhất" của bạn là gì? Bạn có nghĩa là một mô hình với thời gian chạy lý thuyết gần với thời gian chạy "thực"?
Mohammad Al-Turkistany

8
Nếu bạn đang tìm cách mô hình chính xác thời gian chạy "thực", thì có vẻ như điều quan trọng là phải mô hình chính xác bộ đệm. Đặc biệt, điện toán hiện đại có nhiều lớp bộ nhớ đệm (CPU, RAM, Đĩa, v.v.) với một số lớp có độ lớn chậm hơn các lớp khác; không có vấn đề gì về thời gian chạy "thực" của thuật toán được xác định bởi số lần bỏ lỡ bộ đệm. Thông thường, tôi đã nghe nói rằng một lý do khiến các phương pháp rào cản trong lập trình tuyến tính hoạt động rất tốt mặc dù chúng đảm bảo về mặt lý thuyết kém là vì chúng thường khá hiệu quả về bộ nhớ cache.
mhum

4
Theo như tôi có thể nói, như mhum nói, sự khác biệt lớn nhất về thời gian chạy dự đoán trong mô hình RAM từ và thời gian chạy thực thường phát sinh do truy xuất dữ liệu ... các biến sai nằm trong bộ nhớ đệm và thời gian truy xuất chậm lại xuống rất nhiều vì điều này. Đã có một số nỗ lực để mô hình hóa điều này với mô hình bộ nhớ phân cấp lý thuyết và tôi không tin rằng bất kỳ nỗ lực nào trong số này đã rất thành công, vì các mô hình cuối cùng quá phức tạp để dễ dàng làm việc.
Peter Shor

2
Nếu bạn có một thuật toán mà bạn nghĩ có thể hữu ích trong thực tế và bạn muốn thấy nó thực sự được sử dụng, điều tốt nhất bạn có thể làm để đảm bảo điều này là triển khai nó hoặc nhờ người khác thực hiện nó (ngay cả khi nó không tốt đủ thực hiện để được tích hợp vào phần mềm thực tế). Đối với một trường hợp nghiên cứu trong trường hợp này, hãy nhìn vào lịch sử của thuật toán nén dữ liệu LZW. Trong thực tế, có lẽ không có điểm nào trong việc cố gắng tìm hiểu làm thế nào bộ nhớ đệm ảnh hưởng đến thuật toán trừ khi đó là điều mà mọi người quan tâm thực hiện; nếu không sẽ không ai chú ý đến kết quả của bạn.
Peter Shor

Câu trả lời:


30

Tôi luôn coi mô hình RAM Word tiêu chuẩn là "tốt nhất" theo nghĩa của bạn. Mọi người đã học lập trình bằng một ngôn ngữ như C (hoặc bất kỳ tương đương lỏng lẻo nào như Java, v.v.) đều có chính xác mô hình này khi họ nghĩ về máy tính.

Tất nhiên, đôi khi bạn cần khái quát hóa tùy thuộc vào chế độ mà bạn làm việc. Mô hình bộ nhớ ngoài là một điều quan trọng cần ghi nhớ. Nó không chỉ áp dụng khi bạn làm việc với đĩa mà còn hiểu (buộc bạn phải quan tâm) bộ đệm. Tất nhiên, việc xử lý nó quá nghiêm trọng cũng có thể dẫn đến kết quả vô nghĩa, vì mô hình bộ nhớ ngoài thuần túy không tính toán được. Một khái quát khác của RAM Word là song song, nhưng hiện tại tất cả chúng ta đều có một chút bối rối :)

O(n)O(nlgn)nn

Một nhận xét cuối cùng về thuật toán và "thực tế": luôn ghi nhớ những gì bạn đang cố gắng đạt được. Khi chúng tôi làm việc trong các thuật toán, chúng tôi đang cố gắng giải quyết các vấn đề khó khăn nhất hiện có (ví dụ SAT trên 50 biến hoặc sắp xếp một tỷ số). Nếu bạn đang cố gắng sắp xếp 200 số hoặc giải SAT trên 20 biến, bạn không cần bất kỳ thuật toán ưa thích nào. Đó là lý do tại sao hầu hết các thuật toán trong thực tế là loại tầm thường. Điều này không nói lên điều gì xấu về nghiên cứu thuật toán - chúng ta chỉ quan tâm đến 1/1000 bất thường trong số những vấn đề thực sự xảy ra là khó khăn ...


Cảm ơn câu trả lời của bạn. Tôi muốn hiểu, những khái quát nào đáng để thêm vào RAM từ. Chúng ta có thể mô tả một mô hình, sẽ bao gồm tất cả các thủ thuật như hoạt động vectơ bit, song song, lưu trữ và vẫn đơn giản không?
Tatiana Starikovskaya

10

Không có một mô hình tính toán nào hoàn toàn thỏa đáng để phân tích các thuật toán một cách đáng buồn, ngay cả trong những gì người ta có thể xem là một thiết lập truyền thống. Đó là giả sử tất cả dữ liệu có thể truy cập dễ dàng và không gian làm việc thực sự không bị ràng buộc.

Máy Turing nhiều băng, chắc chắn về mặt lý thuyết được chỉ định rõ ràng và nhiều thuật toán đã được thiết kế và phân tích trong mô hình này trong nhiều năm qua. Tuy nhiên, đối với một số người, nó không liên quan chặt chẽ đến việc máy tính thực sự hoạt động như thế nào để thực sự là một mô hình tốt để sử dụng trong thế kỷ 21. Mặt khác, mô hình RAM từ đã trở nên phổ biến và dường như nắm bắt chính xác hơn hoạt động của các máy tính hiện đại (hoạt động trên các từ không phải bit, truy cập thời gian liên tục vào các vị trí bộ nhớ). Tuy nhiên, có những khía cạnh ít hơn lý tưởng. Ví dụ, không có mô hình RAM một từ. Trước tiên, người ta phải xác định thao tác nào trên các từ được phép trong thời gian không đổi. Có nhiều lựa chọn cho điều này mà không có câu trả lời duy nhất được chấp nhận. Thứ hai, kích thước từ w thường được đặt để tăng với kích thước đầu vào (ít nhất là nhanh như log (n)) để cho phép bất kỳ mục nào trong bộ nhớ được xử lý bằng số lượng từ không đổi. Điều này có nghĩa là người ta phải tưởng tượng một lớp máy vô hạn mà thuật toán của bạn đang chạy hoặc thậm chí tệ hơn, đó là máy thay đổi khi bạn cung cấp cho nó nhiều dữ liệu hơn. Đây là một suy nghĩ khó hiểu cho những gì tinh khiết nhất trong số các học sinh của tôi ít nhất. Cuối cùng, bạn nhận được một số kết quả phức tạp đáng ngạc nhiên với mô hình RAM từ có thể không liên quan với những người học khi còn là sinh viên. Ví dụ, phép nhân hai số n bit là thời gian O (n) trong mô hình này và chỉ cần đọc trong chuỗi n bit là một hoạt động thời gian tuyến tính bất ngờ. Điều này có nghĩa là người ta phải tưởng tượng một lớp máy vô hạn mà thuật toán của bạn đang chạy hoặc thậm chí tệ hơn, đó là máy thay đổi khi bạn cung cấp cho nó nhiều dữ liệu hơn. Đây là một suy nghĩ khó hiểu cho những gì tinh khiết nhất trong số các học sinh của tôi ít nhất. Cuối cùng, bạn nhận được một số kết quả phức tạp đáng ngạc nhiên với mô hình RAM từ có thể không liên quan với những người học khi còn là sinh viên. Ví dụ, phép nhân hai số n bit là thời gian O (n) trong mô hình này và chỉ cần đọc trong chuỗi n bit là một hoạt động thời gian tuyến tính bất ngờ. Điều này có nghĩa là người ta phải tưởng tượng một lớp máy vô hạn mà thuật toán của bạn đang chạy hoặc thậm chí tệ hơn, đó là máy thay đổi khi bạn cung cấp cho nó nhiều dữ liệu hơn. Đây là một suy nghĩ khó hiểu cho những gì tinh khiết nhất trong số các học sinh của tôi ít nhất. Cuối cùng, bạn nhận được một số kết quả phức tạp đáng ngạc nhiên với mô hình RAM từ có thể không liên quan với những người học khi còn là sinh viên. Ví dụ, phép nhân hai số n bit là thời gian O (n) trong mô hình này và chỉ cần đọc trong chuỗi n bit là một hoạt động thời gian tuyến tính bất ngờ.

Đã nói tất cả những điều đó, nếu bạn chỉ muốn biết liệu thuật toán của bạn có khả năng chạy nhanh hay không, thì rất có thể sẽ làm được :-)


2
Tôi nghĩ rằng nếu bạn đang tránh các hoạt động số học theo mô hình bit hoặc mô hình từ nhằm tránh sự cố "máy phát triển với kích thước đầu vào", nhưng vẫn sử dụng RAM hoặc máy con trỏ có chi phí thống nhất, thì bạn chỉ đang tự lừa mình: những mô hình khác có cùng một vấn đề. Làm thế nào để họ lập chỉ mục đầu vào của họ? Câu trả lời là: máy tính thực sự hết bộ nhớ, nhưng mặc dù việc thiết kế thuật toán cho chúng vẫn thuận tiện hơn khi cho rằng chúng là RAM (hoặc thậm chí tốt hơn để sử dụng mô hình chiếm chi phí phân cấp bộ nhớ) so với giả định một DFA.
David Eppstein

4
Một mô hình RAM mà Knuth thảo luận, ví dụ, tốn thời gian để tìm kiếm một địa chỉ với các bit w và tương tự thời gian để thêm hai số bit w (đây là cách anh ta nhận được Theta (n log n) để nhân hai n số -bit trong mô hình RAM mà không có bất kỳ hoạt động thời gian liên tục nào trên các từ). Thật thú vị khi các mô hình được chấp nhận rộng rãi nhất đã thay đổi trong 20 năm qua và có bao nhiêu mô hình không bao giờ được thảo luận nữa.
Raphael

8

Mô hình chỉ là mô hình. Tôi sẽ không đẩy nó đi quá xa; họ nói điều gì đó về một số khía cạnh của thuật toán của bạn, nhưng không phải là toàn bộ sự thật.

Tôi sẽ đề nghị bạn chỉ cần sử dụng mô hình RAM từ tiêu chuẩn trong phân tích của bạn thực hiện thuật toán và xem nó hoạt động tốt như thế nào trong thực tế.

(Trên thực tế chỉ cần thực hiện thuật toán của bạn mà không bao giờ chạy, nó cho bạn biết rất nhiều về nó ... Đối với một điều, sau đó nó có thể thực hiện được.)


3
Vâng, tôi có hai phản đối. Đầu tiên, không có nhiều nhà lý thuyết thực hiện các thuật toán và chúng ta phải so sánh chúng bằng cách nào đó. Thứ hai, tôi muốn hiểu những tính năng nào của máy tính mà chúng ta có thể thêm vào một mô hình không làm mất đi tính đơn giản của nó.
Tatiana Starikovskaya

11
Giải pháp đề xuất của David Johnson cho việc này là để có nhiều người thực hiện các thuật toán hơn - ông đã bắt đầu ALENEX và các thách thức DIMACS để giải quyết vấn đề này. Tôi có một số kinh nghiệm với điều này là tốt. Với Ken Clarkson, tôi đã nghĩ ra một thuật toán thân lồi ngẫu nhiên mà chúng tôi nghĩ rằng sẽ hoạt động tốt trong thực tế. Clarkson đã có một sinh viên mùa hè tại Bell Labs thực hiện nó. Dựa trên lời hứa của việc triển khai này, các ý tưởng đã được đưa vào chương trình qhull (được viết tại Trung tâm Hình học), nhưng với một số tăng tốc heuristic có nghĩa là thuật toán không còn đảm bảo về mặt lý thuyết rằng nó chạy nhanh.
Peter Shor

5

Nếu tác vụ tính toán của bạn liên quan nhiều đến việc di chuyển dữ liệu hơn là thực hiện các hoạt động (số học), (các bộ dữ liệu rất lớn để chúng thậm chí không vừa với bộ nhớ chính), thì mô hình I / O (được Aggarwal và Vitter giới thiệu vào năm 1988 ) có thể rất chính xác. Đối với các tác vụ như hoán vị một mảng lớn các phần tử trong bộ nhớ chính, nó có thể giúp sử dụng các thuật toán được tối ưu hóa I / O (trong một triển khai cẩn thận).

Đối với máy tính đa lõi hiện đại, biến thể song song được giới thiệu bởi Arge, Goodrich, Nelson và Sitchinava năm 2008 có thể là một mô hình chính xác.


5

Nếu bạn có nghĩa là mô hình tính toán "tốt nhất" để làm cho cuộc sống của bạn trở nên phức tạp hơn, thì bạn có thể sử dụng máy turing phổ quát 2 trạng thái, 3 biểu tượng của Wolfram.

PROS : không có gì ngoại trừ cảm giác bước đi giữa ranh giới tốt đẹp giữa lý trí và sự điên rồ;

Nhược điểm : tấn ...

:-D (chỉ là một trò đùa, về cơ bản tôi đồng ý với các câu trả lời trước đó ...)


1

Một lưu ý lý thuyết hơn: Bài báo Các mô hình lý thuyết tối ưu của máy tính nano cho rằng mô hình lưới 3D có thể đảo ngược là mô hình vật lý tối ưu của tính toán, theo nghĩa là không có mô hình vật lý nào khác có thể nhanh hơn bất thường. Các cân nhắc vật lý như tốc độ ánh sáng, nguyên lý của Landauerràng buộc Bekenstein sẽ được thảo luận.

Để trích dẫn từ bản tóm tắt:

Chúng tôi thấy rằng sử dụng công nghệ hiện tại, một máy có thể đảo ngược chỉ chứa vài trăm lớp mạch có thể vượt trội hơn bất kỳ máy nào hiện có và một máy tính có thể đảo ngược dựa trên công nghệ nano sẽ chỉ cần một vài micron để có thể vượt trội hơn bất kỳ công nghệ không thể đảo ngược nào.

Chúng tôi cho rằng việc triển khai silicon của lưới 3D có thể đảo ngược ngày nay có thể có giá trị để tăng tốc một số tính toán khoa học và kỹ thuật, và đề xuất rằng mô hình nên trở thành trọng tâm của nghiên cứu trong tương lai về lý thuyết thuật toán song song cho một loạt vấn đề.

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.