Jadi awalnya, saya punya kode ini:
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));
}
}
Butuh sekitar 4s untuk menjalankan loop bersarang di komputer saya dan saya tidak mengerti mengapa butuh waktu lama. Loop luar berjalan 100.000 kali, bagian dalam untuk loop harus berjalan 1 kali (karena nilai hashSet tidak akan pernah -1) dan menghapus item dari HashSet adalah O (1), sehingga harus ada sekitar 200.000 operasi. Jika biasanya ada 100.000.000 operasi dalam satu detik, kenapa kode saya bisa berjalan 4s?
Selain itu, jika baris hashSet.remove(i);
dikomentari, kode hanya membutuhkan waktu 16 ms. Jika bagian dalam untuk loop dikomentari (tetapi tidak hashSet.remove(i);
), kode hanya membutuhkan 8 ms.
for val
loop adalah hal yang menghabiskan waktu. Itu remove
masih sangat cepat. Beberapa jenis overhead mengatur iterator baru setelah set telah dimodifikasi ...?
for val
loop lambat. Namun, perhatikan bahwa loop tidak diperlukan sama sekali. Jika Anda ingin memeriksa apakah ada nilai yang berbeda dari -1 di set, akan jauh lebih efisien untuk memeriksa hashSet.size() > 1 || !hashSet.contains(-1)
.