Ví dụ về thuật toán trong đó thuật ngữ bậc thấp chi phối thời gian chạy cho bất kỳ đầu vào thực tế nào?


10

Ký hiệu Big-O ẩn các yếu tố không đổi, do đó, một số thuật toán tồn tại không khả thi đối với bất kỳ kích thước đầu vào hợp lý nào vì hệ số trên số hạng rất lớn.O(n)n

Có bất kỳ thuật toán đã biết nào có thời gian chạy là nhưng với một số thuật ngữ rất lớn đến mức đối với kích thước đầu vào hợp lý, nó hoàn toàn chi phối thời gian chạy? Tôi muốn sử dụng một thuật toán như thế này làm ví dụ trong một khóa học về thuật toán, vì nó đưa ra một lý do chính đáng tại sao ký hiệu big-O không phải là tất cả.O(f(n))o(f(n))

Cảm ơn!


Các thuật toán đầu tiên thiết lập một bảng lớn và sau đó thực hiện tra cứu nhanh trong bảng cho từng mục đầu vào? Nếu bảng đủ lớn thì số lượng vật phẩm phải rất lớn để bù đắp chi phí tạo bảng. Công cụ tìm kiếm là một ví dụ, nếu là số lượng truy vấn. n
András Salamon

Tôi đã nghe lập trình tuyến tính là như thế này. Simplex là cấp số nhân nhưng nhanh hơn các thuật toán đa thức trong thực tế.
jmite

1
Tôi không biết bất kỳ thuật toán nào phù hợp với nhu cầu của bạn, nhưng tôi tìm kiếm thứ gì đó có thời gian chạy tuyến tính nhiều nhất, vì ngoài ra tôi rất nghi ngờ các thuật ngữ nhỏ hơn có thể chi phối thuật ngữ hàng đầu cho hầu hết các đầu vào hợp lý. Nhưng có lẽ hợp nhất k-way phù hợp với nhu cầu của bạn, khi được sử dụng để sắp xếp dữ liệu lớn? Vấn đề là phải giảm thiểu truy cập bộ nhớ thứ cấp vì chúng tốn rất nhiều thời gian - mặc dù tôi không hoàn toàn chắc chắn rằng đó sẽ là một ví dụ thích hợp cho những gì bạn muốn chứng minh và tôi thực sự không nghĩ nó đủ đơn giản để có tính minh họa.
G. Bạch

Câu trả lời:


2

Mật mã học là một ví dụ, nếu một suy biến. Ví dụ: phá mã hóa AES là - tất cả những gì bạn phải làm là tìm đúng khóa trong số hữu hạn, hoặc hoặc tùy thuộc vào kích thước khóa ( giả sử rằng đủ bản rõ được xác định để xác định khóa một cách rõ ràng). Tuy nhiên, ngay cả các hoạt động sẽ mất tất cả các máy tính ngày nay (một tỷ hoặc sau đó, mỗi hoạt động thực hiện khoảng một tỷ hoạt động mỗi sceond) nhiều hơn vòng đời của vũ trụ (khoảng một tỷ tỷ giây).2 128 2 192 2 256 2 128Ôi(1)2128219222562128


Một cách hơi khác để minh họa tại sao big-O không phải là tất cả để nhận xét rằng đôi khi chúng ta sử dụng một thuật toán khác nhau cho các kích thước đầu vào nhỏ. Ví dụ, dùng quicksort. Với sự lựa chọn đúng về trục (vốn là một công việc khó khăn!), Đó là . Quicksort hoạt động bằng cách phân chia và chinh phục: mọi trường hợp liên quan đến việc thực hiện rất nhiều cách sắp xếp các mảng nhỏ. Đối với các mảng nhỏ, các phương pháp bậc hai như sắp xếp chèn thực hiện tốt hơn. Vì vậy, để có hiệu suất tốt nhất, quicksort của một mảng lớn bao gồm rất nhiều lần chạy sắp xếp chèn cho kích thước nhỏ.Ôi(nlgn)


Tôi không nghĩ phá vỡ mã hóa là một ví dụ hợp lý ở đây; một điều là để phân tích vấn đề tìm khóa chính xác theo triệu chứng, chúng ta sẽ phải xem xét các phiên bản lý thuyết có sẵn của Rijndael với kích thước khóa không đổi, tức là phá khóa cho các khóa có kích thước . Mặt khác, chúng ta cũng có thể nói rằng bất kỳ thuật toán nào chấm dứt thực hiện trong cho đầu vào có kích thước cố định. O ( 1 )nÔi(1)
G. Bạch

@ G.Bach Điểm của ví dụ này là nó không khả thi (lý thuyết phức tạp liên quan đến độ phức tạp cao) mặc dù đó là thời gian không đổi (về kích thước của bản mã).
Gilles 'SO- ngừng trở nên xấu xa'

2
Tôi không nghĩ rằng ví dụ đầu tiên của bạn hoạt động. Vì chỉ có nhiều tùy chọn để kiểm tra, thời gian chạy của thuật toán là , do đó, không có thuật ngữ o ( 1 ) có thứ tự thấp nào chiếm toàn bộ thời gian chạy. Ôi(1)o(1)
templatetypedef

1
@templatetypedef Phá vỡ mã hóa của tin nhắn được mã hóa AES là về độ dài của tin nhắn . Ôi(1)
Gilles 'SO- ngừng trở thành ác quỷ'

1

Hai ví dụ xuất hiện từ lĩnh vực phức tạp tham số hóa và thuật toán FPT. Điều này có thể không chính xác những gì bạn đang tìm kiếm, nhưng ở đây đi.

Hãy xem xét một vấn đề về đồ thị, chẳng hạn như 3-MÀU hoặc HAM-CYCLE. Cả hai vấn đề có thể được thể hiện trong logic thứ hai đơn âm, và do đó có thể được quyết định theo thời gian tuyến tính của đồ thị với treewidth giới hạn. Đây là kết quả của Bruno Courcelle , nhưng thuật toán kết quả khác xa với thực tế.

Ôi(p9p/2)LÔi(p2pL)pL


2
Ôi(n)o(n)

0

phần nào liên quan đến câu hỏi của bạn là các thuật toán được biết là có hiệu suất tốt về mặt lý thuyết nhưng không được sử dụng cho các vấn đề thực tế do tính không thực tế trong các trường hợp nhỏ hơn. nói cách khác như bạn yêu cầu, "hiệu suất được quảng cáo" chỉ có thể áp dụng cho các đầu vào lớn trên lý thuyết, không thấy trong các ứng dụng thực tế. điều này đôi khi được phản ánh trong các ước tính của Big-Oh, những lần khác không chính xác. một số thuật toán có "hiệu suất" lý thuyết tốt nhưng rất phức tạp về mặt logic và chưa từng được thực hiện bởi bất kỳ ai, và do đó "hiệu suất" trên kích thước cá thể thực tế thậm chí không được biết đến, ví dụ như với vấn đề Maximum Flow .


Nhưng những điều đó là không thực tế bởi vì các điều khoản bậc thấp chiếm ưu thế hay bởi vì các hằng số trên các điều khoản bậc cao là xấu?
David Richerby

hoặc, hoặc kết hợp, sẽ khó phân lập trong từng trường hợp. hiệu quả / thực tế hiệu quả tương tự của nó.
vzn

-1

Đây là một trò đùa nhưng nó có một khía cạnh nghiêm trọng ...

Ôi(nđăng nhậpn)Ôi(n2)


1
Không, đó là khác nhau. Quicksort rất hữu ích trong thực tế vì không có thuật ngữ bậc hai cho đầu vào thông thường, bất kể kích thước lớn như thế nào. Nếu sự lựa chọn trục là xấu cho bố cục dữ liệu, quicksort thể hiện hành vi bậc hai ngay cả đối với đầu vào nhỏ.
Gilles 'SO- ngừng trở nên xấu xa'
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.