Tôi đã nói với mã như:Trong Java, với chuỗi x, chi phí thời gian chạy của s.length() là bao nhiêu? Có phải O (1) hoặc O (n)?
for (int i = 0; i < x.length(); i++) {
// blah
}
thực sự là O (n^2) vì các cuộc gọi lặp đi lặp lại để x.length()
. Thay vào đó, tôi nên sử dụng:
int l = x.length();
for (int i = 0; i < l; i++) {
// blah
}
Điều này có đúng không? Là chuỗi chiều dài được lưu trữ như là một thuộc tính số nguyên riêng của lớp String? Hoặc không String.length()
thực sự đi bộ toàn bộ chuỗi chỉ để xác định chiều dài của nó?
Ngay cả khi tính chiều dài của chuỗi là O (n), tổng độ phức tạp sẽ vẫn không phải là O (n^2). Độ dài được tính một lần và được sử dụng làm giá trị biên trong vòng lặp for, nó không được tính trên mỗi lần lặp. –
Theo như tôi biết, các giá trị biên không được lưu trong bộ nhớ cache. Điều gì nếu ranh giới đã được sửa đổi trong vòng lặp? –
Ranh giới được tính toán mỗi lần. Hãy nhớ rằng, kiểm tra vòng lặp for chỉ là một biểu thức tùy ý. Trình biên dịch không thực sự quan tâm những gì trong đó, và không thể đưa ra các giả định. Bạn có thể dễ dàng gọi một phương thức trả về một cái gì đó khác nhau mỗi lần. – Herms