Yapay zekadan makale özeti
- Kısa
- Ayrıntılı
- Bu video, bir eğitmen tarafından sunulan Java programlama dili eğitim içeriğidir. Eğitmen, array kavramı ve sıralama algoritmaları hakkında detaylı bilgiler vermektedir.
- Video, Java'da array kavramının tanımı ve özellikleri ile başlayıp, bubble sort, selection sort ve insertion sort gibi sıralama algoritmalarının çalışma prensiplerini ve kodlamalarını adım adım anlatmaktadır. Her algoritmanın O(n²) karmaşıklık derecesine sahip olduğu vurgulanmakta ve kod örnekleri ile görsel açıklamalar kullanılarak konular pekiştirilmektedir. Video sonunda, faktöriyel hesaplama örneği üzerinden recursive fonksiyonlar konusuna giriş yapılmaktadır.
- Eğitim içeriğinde array'in temel özellikleri, memory kullanımı, indeksleme, sıfırdan başlama prensibi gibi konular ele alınmakta ve her sıralama algoritmasının nasıl çalıştığı, döngülerin nasıl yapılandırıldığı ve elemanların nasıl karşılaştırıldığı detaylı şekilde açıklanmaktadır. Recursive fonksiyonlar konusunda ise stack overflow hatası gibi kritik noktalara da değinilmektedir.
- 00:16Java'da Array Kavramı
- Java'da array, belli başlı objelerdir ve içerisinde tutulan eleman sayısını bilmektedir.
- Array'lerin boyutu oluşturulduktan sonra değiştirilemez, sabittir.
- Array'lerin en önemli özellikleri kontenjs özelliğidir, yani boş olsalar bile belirli bir alan kaplarlar.
- 01:52Array'lerin Çalışma Prensibi
- Array'lerde indeks, bir elemana erişmek için kullanılan sayıdır ve sıfırdan başlar.
- Her bir integer elemanı 4 byte'lık bir alan kaplar.
- Array'lerde her bir elemanın memory'deki lokasyonu hesaplanabilir, bu sayede hızlı erişim sağlanır.
- 04:55Array'lerde Veri Tipleri
- Integer array'lerde her bir eleman 4 byte'lık bir sayıdır.
- Object veya string array'lerinde ise memory'deki referanslar tutulur.
- Referanslar, objelerin memory'deki lokasyonlarını gösterir.
- 08:04Array'lerde Time Kompleksite
- Array'lerde bir elemana erişim sabit bir time kompleksiteye sahiptir (O(1)).
- İndeks üzerinden bir elemanı silmek de sabit bir time kompleksite gerektirir.
- Değer üzerinden bir elemanı bulmak veya silmek ise O(n) time kompleksiteye sahiptir.
- 10:53Array'lerin Sınırlamaları
- Array'lerin indeksleri sıfırdan başlar çünkü bu sayede memory lokasyonu hesaplaması daha hızlı olur.
- Teorik olarak bir array'in alabileceği maksimum eleman sayısı Integer.MAX_VALUE - 1'dir.
- Bu teorik maksimum değer, mevcut memory kapasitesine bağlı olarak uygulamada çalışmayabilir.
- 15:34Array ve Memory Sorunları
- Array'lerde maksimum integer değeri, lokal makinenin memory'sine bağlı olarak sınırlıdır.
- Büyük array'ler tanımladığımızda memory sorunlarına neden olabilir ve out of memory exception'lar alabiliriz.
- Array'ler, elemanlarını hızlı bir şekilde erişmemizi sağlayan, kontenjanslı (kontenjanslı: belirli bir boyut ve sıralı yapıya sahip) bir veri yapısıdır.
- 17:10Array İşlemlerinin Karmaşıklığı
- Array'lerde herhangi bir elemana indeks üzerinden ulaşmak kolaydır, ancak belirli bir değere sahip elemanın indeksini bulmak karmaşık olabilir.
- Array boyutunu değiştirmek (örneğin 10 elemanlı bir array'i 13 elemanlı yapmak) için yeni bir array oluşturmak ve eski array'in tüm elemanlarını yeni array'e kopyalamak gerekir.
- Array boyutunu değiştirmek veya düşürmek O(n) karmaşıklığına sahiptir çünkü her eleman teker teker kopyalanır.
- 19:08Array'in Memory Özellikleri
- Bazı dillerde array'ler kontenjanslı yapıya sahiptir, yani bellekte sürekli bir alan kaplar.
- Array'in her bir elemanı için bellek referansı belirli olduğundan, array'in toplam bellek kullanımını önceden hesaplayabiliriz.
- Array'in bellek alanını başka bir obje kullanmak için kullanamazsınız çünkü o alan array'e tahsis edilmiş durumdadır.
- 20:39Diğer Veri Yapıları ve Sorting Algoritmaları
- Array'in en önemli özelliği kontenjanslı yapıya sahip olması, bu da indeksini bildiğimiz verilere O(1) karmaşıklıkla ulaşmamızı sağlar.
- Sorting algoritmaları genellikle O(n²) karmaşıklığına sahiptir ve en kötü senaryoda n kare kadar işlem yapmak gerekir.
- Bugün bubble sort, selection sort ve insertion sort algoritmaları incelenecek ve ayrıca recursion ile faktöriyel işlemi yapılacaktır.
- 23:37Bubble Sort Algoritması
- Bubble sort, aynı array üzerinde işlem yapar ve array'i sıralı ve sıralanmamış iki parçaya böler.
- Amacımız sıralanmamış parçadan kurtulmak ve tüm array'i sıralı hale getirmektir.
- Bubble sort, array'in içerisindeki her bir elemanı bir sonraki elemanla karşılaştırarak büyüklük-küçüklük kontrolü yapar ve gerekirse yer değiştirme (swap) işlemi gerçekleştirir.
- 30:35Bubble Sort Algoritması
- Bubble sort algoritmasında array içinde swap işlemleri yaparak en büyük değerleri sona doğru taşır.
- İlk iterasyonda en büyük değer orta kısma gelir ve bu değer artık sıralanmış kısım olarak kabul edilir.
- İkinci iterasyonda işlem kırmızı alanda devam eder ve bu şekilde devam ederek array sıralanır.
- 33:43Algoritmanın Zaman Karmaşıklığı
- İlk iterasyonda dokuz elemanlı bir array için dokuz kere işlem yapılır.
- İkinci iterasyonda da benzer şekilde işlem yapılır ve bu şekilde for içinde for döngüsü oluşturulur.
- Bu algoritmanın zaman karmaşıklığı O(n²) olur.
- 35:08Bubble Sort Kodlaması
- Bubble sort, selection ve insert sorting algoritmaları incelenecektir.
- Bubble sort algoritmasında turuncu kısım sıralanmış (sorted) kısmı, mavi kısım ise sıralanmamış (unsorted) kısmı temsil eder.
- Algoritma iki for döngüsü kullanarak çalışır ve time kompleksitesi O(n²) olan bir sonuç verir.
- 36:41Bubble Sort Kodunun Yazılması
- Bubble sort metodunda bir int array döndüren bir metod yazılacaktır.
- Metodun içinde ilk iterasyon için bir for döngüsü açılır ve lastSortedIndex değeri arrayin son indeksi olarak atanır.
- İkinci iterasyonda i değeri 0'dan başlayıp lastSortedIndex'e kadar artarak, elemanlar birbirleriyle karşılaştırılır ve gerekirse swap işlemi yapılır.
- 44:26Swap Metodu
- Swap metodu, array üzerinde işlem yapacak ve i ve j parametreleriyle çağrılacaktır.
- Swap metodunda i ve j eşitse herhangi bir işlem yapılmaz, aksi halde temp değişkeni kullanılarak i ve j indeksli elemanlar yer değiştirir.
- Bubble sort metodunda swap metodu çağrılır ve array sıralanır.
- 48:41Bubble Sort ve Time Kompleksitesi
- Konuşmacı, bir kod örneği oluşturmak için "for" döngüsü kullanıyor ve "inter" içindeki her bir eleman için belirli bir işlem yapılıyor.
- Bubble sort algoritmasının time kompleksitesi O(n²) olarak değerlendiriliyor çünkü iki tane iç içe for döngüsü kullanılıyor ve array'in boyutu arttıkça işlem süresi kare şeklinde artıyor.
- Bubble sort, en kötü senaryoda sürekli swap işlemi yapmak zorunda kalıyor, bu da algoritmanın verimliliğini düşürüyor.
- 52:52Selection Sort Tanıtımı
- Selection sort, bubble sort'tan farklı olarak sürekli swap işlemi yapmıyor, en büyük (veya en küçük) elemanı bulmaya odaklanıyor.
- Selection sort'ta en büyük eleman bulunduğunda, sadece o elemanın bulunduğu lokasyonla değiştirme işlemi yapılıyor.
- Selection sort'un da time kompleksitesi O(n²) çünkü iki tane iç içe for döngüsü kullanılıyor.
- 54:12Selection Sort Çalışma Prensibi
- Selection sort'ta önce en küçük (veya en büyük) eleman bulunuyor ve bu eleman ile ilk indeksteki eleman değiştiriliyor.
- Algoritma, her adımda sıralanmamış kısım içindeki en küçük (veya en büyük) elemanı bulup, sıralanmış kısımın sonuna ekliyor.
- Karşılaştırma işlemi yeşil renk ile gösteriliyor ve swap işlemi daha az gerçekleşiyor, ancak kompleksite hala O(n²) kalıyor.
- 57:46Selection Sort Kodlama
- Selection sort kodlaması için ilk for döngüsü aynı kalacak, ancak swap işlemi sadece belirli elemanlar arasında yapılacak.
- Algoritma, büyük elemanları sağa toplayarak işlem yapacak ve sondan başlayarak azaltarak işlemi gerçekleştiricek.
- "largest" adında bir değişken tanımlanacak ve sıfırıncı elemandan başlanacak, ardından 1'den başlayarak "last unsorted index"e kadar devam edecek.
- 1:01:28Selection Sort Algoritması
- Selection sort algoritmasında, "largest index" olarak adlandırılan değişken, dizideki en büyük değerin indeksini tutar.
- Algoritma, dizinin son elemanından başlayarak geriye doğru ilerler ve her iterasyonda "unsorted" kısmında en büyük değeri bulur.
- Bulunan en büyük değer, "unsorted" kısmının son elemanıyla yer değiştirilir, böylece "sorted" kısmın genişler.
- 1:05:21Selection Sort'un Çalışma Prensibi
- Selection sort, bubble sort'un aksine her adımda tüm elemanları karşılaştırmaz, sadece "unsorted" kısmında en büyük değeri bulur.
- Algoritma, "unsorted" kısmında en büyük değerin indeksini bulduktan sonra, bu değeri "unsorted" kısmının son elemanıyla değiştirir.
- Her iterasyon sonunda "sorted" kısmın bir eleman artar ve "unsorted" kısmın bir eleman azalır.
- 1:08:02Insertion Sort Algoritması
- Insertion sort algoritmasında, dizinin ilk elemanı "sorted" kısmına alınır ve diğer elemanlar "unsorted" kısmında tutulur.
- Algoritma, "unsorted" kısmından bir eleman alır ve "sorted" kısmında uygun bir yere yerleştirir.
- Yerleştirme işlemi sırasında, "sorted" kısmındaki elemanlar gerekirse kaydırılır.
- 1:11:31Insertion Sort'un Çalışma Prensibi
- Insertion sort, "unsorted" kısmından bir eleman alıp, "sorted" kısmındaki elemanlarla karşılaştırarak uygun bir yere yerleştirir.
- Karşılaştırma sırasında, "sorted" kısmındaki elemanlar gerekirse kaydırılır, böylece yer açılır.
- Her iterasyon sonunda "sorted" kısmın bir eleman artar ve "unsorted" kısmın bir eleman azalır.
- 1:15:11Algoritmaların Zaman Karmaşıklığı
- Selection sort ve insertion sort algoritmaları, her ikisi de O(n²) zaman karmaşıklığına sahiptir.
- Her iki algoritmadaki de iç içe geçmiş iki for döngüsü bulunur, bu da O(n²) karmaşıklığını açıklar.
- 1:15:55Insertion Sort Algoritması
- Insertion Sort algoritmasında swap işlemi yoktur, sadece kopyalama işlemi yapılır.
- Insertion Sort, sıfırıncı indeks yerine birinci indeksten (first unsorted index) başlar ve sıfırıncı indeks orta kısım olarak değerlendirilir.
- Diğer sıralama algoritmalarında iterasyon en başında bütün array değerlendirilirken, Insertion Sort'ta ilk eleman tek başına değerlendirilir.
- 1:17:41Insertion Sort Kodlama
- İlk iterasyon birinci elemandan başlar ve "first unsorted index" olarak adlandırılır.
- Algoritma, "first unsorted index" değeri array'in uzunluğundan küçük olduğu sürece devam eder.
- Birinci eleman "element" olarak tanımlanır ve ikinci bir for döngüsü ile sıfırdan büyük olan elemanlarla karşılaştırılır.
- 1:22:57Insertion Sort'un Çalışma Prensibi
- Eğer karşılaştırılan eleman "element"ten büyükse, sağa kaydırma işlemi yapılır ve "element" için yer açılır.
- Insertion Sort, for döngüsü içerisinde for döngüsü olduğu için time karmaşıklığı n kare olur.
- Insertion Sort, array'i ilk başta iki parçaya bölerken (orted ve unsorted), Bubble Sort ve Selection Sort'da array tamamen unsorted olarak başlar.
- 1:26:46Faktöriyel Hesaplama ve Recursion
- Bir sonraki konu recursion olacak ve faktöriyel hesaplama örneği ile başlanacak.
- Faktöriyel hesaplama için statik bir metot oluşturulacak ve integer değer döndürülecek.
- Faktöriyel hesaplaması için sıfırın faktöriyeli 1'dir ve bir sayının faktöriyeli, o sayıya kadar olan bütün sayıların çarpımıdır.
- 1:29:29Faktöriyel Hesaplama ve For Döngüsü Kullanımı
- Faktöriyel hesaplaması için 1! = 1, 2! = 2×1, 3! = 3×2×1 şeklinde devam eden bir işlem yapılıyor.
- Faktöriyel hesaplaması için for döngüsü kullanılabilir ve 0! = 1 olduğunu bilmek gerekir.
- For döngüsü içinde bir değişken tanımlanarak, verilen sayıdan başlayıp 1'e kadar azalarak tüm sayıların çarpımı hesaplanabilir.
- 1:33:17Recursive Fonksiyon Kullanımı
- Faktöriyel hesaplaması için recursive (kendini çağıran) fonksiyon kullanılabilir, bu daha basit ve okunaklı bir yöntemdir.
- Recursive faktöriyel fonksiyonunda, faktöriyel(value) = value × faktöriyel(value-1) şeklinde kendini tekrar tekrar çağırarak hesaplama yapılır.
- Recursive fonksiyonların en kritik noktalarından biri, recursive çağrının bir yerde kesildiğinden emin olmak çünkü aksi takdirde stack overflow hatası oluşabilir.