Vì vậy, ban đầu, tôi đã có mã này:
import java.util.*;
public class sandbox {
public static void main(String[] args) {
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0; i < 100_000; i++) {
hashSet.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 100_000; i++) {
for (Integer val : hashSet) {
if (val != -1) break;
}
hashSet.remove(i);
}
System.out.println("time: " + (System.currentTimeMillis() - start));
}
}
Phải mất khoảng 4 giây để chạy các vòng lặp lồng nhau trên máy tính của tôi và tôi không hiểu tại sao phải mất nhiều thời gian như vậy. Vòng lặp bên ngoài chạy 100.000 lần, vòng lặp for bên trong sẽ chạy 1 lần (vì bất kỳ giá trị nào của hàm băm sẽ không bao giờ là -1) và việc xóa một mục khỏi Hashset là O (1), do đó cần có khoảng 200.000 thao tác. Nếu thường có 100.000.000 hoạt động trong một giây, tại sao mã của tôi mất 4 giây để chạy?
Ngoài ra, nếu dòng hashSet.remove(i);
được nhận xét, mã chỉ mất 16ms. Nếu vòng lặp for bên trong được nhận xét (nhưng không hashSet.remove(i);
), mã chỉ mất 8ms.
for val
vòng lặp là thứ chiếm thời gian. Các remove
vẫn là rất nhanh. Một số loại chi phí thiết lập trình lặp mới sau khi bộ đã được sửa đổi ...?
for val
vòng lặp chậm. Tuy nhiên, lưu ý rằng vòng lặp không cần thiết chút nào. Nếu bạn muốn kiểm tra xem có bất kỳ giá trị nào khác với -1 trong tập hợp hay không, việc kiểm tra sẽ hiệu quả hơn nhiều hashSet.size() > 1 || !hashSet.contains(-1)
.