तो मूल रूप से, मेरे पास यह कोड था:
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));
}
}
यह मेरे कंप्यूटर पर छोरों के लिए नेस्टेड को चलाने के लिए 4 जी के चारों ओर ले जाता है और मुझे समझ में नहीं आता है कि इसमें इतना समय क्यों लगा। बाहरी लूप 100,000 बार चलता है, लूप के लिए आंतरिक 1 बार चलना चाहिए (क्योंकि हैशसेट का कोई भी मूल्य -1 नहीं होगा) और एक हैशेट से एक आइटम को हटाने का ओ (1) है, इसलिए लगभग 200,000 ऑपरेशन होने चाहिए। अगर एक सेकंड में आम तौर पर 100,000,000 ऑपरेशन होते हैं, तो मेरा कोड आने के लिए 4s को कैसे लिया जाता है?
इसके अतिरिक्त, यदि लाइन hashSet.remove(i);
पर टिप्पणी की जाती है, तो कोड केवल 16ms का होता है। यदि लूप के लिए आंतरिक पर टिप्पणी की जाती है (लेकिन नहीं hashSet.remove(i);
), कोड केवल 8ms लेता है।
for val
लूप समय लेने वाली चीज है। remove
अभी भी बहुत तेजी से है। सेट को संशोधित किए जाने के बाद किसी प्रकार का ओवरहेड एक नया पुनरावृत्ति सेट करने वाला ...?
for val
। हालाँकि, ध्यान दें कि लूप की बिल्कुल ज़रूरत नहीं है। यदि आप यह जांचना चाहते हैं कि क्या सेट में -1 से भिन्न कोई मान हैं, तो यह जांचना अधिक कुशल होगा hashSet.size() > 1 || !hashSet.contains(-1)
।