Không, mã của bạn có độ phức tạp về thời gian O(2^|<DeltaTime>|)
,
Để có một mã hóa thích hợp của thời điểm hiện tại.
Làm ơn, cho tôi xin lỗi trước vì tiếng Anh của tôi.
Big O là gì và cách thức hoạt động của Big O trong CS
Ký hiệu Big O không được sử dụng để ràng buộc đầu vào của một chương trình với thời gian chạy của nó .
Ký hiệu Big O, để lại tính chặt chẽ, là một cách để biểu thị tỷ số tiệm cận của hai đại lượng .
Trong trường hợp phân tích thuật toán, hai đại lượng này không phải là đầu vào (mà đại lượng này trước tiên phải có chức năng "đo") và thời gian chạy.
Chúng là độ dài mã hóa của một trường hợp của vấn đề 1 và một chỉ số quan tâm.
Các chỉ số thường được sử dụng là
- Số bước cần thiết để hoàn thành thuật toán trong một mô hình tính toán nhất định.
- Không gian cần thiết, nếu có bất kỳ khái niệm nào như vậy tồn tại, bởi mô hình tính toán.
Ngầm được giả định một TM là mô hình do đó điểm đầu tiên chuyển đến số ứng dụng của quá trình chuyển đổi 2 chức năng , tức là "bước", và một trong những thứ hai chuyển số lượng tế bào băng khác nhau bằng văn bản ít nhất một lần .
Có phải người ta cũng thường mặc nhiên cho rằng chúng ta có thể sử dụng mã hóa đa thức liên quan thay vì mã hóa ban đầu, chẳng hạn như một hàm tìm kiếm một mảng từ đầu đến cuối có O(n)
độ phức tạp mặc dù thực tế là mã hóa một phiên bản của mảng đó phải có độ dài là n*b+(n-1)
ở đâu b
là số ký hiệu (hằng số) của mỗi phần tử. Điều này là do b
được coi là hằng số của mô hình tính toán nên biểu thức trên vàn
tiệm cận là giống nhau.
Điều này cũng giải thích tại sao một thuật toán như Bộ phận Thử nghiệm là một thuật toán hàm mũ mặc dù về cơ bản là một for(i=2; i<=sqr(N); i++)
thuật toán giống 3 .
Xem này .
Điều này cũng có nghĩa là ký hiệu O lớn có thể sử dụng nhiều tham số mà người ta có thể cần để mô tả vấn đề, không có gì lạ khi có k tham số cho một số thuật toán.
Vì vậy, đây không phải là về "đầu vào" hay "không có đầu vào".
Nghiên cứu trường hợp ngay bây giờ
Ký hiệu Big O không đặt câu hỏi về thuật toán của bạn, nó chỉ giả định rằng bạn biết bạn đang làm gì. Về cơ bản, nó là một công cụ có thể áp dụng ở mọi nơi, ngay cả đối với thuật toán có thể cố tình phức tạp (như của bạn).
Để giải quyết vấn đề của bạn, bạn đã sử dụng ngày hiện tại và ngày trong tương lai, vì vậy bằng cách nào đó chúng phải là một phần của vấn đề; nói một cách đơn giản: chúng là một phần của ví dụ của vấn đề.
Cụ thể ví dụ là:
<DeltaTime>
Trường hợp <>
có nghĩa là bất kỳ, không bệnh lý, mã hóa của sự lựa chọn.
Xem bên dưới cho rất quan trọng .
Vì vậy, thời gian phức tạp O lớn của bạn là O(2^|<DeltaTime>|)
do bạn thực hiện một số lần lặp phụ thuộc vào giá trị của thời gian hiện tại. Không có ích gì khi đặt các hằng số khác vì ký hiệu tiệm cận rất hữu ích vì nó loại bỏ các hằng số (ví dụ như việc sử dụngO(10^|<DeltaTime>|*any_time_unit)
là vô nghĩa).
Phần khó khăn nằm ở đâu
Chúng tôi đã đưa ra một giả định quan trọng ở trên: rằng mô hình tính toán đặc tả lại 5 thời gian, và theo thời gian, ý tôi là thời gian vật lý (thực?). Không có khái niệm này trong mô hình tính toán tiêu chuẩn, một TM không biết thời gian, chúng ta liên kết thời gian với số bước bởi vì đây là cách thực tế của chúng ta hoạt động 4 .
Trong mô hình của bạn, tuy nhiên thời gian là một phần của tính toán, bạn có thể sử dụng thuật ngữ của những người chức năng bằng cách nói rằng Main không thuần túy nhưng khái niệm thì giống nhau.
Để hiểu điều này, cần lưu ý rằng không có gì ngăn cản Framework sử dụng thời gian giả chạy nhanh hơn gấp đôi, năm, mười lần thời gian vật lý đó. Bằng cách này, mã của bạn sẽ chạy trong "một nửa", "một phần năm", "một phần mười" của "thời gian".
Sự phản ánh này rất quan trọng đối với việc chọn mã hóa <DeltaTime>
, về cơ bản đây là một cách cô đọng để viết <(CurrentTime, TimeInFuture)>. Vì thời gian không tồn tại ở thời điểm ban đầu, nên mã hóa của CurrentTime rất có thể là từ Bây giờ (hoặc bất kỳ lựa chọn nào khác) ngày trước có thể được mã hóa là Ngày hôm qua , bằng cách phá vỡ giả định rằng thời lượng mã hóa tăng lên theo thời gian thực. tiếp tục (và một trong số DeltaTime giảm)
Chúng ta phải mô hình hóa thời gian đúng cách trong mô hình tính toán của mình để làm điều gì đó hữu ích.
Sự lựa chọn an toàn duy nhất mà chúng tôi có thể làm là mã hóa dấu thời gian với độ dài ngày càng tăng (nhưng vẫn không sử dụng đơn phân) khi thời gian vật lý tiến lên. Đây là thuộc tính thực sự duy nhất về thời gian mà chúng ta cần và là thuộc tính mã hóa cần nắm bắt. Có phải chỉ với loại mã hóa này, thuật toán của bạn có thể có độ phức tạp về thời gian.
Sự nhầm lẫn của bạn, nếu có, phát sinh từ thực tế là từ thời gian trong các cụm từ ' Độ phức tạp về thời gian của nó là gì?' và ' Sẽ mất bao nhiêu thời gian ?' có nghĩa là những thứ rất khác
Than ôi, thuật ngữ sử dụng những từ giống nhau, nhưng bạn có thể thử sử dụng "độ phức tạp của các bước" trong đầu và tự hỏi lại câu hỏi của mình, tôi hy vọng điều đó sẽ giúp bạn hiểu câu trả lời thực sự là gì ^ _ ^
1 Điều này cũng giải thích sự cần thiết của phương pháp tiệm cận vì mỗi trường hợp có độ dài khác nhau, nhưng không tùy ý.
2 Tôi hy vọng tôi đang sử dụng thuật ngữ tiếng Anh chính xác ở đây.
3 Ngoài ra, đây là lý do tại sao chúng ta thường tìm log(log(n))
các số hạng trong toán học.
4 Id est, một bước phải chiếm một khoảng thời gian hữu hạn, nhưng không rỗng, cũng không liên kết với nhau.
5 Điều này có nghĩa là chế độ tính toán như một kiến thức về thời gian vật lý trong nó, có thể diễn đạt nó bằng các thuật ngữ của nó. Tương tự là cách các generic hoạt động trong .NET framework.
O(N)
không phải là sự phức tạpO(1)