Ví dụ các vấn đề với các giải pháp đa thức và hàm mũ, và dấu chân nhỏ?


8

Tôi đang lên kế hoạch chạy thử nghiệm trực tuyến, khi dạy lớp thuật toán của mình vào mùa thu này, với một máy tính rất cũ, hạn chế (yếu tố giới hạn chính có lẽ là bộ nhớ có thể thấp tới 16KB) và một máy hiện đại / tiêu chuẩn. Ý tưởng là giải quyết một vấn đề với một đa thức, chạy trên máy tính chậm và một số mũ trên tốc độ nhanh (và dĩ nhiên, có một chiến thắng chậm).

Vấn đề là tìm ra một vấn đề phù hợp, trong đó thời gian chạy sẽ thực sự khác nhau đối với các trường hợp có kích thước rất hạn chế (và tốt nhất là trong đó các cấu trúc dữ liệu khá đơn giản; máy tính nguyên thủy là nguyên thủy). Ban đầu tôi nghĩ về việc sắp xếp các thuật toán (ví dụ: bậc hai so với tuyến tính), nhưng điều đó sẽ đòi hỏi các trường hợp quá lớn (trừ khi tôi đi với bogosort chẳng hạn).

Hiện tại, ví dụ duy nhất (khá nhàm chán) mà tôi nghĩ đến là tính toán các số Fibonacci theo cách thông minh và ngu ngốc. Sẽ thật tốt nếu có một cái gì đó bớt mệt mỏi / quá lạm dụng, và tốt nhất là một cái gì đó (bán) rõ ràng là hữu ích. Bất kỳ ý tưởng / đề xuất?


Trên thực tế, tôi đã lên kế hoạch sử dụng các giải pháp giả ngẫu nhiên (tuyến tính trong bảng xếp hạng Fibonacci xếp hạng) và các giải pháp tối ưu (đệ quy) cho vấn đề này; điểm chính là sự khác biệt rõ ràng về độ phức tạp, cho phép máy tính yếu hơn dễ dàng giành chiến thắng.
Magnus Lie Hetland

1
Bipartite phù hợp với trọng lượng tối đa (Hungary so với brute-force)?
Jukka Suomela

Câu trả lời:


6

Một câu trả lời phần nào khái quát hóa nhận xét của Neel là tìm kiếm trong lĩnh vực tìm kiếm và lập trình động, với đầy đủ các thuật toán tuyệt vời hoạt động tuyệt vời nếu bạn ghi nhớ và khủng khiếp nếu bạn không - ngay cả chức năng nhân tố nhàm chán mà bạn nghĩ là rơi vào đây thể loại.

Tất nhiên, bạn sẽ bị giới hạn bởi trần bộ nhớ trên máy tính chậm, nhưng tôi nghĩ điều đó chỉ có nghĩa là bạn phải cẩn thận rằng bạn đủ "có nghĩa" với máy tính nhanh. Dưới đây là một số ý tưởng cụ thể:

  • Cho một đồ thị vô hướng lớn, tìm một đường dẫn giữa hai điểm. Máy tính nhanh thực hiện tìm kiếm ngẫu nhiên (công bằng hoặc có thể không kết thúc!) Thông qua biểu đồ, trong khi máy tính chậm bình tĩnh thực hiện tìm kiếm theo chiều rộng đầu tiên hoặc tìm kiếm theo chiều sâu. Có lẽ bạn cần chạy thử nghiệm này trên nhiều thử nghiệm để đảm bảo rằng sự khác biệt về hiệu suất là đáng chú ý.
  • Nhận một biểu đồ có hướng và cố gắng tìm đường đi ngắn nhất giữa hai điểm: máy tính nhanh liệt kê tất cả các đường đi theo chu kỳ (sử dụng thuật toán phát hiện chu kỳ rùa và thỏ ở mỗi bước, bwahahahaha) trước tiên và máy tính chậm chạy một cách ngắn nhất con đường.
  • Thuật toán chỉnh sửa khoảng cách? Bất kỳ thuật toán lập trình nào ngây thơ hơn là năng động có lẽ sẽ hoàn toàn bị nghẹt thở ở đây.

Một ý tưởng cuối cùng là bạn có thể thử một số thuật toán trong Prolog có và không có kiểm tra xảy ra (không cần thiết). Nhưng nếu bạn cho các sinh viên thấy rằng Prolog tuyệt vời như thế nào mà không có ý nghĩa về mặt ngữ nghĩa xảy ra - kiểm tra nhanh hơn, tôi sẽ khóc. Ngoài ra, đây thường là một tuyến tính so với bậc hai không đa thức so với hàm mũ.


9

Bạn có thể làm khớp biểu thức chính quy. Một trình so khớp quay ngược ngây thơ có thể dễ dàng bị đẩy vào hành vi theo cấp số nhân trên các đầu vào mà trình so khớp thông minh hơn có thể xử lý trong thời gian tuyến tính.


5

Hãy thử đếm các kết hợp hoàn hảo trong đồ thị phẳng, một vấn đề cần giải thích dễ dàng. Trong trường hợp phẳng, thuật toán Fisher-Kastelyen-Temperley giải quyết nó trong thời gian đa thức, trong khi đối với các đồ thị chung, vấn đề là # P-hoàn thành, nghĩa là có lẽ không có cách nào nhanh hơn việc đếm lực lượng vũ phu. Đơn giản chỉ cần chạy FKT trên máy chậm và lực lượng vũ phu đếm trên máy nhanh.

( Đây cũng là một câu hỏi liên quan.)


1

Nếu bạn đang dạy thuật toán tôi nghĩ bạn nên làm một cái gì đó đơn giản, điều đó minh họa cho ý tưởng. Tôi nghĩ rằng ý tưởng thuật toán sắp xếp của bạn là một ý tưởng rất tốt và có thể hoạt động nếu bạn thử các thuật toán không đệ quy trong máy tính nguyên thủy.

Tôi hiện đang so sánh các thuật toán sắp xếp và tôi có Heap Sort chạy với 17.000 phần tử trên máy tính có ram 32kb.

Tôi sẽ thử chèn sort vs Heap Sort.


Nhưng việc chèn 17000 phần tử trên một máy tính hiện đại là khá nhanh. (Câu hỏi đã ám chỉ điều này.)
Radu GRIGore
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.