Tại sao sử dụng so sánh thay vì thời gian chạy để so sánh hai thuật toán?


19

Tôi nhận thấy rằng trong một vài tài liệu nghiên cứu về CS, để so sánh hiệu quả của hai thuật toán, tổng số so sánh chính trong các thuật toán được sử dụng thay vì chính thời gian tính toán thực sự. Tại sao chúng ta không thể so sánh cái nào tốt hơn bằng cách chạy cả hai chương trình và tính tổng thời gian cần thiết để chạy các thuật toán?


Chào mừng bạn Tôi hy vọng rằng hầu hết các giấy tờ như vậy không sử dụng thời gian chạy. Tôi biết một số làm, mặc dù, đặc biệt là trong các cộng đồng được áp dụng nhiều hơn và khi các hệ thống được coi là rất phức tạp.
Raphael

Câu trả lời:


14

Đây thực sự là một vấn đề sâu sắc có một số câu trả lời có phương pháp và thực tế. Tôi giả sử bạn muốn biết điều gì đó về (các) thuật toán trong tay. Nếu bạn muốn biết thuật toán nào hoạt động tốt hơn trên một máy nhất định trên các đầu vào nhất định, hãy tiếp tục và đo thời gian chạy. Nếu bạn muốn so sánh chất lượng của trình biên dịch cho một thuật toán nhất định, hãy tiếp tục và đo thời gian chạy. Để học một cái gì đó về thuật toán, đừng làm điều đó.

Trước tiên tôi xin đưa ra một số lý do tại sao sử dụng thời gian chạy không phải là một ý tưởng tốt.

  1. Thời gian chạy chung
    được đo bằng một ngôn ngữ và một trình biên dịch trên một máy có rất ít ý nghĩa nếu bạn thay đổi bất kỳ thành phần nào. Ngay cả các triển khai khác nhau của cùng một thuật toán có thể thực hiện khác nhau vì bạn kích hoạt một số thao tác trình biên dịch trong trường hợp nhưng không phải trong trường hợp khác.
  2. Dự đoán
    Vì vậy, bạn có một vài thời gian chạy cho một số đầu vào. Điều đó nói gì về thời gian chạy của một số đầu vào khác? Nói chung, không có gì.
  3. Ý nghĩa
    Thông thường, bạn sẽ không điểm chuẩn tất cả các đầu vào (ở một số kích thước), do đó ngay lập tức hạn chế khả năng so sánh các thuật toán của bạn: có thể bộ thử nghiệm của bạn đã kích hoạt trường hợp xấu nhất trong một và trường hợp tốt nhất trong thuật toán khác? Hoặc có thể đầu vào của bạn quá nhỏ để thể hiện hành vi thời gian chạy .
  4. Đo
    thời gian đo thời gian chạy tốt không phải là nhỏ. Có JIT không? Đã có sự tranh chấp, tức là bạn đang đếm thời gian thuật toán thậm chí không chạy? Bạn có thể tái tạo chính xác trạng thái máy tương tự cho một lần chạy khác (của thuật toán khác), đặc biệt là các quy trình và bộ đệm không? Làm thế nào là độ trễ bộ nhớ được xử lý?

Tôi hy vọng những điều này đã thuyết phục bạn rằng thời gian chạy là một biện pháp khủng khiếp để so sánh các thuật toán, và một số phương pháp trừu tượng chung để điều tra thời gian chạy thuật toán là cần thiết.

Về phần thứ hai của câu hỏi. Tại sao chúng ta sử dụng so sánh hoặc các hoạt động cơ bản tương tự?

  1. Khả năng phân tích giả định
    Giả sử bạn muốn làm phân tích chính thức, bạn phải có khả năng làm điều đó. Đếm các tuyên bố cá nhân là rất kỹ thuật, đôi khi thậm chí khó khăn; một số người vẫn làm điều đó (ví dụ Knuth). Chỉ đếm một số câu lệnh - những câu thống trị thời gian chạy - là dễ dàng hơn. Vì lý do tương tự, chúng tôi thường "chỉ" điều tra (giới hạn trên) thời gian chạy trường hợp xấu nhất.

  2. Sự thống trị
    Các hoạt động được lựa chọn chi phối thời gian chạy. Điều đó không có nghĩa là nó đóng góp nhiều thời gian chạy nhất - các so sánh rõ ràng là không, ví dụ như trong Quicksort khi sắp xếp các số nguyên có kích thước từ. Nhưng chúng được thực thi thường xuyên nhất , vì vậy bằng cách đếm chúng, bạn sẽ đếm tần suất các phần được thực thi nhất của thuật toán được chạy. Do đó, thời gian chạy tiệm cận của bạn tỷ lệ thuận với số lượng các hoạt động cơ bản chi phối. Đây là lý do tại sao chúng tôi thoải mái sử dụng ký hiệu Landau và từ "thời gian chạy" mặc dù chúng tôi chỉ tính so sánh.

Lưu ý rằng có thể hữu ích khi đếm nhiều hơn một thao tác. Ví dụ, một số biến thể Quicksort có nhiều so sánh hơn nhưng ít hoán đổi hơn so với các biến thể khác (trung bình).

Đối với những gì nó có giá trị, sau khi bạn đã thực hiện tất cả các lý thuyết bạn có thể muốn xem lại thời gian chạy để xác minh rằng các dự đoán mà lý thuyết của bạn đưa ra là âm thanh. Nếu chúng không phải, lý thuyết của bạn không hữu ích (trong thực tế) và phải được mở rộng. Phân cấp bộ nhớ là một trong những điều đầu tiên bạn nhận ra là quan trọng nhưng còn thiếu trong các phân tích cơ bản.


