Tôi đang đọc bài đăng này trên Big-O
Nó nói rằng đoạn mã sau là O (n ^ 2):
bool ContainsDuplicates(String[] strings)
{
for(int i = 0; i < strings.Length; i++)
{
for(int j = 0; j < strings.Length; j++)
{
if(i == j) // Don't compare with self
{
continue;
}
if(strings[i] == strings[j])
{
return true;
}
}
}
return false;
}
Nhưng tôi không thể hiểu tại sao.
Vòng lặp bên trong làm một cái gì đó không đổi.
Vậy nó là tổng của 1 .... N của hằng số. tức là số không đổi O (1).
Vòng lặp bên ngoài là tổng của O (1).
Vì vậy, tôi sẽ tưởng tượng nó là n * O (1).
Tôi nghĩ rằng tôi đang hiểu nhầm một cái gì đó ở đây.
Tôi không nghĩ rằng tất cả các vòng lặp lồng nhau có nghĩa là O (n ^ 2), phải không?
i+1
thay vì 0
. Như đã viết, trong trường hợp xấu nhất (không có bản sao) 1/2 các so sánh là dư thừa.
O(N)
, mã này thực sự sẽ là O(N^2 * M)
M là độ dài của chuỗi.