Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Veri yapilari algoritmalar #584

Open
wants to merge 32 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
ef19617
algoritma nedir oluşturuldu
yigitatesh Sep 10, 2021
1601f5a
bilgi ifade oluşturuldu
yigitatesh Sep 10, 2021
485a79b
sayı sistemleri oluşturuldu
yigitatesh Sep 10, 2021
5d63f33
sayı sistemi edit
yigitatesh Sep 11, 2021
14a7421
sayısal olmayan eklendi
yigitatesh Sep 11, 2021
b671907
veri tutulma eklendi
yigitatesh Sep 11, 2021
efafdc5
recursion eklendi
yigitatesh Sep 11, 2021
780564b
array eklendi
yigitatesh Sep 11, 2021
4c66453
linked list eklendi
yigitatesh Sep 11, 2021
43d26d9
linked list vs array eklendi
yigitatesh Sep 11, 2021
d5e1f38
linked list add delete eklendi
yigitatesh Sep 11, 2021
ee118dd
stack eklendi
yigitatesh Sep 11, 2021
c65cf36
queue eklendi
yigitatesh Sep 11, 2021
968dad8
hash table eklendi
yigitatesh Sep 11, 2021
977b417
hash function eklendi
yigitatesh Sep 11, 2021
91a2674
hash function eklendi
yigitatesh Sep 11, 2021
f76e173
hash table edit
yigitatesh Sep 11, 2021
607d4ba
hash collision eklendi
yigitatesh Sep 11, 2021
47435a8
algoritma analizi eklendi
yigitatesh Sep 11, 2021
83e21fd
ödev 1 ve düzeltmeler
yigitatesh Sep 11, 2021
ac18dd5
ram model eklendi
yigitatesh Sep 11, 2021
493a965
time complexity eklendi
yigitatesh Sep 11, 2021
86c524b
big o eklendi
yigitatesh Sep 11, 2021
3628c27
sorting eklendi
yigitatesh Sep 11, 2021
ca70b07
selection sort eklendi
yigitatesh Sep 12, 2021
36e5035
merge sort eklendi
yigitatesh Sep 12, 2021
590d81e
quick sort eklendi
yigitatesh Sep 12, 2021
bacfd80
linear search eklendi
yigitatesh Sep 12, 2021
eea5feb
binary search eklendi
yigitatesh Sep 12, 2021
414b9da
binary search tree eklendi
yigitatesh Sep 12, 2021
3af702a
genel düzenleme
yigitatesh Sep 12, 2021
88a8760
ödevler eklendi
yigitatesh Sep 12, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 40 additions & 1 deletion veri-yapilari-algoritmalar/algoritma-analiz/readme.md
Original file line number Diff line number Diff line change
@@ -1 +1,40 @@
#
# Konu Metni

## Algoritma Analizi

Bir problem, farklı algoritmalar kullanılarak çözülebilir. Peki bu farklı algoritmalardan hangisini kullanmalıyız nasıl karar vereceğiz?

Algoritma analizi yaparak algoritmaları bazı kriterler kullanarak karşılaştırabiliriz. Genel olarak 3 karşılaştırma kriteri vardır:

* Programın çalışma zamanı
* Programın çalışırken kullandığı hafıza miktarı
* Programcının, programı yazarken ne kadar süre harcadığı süre

Duruma göre bu kriterlerden bazıları daha önem kazanabilir. Örneğin, bir programın yazılması gereken süre çok geniş ise programın çalışma zamanı ve kullandığı hafıza daha önemli hale gelebilir.

### Programın çalışma zamanı

Programın çalışma zamanı denilince akla ilk başta programın kaç saniyede çalıştığı gelebilir. Ancak bu göreceli bir ifadedir ve yerine göre çok farklı değerler alabilir. Bir programın kaç saniyede çalıştığı; programlama dilinden programlama diline, bilgisayardan bilgisayara hatta aynı bilgisayarda farklı zamanlarda çalıştırıldığında bile değişiklik gösterebilir. Bu sebeple çalışma zamanı **girdi sayısı ile çalışma süresinin ilişkisi** incelenerek bulunur. Bu şekilde **evrensel** bir çalışma zamanı ifadesi elde edilir.



# Sorular

1. Her programın çalışma süresi girdi sayısı arttıkça artar mı?

Cevap: Hayır. Örneğin, bir array'de istenilen eleman anında bulunabildiği için array'in eleman sayısı artsa da istenilen elemanın bulunma süresi değişmez.