1
Hãy nhớ rằng phân tích chính thức cũng có giới hạn của nó. Ví dụ, trường hợp trung bình cho các phân phối đầu vào không đồng nhất thường không thể truy cập được.
Raphael

10

Điều này là do tổng thời gian để chạy các thuật toán có sự phụ thuộc vào phần cứng mà nó được chạy cùng với các yếu tố khác. Không đáng tin cậy để so sánh hai thuật toán nếu một thuật toán đang chạy trên Pentium 4 và thuật toán còn lại chạy trên Core i7. Không chỉ điều này, mà hãy nói rằng bạn chạy cả hai trên cùng một máy tính. Điều gì để nói rằng cả hai đều có cùng thời gian xử lý? Điều gì xảy ra nếu một số quy trình khác có mức độ ưu tiên cao hơn quy trình của một trong các thuật toán?

Để vượt qua điều này, chúng tôi tách ra khỏi thời gian tổng thể này để hoàn thành, và thay vào đó so sánh dựa trên mức độ quy mô thuật toán. Bạn có thể đã nhận thấy các ký hiệu như O (1) hoặc O (n ^ 2) trong các tài liệu nghiên cứu. Điều này có thể đòi hỏi một chút đọc thêm, nếu bạn quan tâm đến see Big O ký hiệu .


1
Ngoài ra thời gian chạy thực tế phụ thuộc vào kích thước và nội dung của đầu vào thực tế được sử dụng để chạy các thuật toán!
Tsuyoshi Ito

7

Vì các câu trả lời khác giải thích lý do tại sao chúng tôi phân tích thời gian chạy theo số lượng hoạt động cơ bản, tôi xin đưa ra một vài lý do tại sao so sánh là số liệu đúng của nhiều thuật toán sắp xếp (không phải tất cả):

  • đối với nhiều thuật toán sắp xếp, số lượng so sánh chiếm ưu thế trong thời gian chạy, tức là ít nhất là nhiều phép so sánh được thực hiện như bất kỳ hoạt động cơ bản nào khác
  • so sánh là hoạt động đắt tiền ; nghĩ về cách một thói quen sắp xếp được thực hiện trong thư viện: hàm sort được truyền một mảng các phần tử và một con trỏ tới một hàm so sánh hai phần tử; nói chung và chờ đợi chức năng so sánh thực thi đắt hơn các hoạt động "nội bộ"; vì chức năng này được cung cấp bởi người dùng, khó khăn hơn để tối ưu hóa nó
  • (điều này có thể hoặc không thể là một lý do chính đáng cho một số người) chúng ta có thể nói điều gì đó thú vị về số lượng so sánh đủ và cần thiết để sắp xếp một chuỗi; chúng tôi biết cách thực hiện điều này trong trường hợp xấu nhất và trung bình cho các bản phân phối khác nhau, thậm chí làm thế nào để thiết kế một thuật toán hội tụ đến tối ưu khi nó chạy trên các mục được lấy mẫu iid từ một bản phân phối không xác định ( Thuật toán tự cải thiện ); chúng tôi biết cách thực hiện việc này khi một số so sánh được cung cấp miễn phí ( Sắp xếp với Thông tin một phần )

1) "ít nhất là nhiều so sánh được thực hiện như bất kỳ hoạt động cơ bản nào khác" - chỉ tối đa một yếu tố không đổi. 2) "so sánh là hoạt động đắt tiền" - giả định một thiết lập chung. Đối với sắp xếp số nguyên (thường được phân tích), hoán đổi thường đắt hơn.
Raphael

chắc chắn rồi. op dường như bị nhầm lẫn về phân tích các thuật toán nói chung, không muốn mang các yếu tố không đổi. tôi hy vọng thực tế là tôi đang nói về một thiết lập chung là rõ ràng từ mô tả - thói quen sắp xếp trong thư viện chuẩn không phải là sắp xếp số nguyên
Sasho Nikolov

cộng với các bài báo mà op thấy chắc chắn không phải là về các thuật toán sắp xếp số nguyên chuyên biệt, không ai đếm được số lượng so sánh
Sasho Nikolov

@Raphael Sắp xếp các số nguyên nhỏ không phải là vấn đề phổ biến trong thực tế. Tôi sẽ đặt cược hầu hết các loại sắp diễn ra trên thế giới là trên các chuỗi (có độ dài hoặc khác ). Ngay cả đối với việc sắp xếp số nguyên, tôi cũng không chắc liệu chính xác rằng các giao dịch hoán đổi có giá đắt hơn hay không - phân nhánh là một hoạt động tương đối tốn kém trên bộ xử lý cao cấp hiện đại, thấy rằng dự đoán chi nhánh sẽ vô dụng khi sắp xếp.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Bản thân nó, giao dịch hoán đổi đắt hơn so với so sánh số nguyên so với bất kỳ nền tảng nào tôi biết. Chi phí "phụ" như ví dụ sai lầm chi nhánh chắc chắn là một yếu tố, tác động của nó là chủ đề của nghiên cứu đang diễn ra. (Về việc sử dụng trong thực tế, tôi không thể đưa ra một tuyên bố đủ điều kiện. Tuy nhiên, tôi quan sát rằng các nhà bảo trì thư viện tiêu chuẩn tiếp tục cải thiện các thuật toán sắp xếp họ sử dụng cho các kiểu dữ liệu nguyên thủy nên tôi cho rằng họ thấy rất nhiều (ab) sử dụng.)
Raphael
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.