Tại sao hàm này có thể tính toán được trong thời gian


10

Sách giáo khoa của tôi nói: "Chúng tôi xác định hàm như sau: f ( 1 ) = 2f ( i + 1 ) = 2 f ( i ) 1.2 . Lưu ý rằng với n , chúng ta có thể dễ dàng tìm thấy trong O ( n 1.5 ) thời gian số i sao cho n được kẹp giữa f ( i )f ( i + 1f:NNf(1)=2f(i+1)=2f(i)1.2nO(n1.5)inf(i) . "f(i+1)

Làm thế nào tôi có thể thuyết phục bản thân mình rằng trên thực tế chúng ta có thể dễ dàng tìm thấy trong thời gian O ( n 1.5 ) ? Như f được định nghĩa đệ quy, tôi nghĩ rằng chúng ta phải tính toán f ( 1 ) , f ( 2 ) , f ( 3 ) ... f ( j ) cho đến khi f ( j ) n . Để tìm ra thời gian mà các tính toán này mất, tôi nghĩ rằng chúng ta phải tìm một giới hạn trên phù hợp cho tôi phụ thuộc vào niO(n1.5)ff(1),f(2),f(3)f(j)f(j)ninvà chúng ta phải tìm một giới hạn trên về thời gian thực hiện của hàm . Cuối cùng, chúng tôi hy vọng có thể hiển thị các đề xuất được trích dẫn. Thật không may, tôi không thấy cái này hay cái khác.x2x1.2

Tôi quên đề cập: Xin lưu ý rằng chúng tôi đang ở trong một bối cảnh không xác định. Vì vậy, được tuyên bố là có thể tính toán được trong O ( n 1.5 ) bởi một máy Turing không xác định.fO(n1.5)


Vì khá nhiều người đã đọc câu hỏi này, với một số người trong số họ cũng thấy nó hữu ích và thú vị, nhưng cho đến nay vẫn chưa có ai trả lời, tôi muốn cung cấp thêm một số thông tin về bối cảnh: Yêu cầu được trích dẫn là một phần không thể thiếu của bằng chứng về định lý phân cấp thời gian không xác định. Bằng chứng (với yêu cầu) có thể được tìm thấy, ví dụ như trong cuốn sách của Arora và Barak , nhưng tôi cũng đã tìm thấy khá nhiều tài nguyên khác trên Web cũng đưa ra bằng chứng tương tự. Mỗi người trong số đó gọi yêu cầu dễ dàng hoặc tầm thường và không nói chi tiết về cách tìm trong thời gian O ( n 1.5 ) . Vì vậy, hoặc tất cả các tài nguyên này chỉ được sao chép từ Arora và Barak hoặc yêu cầu thực tế không quá khó khăn.iO(n1.5)


1
Điều này trông giống như bằng chứng định lý phân cấp thời gian không xác định trong Arora & Barak, phải không? Nếu vậy, tôi cho rằng chủ nghĩa không điều kiện đóng một vai trò ở đây.
G. Bạch

Bạn đúng. Xin lỗi vì điều đó, tôi nên đã đề cập đến bối cảnh không xác định. Bạn có thể vui lòng giải thích chi tiết hơn về việc không thuyết phục giúp chúng tôi ở đó để hiển thị giới hạn O (n ^ 1.5) không?
dùng1494080

Câu trả lời:


4

Suy ra bởi độ dài của một số x , tức là log 2 x + 1 (với x > 0 ). Việc tính toán 2 x đòi hỏi thời gian O ( x ) trong mô hình RAM và do đó, việc tính f ( i + 1 ) từ f ( i ) cần thời gian O ( f ( i ) 1.2 ) = O ( | f|x|xlog2x+1x>02xO(x)f(i+1)f(i) . Vì f ( i ) đang phát triển nhanh hơn hình học, nên tổng thời gian để tính f ( i + 1 ) O ( | f ( i + 1 ) | ) . Như bạn chỉ ra, bạn cần phải làm như vậy cho đến khi f ( i + 1 ) n , có nghĩa là f ( i ) < n . Do đó, tổng thời gian chạy làO(f(i)1.2)=O(|f(i+1)|)f(i)f(i+1)O(|f(i+1)|)f(i+1)nf(i)<n .O(|f(i+1)|)=O(f(i)1.2)=O(n1.2)

Trong mô hình máy Turing với một băng đơn, việc tính mất thời gian O ( x log x ) và do đó tổng thời gian chạy là O ( n 1,2 log n ) = O ( n 1.5 ) . Thuật toán tính toán 2 x thay thế [ x ] bằng 1 [ [ x ] ] (ở đây [ x ] là biểu diễn nhị phân của x[ [2xO(xlogx)O(n1.2logn)=O(n1.5)2x[x]1[[x]][x]x là biểu diễn nhị phân sử dụng chữ số khác nhau 0 ' , 1 ' ), và sau đó liên tục chạy việc chuyển đổi [ [ x ] ] 0 [ [ x - 1 ] ] , mà cần có thời gian O ( | x | ) = O ( log x ) .[[x]]0,1[[x]]0[[x1]]O(|x|)=O(logx)


Hoàn hảo, cảm ơn! Thêm một câu hỏi nữa: Chúng ta không phải tranh luận rằng | f (i) | phát triển nhanh hơn hình học chứ không phải f (i) phát triển nhanh hơn hình học?
user1494080

Kể từ , đó là điều tương tự, nhưng bạn đã đúng. Những gì chúng ta thực sự muốn là Σ j i | f ( j ) | = O ( | f ( i ) | ) . |f(i+1)|=f(i)1.2ji|f(j)|=O(|f(i)|)
Yuval Filmus
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.