Nói chung, chúng tôi chỉ sử dụng ký hiệu big-O khi n có thể tăng lên các giá trị lớn một cách khó hiểu, bởi vì ký hiệu big-O mô tả cách thời gian thực hiện tăng lên khi đầu vào tăng. Chẳng hạn, khi sắp xếp một danh sách, hầu hết các thuật toán tốt nhất đều sắp xếp O(n log n)
- có nghĩa là và chỉ có nghĩa là khi danh sách đủ dài, thời gian cần thiết để sắp xếp nó tỷ lệ thuận với nó n log n
. Khi danh sách không đủ dài, các yếu tố khác (ví dụ, bất kỳ lúc nào thuật toán của bạn có thể mất để phân bổ thêm dung lượng), trở nên quan trọng và thậm chí có thể chiếm thời gian chạy.
Với các chuỗi JavaScript, n
thực sự có thể có kích thước lớn tùy ý *, vì vậy chúng tôi nói việc so sánh cần có O(n)
thời gian. Nhưng với các số JavaScript (là các số dấu phẩy động có độ chính xác kép của IEEE 754 ), n
có giới hạn tối đa là 64 - 1 cho một bit dấu, 11 cho số mũ và 53 cho các chữ số có nghĩa **. Do đó, chúng tôi biết chính xác sẽ mất bao lâu để so sánh số xảy ra và các hệ thống tốt nhất chúng tôi có để so sánh các số có kích thước chính xác đó ít nhiều chạy giống nhau bất kể có bao nhiêu trong số 64 chữ số đó mỗi số thực sự đã - do đó, so sánh các số này trong JavaScript được xem xét O(1)
.
* Về mặt kỹ thuật, có giới hạn trên vì RAM có thể hết. Tuy nhiên, ngôn ngữ không chỉ định kích thước tối đa cho chuỗi và O(n)
phần so sánh chuỗi chi phối tốt thời gian thực hiện trước khi điều đó xảy ra.
** Nhân tiện, điều này không có nghĩa là số trong JavaScript không thể tăng vô hạn. Qua một điểm nhất định, họ bắt đầu ném đi các chữ số nhỏ hơn (ví dụ: các số trên 2 ^ 53 chỉ có thể là số chẵn và các số trên 2 ^ 54 chỉ có thể chia hết cho 4) và khi số đó đủ lớn, nó sẽ làm tròn đến vô cùng. Ngược lại, nếu bạn chia một số nhiều lần để làm cho nó cực kỳ nhỏ, cuối cùng nó sẽ làm tròn xuống không.
2
ví dụ, không3
. Đó là nó. Tương tự123
là không124
. Chuỗi là một tập hợp các ký tự"abc"
khác nhau"abd"
nhưng bạn phải kiểm tra từng ký tự.