Trong một danh sách liên kết, mỗi phần tử có một con trỏ tới phần tử tiếp theo:
head -> item1 -> item2 -> item3 -> etc.
Để truy cập item3
, bạn có thể thấy rõ rằng bạn cần phải đi bộ từ đầu thông qua mọi nút cho đến khi bạn đạt đến mục 3, vì bạn không thể nhảy trực tiếp.
Như vậy, nếu tôi muốn in giá trị của mỗi phần tử, nếu tôi viết những dòng này:
head -> print head
head -> item1 -> print item1
head -> item1 -> item2 -> print item2
head -> item1 -> item2 -> item3 print item3
Đây là khủng khiếp không hiệu quả vì mỗi lần:
for(int i = 0; i < 4; i++) {
System.out.println(list.get(i));
}
những gì sẽ xảy ra đây là bạn đang lập chỉ mục nó khởi động lại từ đầu danh sách và đi qua mọi mục. Điều này có nghĩa là sự phức tạp của bạn có hiệu quả là O(N^2)
chỉ để duyệt qua danh sách!
Nếu thay vào đó tôi đã làm điều này:
for(String s: list) {
System.out.println(s);
}
sau đó điều gì sẽ xảy ra đây là:
head -> print head -> item1 -> print item1 -> item2 -> print item2 etc.
tất cả trong một traversal duy nhất, đó là O(N)
.
Bây giờ, hãy thực hiện một số khác là List
là ArrayList
, được hỗ trợ bởi một mảng đơn giản. Trong trường hợp đó, cả hai giao điểm trên đều tương đương nhau, vì một mảng nằm liền kề nên nó cho phép nhảy ngẫu nhiên đến các vị trí tùy ý.
Ví dụ khác có thể giúp bạn hiểu trường hợp chung của trường hợp này là [Bài viết của Joel Spolsky "Quay lại bài viết cơ bản"] (http://www.joelonsoftware.com/articles/fog0000000319.html) - tìm kiếm "Shlemiel the painter's thuật toán ". –