Java İlkel veri tipleriyle çalışmak neden gecikme yapar?

4142

Uzman
Katılım
4 Şubat 2024
Mesajlar
2.414
Makaleler
9
Çözümler
5
Beğeniler
1.534
Arkadaşlar merhaba.
LeetCode'de bir problem çözdüm bugün. 6 ms içinde çözüyor.
Kod bu;

Java:
List<Integer> list = new ArrayList<Integer>();

 for(int i: nums1) {

 list.add(i); }

 for(int i: nums2) { list.add(i); }

 Collections.sort(list);

 median = (double)
 (list.get(list.size()/2 -1) + list.get(list.size()/2));
 System.out.println(" ");

 if(list.size() % 2 == 0) {

 median = (double) (list.get(list.size()/2 -1)) + (double)
 (list.get(list.size()/2)); median = median / 2;

 }else {

 median = (double) (list.get((int) (list.size()-1)/2)); }
 return median;

Dedim o kadar koleksiyon sınıfı çağırdım, polimorfizim falan yaptım, ilk türler ile yapsam herhalde 1 ms falan alırım.
2. Denediğim kod da bu;

Java:
double median = 0.0;

 int[] list = new int[nums1.length + nums2.length];

 int a = 0;

 for (int i : nums1) {

 list[a] = i;
 a++;
 }

 for (int i : nums2) {

 list[a] = i;
 a++;
 }

 for (int i = 0; i < list.length; i++) {

 for (int j = 0; j < list.length - 1; j++) {

 if (list[i] < list[j]) {

 a = list[i];
 list[i] = list[j];
 list[j] = a;

 }
 }

 }

 if (list.length % 2 == 0) {

 median = (double) (list[list.length / 2 - 1]) + (double) (list[list.length / 2]);
 median = median / 2;

 } else {

 median = (double) (list[(int) (list.length - 1) / 2]);
 }

 return median;

Arkadaşlar çok bildiğimden değil de ilkel veri tipleriyle çalışmak daha hızlı olur diye düşündüm ama 35 MS. Çözüyor böyle.

Niye böyle? Şimdi ikinci çözümde for içinde for ama birinci kodda da hazır metot kullandım yani. Hem Heap'e veri kaydediyor hem de sıralama yapıyor. Muhakkak for döngüsü vardır yani.
 
Son düzenleme:
Çok fazla Java bilmiyorum ama Collections.sort fonksiyonu iç fonksiyon olduğu için büyük ihtimalle daha optimizedir.
 
Çok fazla Java bilmiyorum ama Collections.sort fonksiyonu iç fonksiyon olduğu için büyük ihtimalle daha optimizedir.

Timesort kullanıyormuş diyor Chat GPT. Ben Bubble kullandım, ondan olabilir. Timesort uygulayıp, öyle çözeyim. Yeni şeyler öğreneyim.

4 MS.'ye düştü böyle.
 
Son düzenleyen: Moderatör:
Ben Bubble kullandım, ondan olabilir.

Evet, bu oldukça etkiliyor. n * log(n), n^2'ye (Aslında n * (n - 1) / 2 ama çok fark ettirmiyor.) göre çok daha küçük kalıyor ve dolayısıyla Collections.sort çok daha iyi performans sergiliyor. Yer yer complexity'si O(n)'e bile yaklaşabiliyormuş bu metodun.

İki çözümde de sıralama, en ağır kısım.

Çözüm kodunuzdan tahmin ettiğim üzere problem bu. Dizilerin toplam uzunluğu en fazla 2000 olabiliyor sınırlara göre, ikinci çözümünüz bu sayede geçebiliyor. Bu değer 100.000'e falan çıkabilseydi -ki genelde bu tür sorularda sınırlar buna benzer olur- ikinci çözümünüz zaman aşımından kurtulamazdı. 10.000 bile zorlardı.
 
Vallahi artık bunu elde ettim en son;


Gariban işi ama yüzde 40'ından iyi çözmüşüm, ehe .
 
Timesort kullanıyormuş diyor Chat GPT. Ben Bubble kullandım, ondan olabilir. Timesort uygulayıp, öyle çözeyim. Yeni şeyler öğreneyim.

4 MS.'ye düştü böyle.
Bubble aklına gelebilecek en yavaş sort algoritmalarından biri. Daha yavaşı muhtemelen adı üstünde olacak ama Slow sort. (O(n^log(n))) Diğeri de bogo sort (O((n+1)!)). Başka da aklıma gelmiyor. İkisi de meme algoritmaları bu bubble'dan yavaş olanların.

Quick sort'a da bakabilirsin. Worst case senaryolarında, timsort daha hızlı, quicksort ise O(n^2), bubble'ın ortalama durumu hızında. İkisi de O(n*log(n)) ortalama durumlarda. Partial ordered datada timsort daha hızlıdır, daha random data da quicksort. Detaylı olarak ikisinin de mantığını google'da bulursun.
 
Bubble yavaş ama kullanımı açısından çok pratik buluyorum. Her arama şeyine uyuyor resmen.

Bubble yavaş ama kullanımı açısından çok pratik buluyorum. Her arama şeysine uyuyor resmen.
Bubble'dan kastım sıralama yapması değil, çift for döngüsü yani.
 
Son düzenleyen: Moderatör:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…