2. Bir linked list'te istenilen bir elemanın ortalama bulunma süresi, linked list'in eleman sayısı arttıkça artar mı?

Cevap: Evet, artar. 10 elemanlı bir linked list'te ortalama 5 elemanın dolaşılması gerekiyorsa 20 elemanlı bir linked list'te ortalama 10 elemanın dolaşılması gerekir.

3. Bir linked list'in başına eleman eklenme süresi, eleman sayısı arttıkça artar mı?

Cevap: Hayır, artmaz. Bir linked list'te ilk elemanın yeri bilindiğinden dolayı anında eleman eklenebilir.



# Ücretsiz Kaynak

* [Medium paylaşımı](https://medium.com/@sgoksel/algoritma-analizi-ve-big-o-notasyonu-3b7aefa8a051) linkinde bir algoritma analizi anlatımı bulabilirsiniz.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
66 changes: 65 additions & 1 deletion veri-yapilari-algoritmalar/algoritma-nedir/readme.md
Original file line number Diff line number Diff line change
@@ -1 +1,65 @@
#
# Konu Metni

## Algoritma Nedir

Algoritma, bir problemin çözümü için yapılması gereken işlemler bütünüdür.



Çok basit bir örnek olarak "**kahvaltı yapmak**" probleminin çözümü şöyledir:

1. Başla
2. Masayı ve yemekleri hazırla
3. Yemeğini ye
4. Masayı topla
5. Bitir

Örnekte görüldüğü gibi, bir algoritmada her adımda bir işlem yapılır ve bu işlemlerin sırası bellidir. Ayrıca, her algoritmanın bir başlangıcı ve bir bitişi vardır.



### Akış Şeması

Bir algoritmayı görselleştirmek için kullanılan bloklar bütününe **akış şeması** denir.

Akış şemasında bloklar yapılacak işlemleri ve sorulacak soruları, oklar ise bir işlemden hangi işleme geçileceğini gösterir. Örnek bir akış şeması olarak "**bir lambanın çalışmaması**" probleminin çözüm algoritması aşağıda gösterilmiştir:

![](https://raw.githubusercontent.com/yigitatesh/Kodluyoruz/main/figures/veri-yapilari-algoritmalar/lamba_algoritma.jpg)

Görüldüğü gibi sorun çözülene kadar farklı işlemler yapılıyor ve sorun çözüldüğünde işlemler bitiriliyor.



# Sorular

1. Kullanıcıdan iki adet sayı isteyen, bu iki sayıyı toplayan ve toplamı gösteren programın algoritmasını yazınız.

Cevap:

1. Başla
2. A sayısını iste
3. B sayısını iste
4. A ve B sayısının toplamını C sayısına yaz
5. C sayısını göster
6. Bitir

2. Algoritma ismi nereden gelmektedir, araştırıp yazınız.

Cevap: El Harezmi

3. Bir kağıda ya da Paint gibi bir program kullanarak aşağıda verilen "**bir kullanıcının sisteme girişi**" algoritmasını çiziniz.

1. Başla
2. Kullanıcı adını iste
3. Kullanıcı adı kayıtlı değil ise 2. adıma dön, kayıtlı ise 4. adıma geç
4. Şifreyi iste
5. Kullanıcının şifresi yanlış girildiyse 4. adıma dön, doğru girildiyse 6. adıma geç
6. Sisteme girişe izin ver
7. Bitir



# Ücretsiz Kaynak

* Algoritma hakkında daha çok bilgi edinmek için https://tr.wikipedia.org/wiki/Algoritma sayfasına göz atabilirsiniz.

35 changes: 34 additions & 1 deletion veri-yapilari-algoritmalar/array/readme.md
Original file line number Diff line number Diff line change
@@ -1 +1,34 @@
#
# Konu Metni

## Array

Array, birden çok verinin art arda olacak şekilde tutulduğu bir veri yapısıdır.

Örneğin; bir öğrencinin sınav notları, notların sırayla tutulduğu bir array'dir. Birden fazla ve aynı tipteki veriler tutulur. Örneğin, bir bowling maçındaki skorlar da bir skor array'idir.

Array'ler için bilgisayarda ilk başta bir büyüklük belirlenir. Örneğin, bir öğrenci 3 sınav olacaksa 3 veri alabilecek kapasitede bir array oluşturulur. Sonra da bu boşluklara notlar yerleştirilir. Peki öğrenci bir de mazeret sınavına girmek isterse ne olur?

Array, başta 3 kapasitesinde olduğundan dolayı 4 kapasitesine çıkarılması gerekir. Bu işlem bir kapasite artırmak olarak düşünülüp hızlı olması gerektiği söylenebilir. Ancak, 3 kapasiteli array'e eklenecek olan 4. boşluk da o array'in bitişiğinde olmalıdır. Bu kural, array'lerde hızlı bir şekilde istenilen elemana ulaşılması için gereklidir. 3 kapasiteli array'in yanında önemli bir bilgi olabileceğinden dolayı bir tane boşluk eklenmek yerine, array 4 kapasiteli ve boş olduğu bilinen bir noktaya kopyalanır ve orijinal array de silinir. Böylece, 4 kapasitesinde bir array elde edilir.

Görüldüğü gibi bir array'e, tüm boşlukları dolu iken yeni bir veri eklemek masraflıdır. Bir avantaj olarak ise, array içindeki tüm veriler bitişik bir halde tutulduğundan dolayı istenilen sıradaki veriye çok hızlı bir şekilde ulaşılabilir.



# Sorular

1. Kapasitesi dolmuş bir array'e yeni bir veri eklerken neden array başka bir alana kopyalanır?

Cevap: Array yapısı hafızada bitişik bir şekilde saklandığından dolayı array'in boyutu büyütülmek istendiğinde, hafızada başka bir yerde boş bir blok bulunmalı ve array elemanları oraya kopyalanmalıdır.

2. Bir array'de sırası bilinen bir elemana ulaşmak neden çok hızlıdır?

Cevap: Çünkü array yapısı hafızada bitişik olarak tutulur ve her elemanın nerede olduğu ilk elemanın yerine bakılarak bulunabilir.

3. Gerçek hayattan bir array örneği veriniz.



# Ücretsiz Kaynak

* [Hackerrank problemi](https://www.hackerrank.com/challenges/arrays-ds/problem) linkine giderek verilen array'i ters çevirmeniz gereken problemi çözebilirsiniz.

66 changes: 65 additions & 1 deletion veri-yapilari-algoritmalar/big-o/readme.md
Original file line number Diff line number Diff line change
@@ -1 +1,65 @@
#
# Konu Metni

## Big-O Notasyonu

Big-O notasyonu, bir algoritmanın çalışma zamanının standartlaştırılmış bir şekilde gösterilmesidir. Örneğin, bir isim array'i içinde bir ismi bulmaya çalışıyorsak ve ilk elemandan başlayıp son elemana kadar teker teker dolaşıyorsak bu işlemimizin worst case'i array uzunluğu kadar birim zaman alır. Array uzunluğuna da "n" dersek bu işlem aldığı birim zaman "n" olur. Bu sonucu Big-O notasyonu ile göstericek olursak bu işlemin zamanı "**O(n)**" olur. Bu işlem zamanına, girdi sayısı ne kadar artarsa işlem zamanı o oranda arttığı için, "**doğrusal zaman**" denir.

Örneğin, bir array'de indeksi belirli bir elemana ulaşmaya çalışıyorsak bu işlem anında yapılır. Bu işlemin zamanı da "**O(1)**" şeklinde gösterilir ve "**sabit zaman**" denir.

Bir isim array'inde isimler a'dan z'ye sıralı ise isimleri baştan sona aramamıza gerek yoktur. İlk önce array'in ortasına bakarız ve oradaki isim aradığımız isimden önce geliyorsa array'in sağ tarafında aramaya devam ederiz. Her seferinde bu şekilde ikiye bölerek array'in çoğu kısmını aramamış ve arama işlemini çok daha hızlandırmış oluruz. Her seferinde ikiye böldüğümüz için buradaki worst case, "2^x = n" işleminde x'in bulunmasıyla elde edilir. Bu işlemde "x" sayısı ise "log(n)" sayısına eşittir. Böylece bu işlemin zamanını "**O(log(n))**" olarak bulmuş oluruz. Bu işlem zamanına "**logaritmik zaman**" denir.

Bir programda bir döngü ve o döngünün içinde de bir döngü varsa ve her döngü "n" iterasyon yapıyorsa bu programın zamanı "**O(nxn) = O(n^2)**" olur. Bu duruma ise "**karesiyle ilişkili zaman**" denir.

Aşağıda bazı Big-O notasyonu kuralları verilmiştir:

* Big-O notasyonunda katsayılar ihmal edilir.

Örneğin, "O(2n)" ile "O(n)" aynı zaman anlamına yani "O(n)" anlamına gelmektedir.

* Big-O notasyonunda en yüksek zamanlar seçilir, diğer zamanlar ihmal edilir.

Örneğin, "O(n^2 + 2n + 1)" zamanı "O(n^2)" zamanına eşittir. "2n" ve "1" değerleri "n^2" değerinin yanında önemsiz kalır. Bu ihmalin sebebi de "n" sayısı büyüdükçe "n^2" sayısı çok daha büyük olacağından, bu sayının yanında "2n" ve "1" sayılarının değerinin kalmamasıdır.



# Sorular

1. Aşağıdaki fonksiyonun Big-O notasyonundaki zamanı nedir?

````python
def faktoriyel(x):
if x == 0:
return 1
return x * faktoriyel(x-1)
````

Cevap: Yukarıdaki faktöriyel fonksiyonunda girdi "n" ise yapılan çarpma işlemi sayısı da "n" olur. Sonuç olarak bu fonksiyonun Big-O notasyonu "O(n)" olur.

2. Big-O notasyonu "O(n^2)" olan bir fonksiyon yazınız.

Cevap:

````python
def carp(liste):
"""listenin her elemanını birbiriyle çarparak tüm çarpımları toplar"""
sonuc = 0
for i in range(len(liste)):
for j in liste[i:]:
sonuc += liste[i] * j
return sonuc
````

3. En yavaş çalışacak olan Big-O notasyonu zamanı nedir?

Cevap: O(n^n).

# Ücretsiz Kaynak

* [Medium paylaşımı 1](https://medium.com/kodcular/nedir-bu-big-o-notation-b8b9f1416d30) ve [Medium paylaşımı 2](https://medium.com/@sgoksel/algoritma-analizi-ve-big-o-notasyonu-3b7aefa8a051) linklerinden Big-O notasyonu hakkında bilgi edinebilirsiniz.



# Ödev 4

O(1), O(log(n)), O(n), O(n x log(n), O(n^2), O(n^2 x log(n)), O(n^3) time complexity değerleri için birer örnek bulunuz.

35 changes: 34 additions & 1 deletion veri-yapilari-algoritmalar/bilgi-ifade/readme.md
Original file line number Diff line number Diff line change
@@ -1 +1,34 @@
#
# Konu Metni

## Bilginin bilgisayarda ifade edilmesi

Bilgisayarda tüm bilgiler sadece **0** ve **1** sembollerini kullanılarak ifade edilir. Bu 0 ve 1 sembolleri ise aslında bilgisayardaki "transistör" adındaki parçaların elektrikle yüklü olup olmadıklarıdır. Bir transistörde elektrik varsa 1, elektrik yoksa 0 anlamına gelir.



### Bilgisayarın ve insanların bilgiyi ifade etmesi

Biz insanlar bilgiyi ifade etmek için birçok sembol kullanırız. Örneğin; "araba" gibi bir yazıyı ifade etmek için harfleri, "42" gibi bir sayıyı ifade etmek için sayıları, bir resmi ifade etmek için ise renkleri kullanırız. Bilgisayarlar ise aklınıza gelebilecek her bilgiyi 0 ve 1 sembollerini kullanarak ifade eder. Örneğin; bir resim bilgisayar için bir pikseller bütünüdür ve her piksel de kırmızı, yeşil ve mavi renklerinin belli oranlarda karışımından oluşur. Bilgisayar, pikselleri resimdeki sırasıyla tutar ve her pikseli de 3 tane sayı olarak tutar.

Sonuç olarak, biz insanlar farklı türden bilgileri ifade etmek için birçok sembol ve yöntem kullanırız. Bilgisayarlar ise her türlü bilgiyi 0 ve 1 sembollerini kullanarak ifade eder.



# Sorular

1. Bilgisayarda bilgi kaç farklı sembolle ifade edilir.

Cevap: 2

2. Bilgisayarda 0 ve 1 bilgisinin tutulduğu elektronik parçanın adı nedir?

Cevap: Transistör

3. Bilgisayarlar bir harfi nasıl ifade edebilir? Araştırınız.



# Ücretsiz Kaynak

* [Bilginin ifadesi slaytı](https://slideplayer.biz.tr/slide/2798593/) linkindeki slayta göz atabilirsiniz.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading