Skip to content

Commit 658bca1

Browse files
Merge pull request #86 from inzva/muratbiberoglu-patch
updated filenames & separated content of ds page
2 parents 4f7a75d + 547c07c commit 658bca1

34 files changed

+836
-736
lines changed

docs/algorithms-i/index.md renamed to docs/algorithms/index.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
---
2-
title: Algorithms - I
2+
title: Algorithms
33
tags:
4-
- "Algorithms"
4+
- Algorithms
5+
- Linear Search
6+
- Binary Search
7+
- Ternary Search
8+
- Sorting Algorithms
9+
- Insertion Sort
10+
- Merge Sort
11+
- Quick Sort
12+
- Radix Sort
13+
- Quickselect Algorithm
14+
- Divide and Conquer
515
---
616

717
**Editor:** Kadir Emre Oto

docs/data-structures-i/index.md

Lines changed: 0 additions & 698 deletions
This file was deleted.

docs/data-structures/deque.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
title: Deque
3+
tags:
4+
- Data Structures
5+
- Deque
6+
---
7+
8+
Deque veri yapısı stack ve queue veri yapılarına göre daha kapsamlıdır. Bu veri yapısında yapının en üstüne eleman eklenebilirken aynı zamanda en altına da eklenebilir. Aynı şekilde yapının hem en üstündeki elemanına hem de en alttaki elemanına erişim ve silme işlemleri uygulanabilir. Bu veri yapısında uyguluyabildiğimiz işlemler:
9+
10+
- Veri yapısının en üstüne eleman ekleme.
11+
- Veri yapısının en altına eleman ekleme.
12+
- Veri yapısının en üstündeki elemanına erişim.
13+
- Veri yapısının en altındaki elemanına erişim.
14+
- Veri yapısının en üstündeki elemanı silme.
15+
- Veri yapısının en altındaki elemanı silme.
16+
17+
C++ dilindeki STL kütüphanesinde bulunan hazır deque yapısının kullanımı aşağıdaki gibidir:
18+
19+
```c++
20+
int main() {
21+
deque<int> q;
22+
q.push_front(5); // deque'nin en altina 5'i ekler.
23+
q.push_back(6); // deque'nin en ustune 6'yi ekler.
24+
int x = q.front(); // deque'nin en altindaki elemanina erisim.
25+
int y = q.back(); // deque'nin en ustundeki elemanina erisim.
26+
q.pop_front(); // deque'nin en altindaki elemanini silme.
27+
q.pop_back(); // deque'nin en ustundeki elemanini silme.
28+
}
29+
```
30+
31+
**P.S.** deque veri yapısı stack ve queue veri yapılarına göre daha kapsamlı olduğundan ötürü stack ve queue veri yapılarına göre 2 kat fazla memory kullandığını açıklıkla söyleyebiliriz.

docs/data-structures/fenwick-tree.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
---
2+
title: Fenwick Tree
3+
tags:
4+
- Data Structures
5+
- Fenwick Tree
6+
- Binary Indexed Tree
7+
- BIT
8+
---
9+
10+
Binary Indexed Tree olarak da bilinen Fenwick Tree, [Prefix Sum](prefix-sum.md) ve [Sparse Table](sparse-table.md) yapılarına benzer bir yapıda olup dizi üzerinde değişiklik yapabilmemize olanak sağlayan bir veri yapısıdır. Fenwick Tree'nin diğer veri yapılarına göre en büyük avantajı pratikte daha hızlı olması ve hafıza karmaşıklığının $\mathcal{O}(N)$ olmasıdır. Ancak Fenwick Tree'de sadece prefix cevapları (veya suffix cevapları) saklayabildiğimizden aralıklarda minimum, maksimum ve EBOB gibi bazı sorguların cevaplarını elde edemeyiz.
11+
12+
## Yapısı ve Kuruluşu
13+
14+
$g(x)$, $x$ sayısının bit gösteriminde yalnızca en sağdaki bitin 1 olduğu tam sayı olsun. Örneğin $20$'nin bit gösterimi $(10100)_2$ olduğundan $g(20)=4$'tür. Çünkü ilk kez sağdan $3.$ bit $1$'dir ve $(00100)_2=4$'tür. Fenwick Tree'nin $x$ indeksli düğümünde, <span style="white-space: nowrap">$x - g(x) + 1$</span> indeksli elemandan $x$ indeksli elemana kadar olan aralığın cevabını saklayacak şekilde kurulur.
15+
16+
<figure markdown="span">
17+
![8 uzunluğundaki bir dizi için kurulmuş Fenwick Tree yapısı](img/fenwick.png){ width="80%" }
18+
<figcaption>$8$ uzunluğundaki bir dizi için kurulmuş Fenwick Tree yapısı</figcaption>
19+
</figure>
20+
21+
22+
## Sorgu Algoritması
23+
24+
Herhangi bir $[1,x]$ aralığı için sorgu algoritması sırası ile şu şeklide çalışır:
25+
26+
1. Aradığımız cevaba $[x - g(x) + 1,x]$ aralığının cevabını ekle.
27+
2. $x$'in değerini $x - g(x)$ yap. Eğer $x$'in yeni değeri $0$'dan büyük ise $1.$ işlemden hesaplamaya devam et.
28+
29+
$[1,x]$ aralığının cevabını hesaplamak için yapılan işlem sayısı $x$ sayısının $2$'lik tabandaki yazılışındaki $1$ sayısına eşittir. Çünkü her döngüde $x$'ten $2$'lik tabandaki yazılışındaki en sağdaki $1$ bitini çıkartıyoruz. Dolayısıyla sorgu işlemimiz $\mathcal{O}(\log N)$ zaman karmaşıklığında çalışır. $[l,r]$ aralığının cevabını da $[1,r]$ aralığının cevabından $[1,l - 1]$ aralığının cevabını çıkararak kolay bir şekilde elde edebiliriz.
30+
31+
> NOT: $g(x)$ değerini bitwise operatörlerini kullanarak aşağıdaki eşitlikle kolay bir şekilde hesaplayabiliriz:
32+
> \\[g(x) = x \ \& \ (-x)\\]
33+
34+
## Eleman Güncelleme Algoritması
35+
36+
Dizideki $x$ indeksli elemanının değerini güncellemek için kullanılan algoritma şu şeklide çalışır:
37+
38+
- Ağaçta $x$ indeksli elemanı içeren tüm düğümlerin değerlerini güncelle.
39+
40+
Fenwick Tree'de $x$ indeksli elemanı içeren maksimum $\log(N)$ tane aralık olduğundan güncelleme algoritması $\mathcal{O}(\log N)$ zaman karmaşıklığında çalışır.
41+
42+
## Örnek Kod Parçaları
43+
44+
```c++
45+
const int n;
46+
int tree[n + 1], a[n + 1];
47+
48+
void add(int val, int x) { // x indeksli elemanin degerini val degeri kadar artirir.
49+
// x indeksinin etkiledigi butun dugumleri val degeri kadar artirir.
50+
while (x <= n) {
51+
tree[x] += val;
52+
x += x & (-x);
53+
}
54+
}
55+
56+
int sum(int x) { // 1 indeksli elemandan x indeksli elemana
57+
int res = 0; // kadar olan sayilarin toplamini verir.
58+
while (x >= 1) {
59+
res += tree[x];
60+
x -= x & (-x);
61+
}
62+
return res;
63+
}
64+
65+
int query(int l, int r) { // [l,r] araligindaki elemanlarin toplamini verir.
66+
return sum(r) - sum(l - 1);
67+
}
68+
69+
void build() { // a dizisi uzerine fenwick tree yapisini kuruyoruz.
70+
for (int i = 1; i <= n; i++)
71+
add(a[i], i);
72+
}
73+
```
74+
75+
Fenwick Tree veri yapısı ile ilgili örnek bir probleme [buradan](https://www.spoj.com/problems/CSUMQ) ulaşabilirsiniz.
76+
77+
## Aralık Güncelleme ve Eleman Sorgu
78+
79+
Bir $a$ dizisi üzerinde işlemler yapacağımızı varsayalım daha sonra $a$ dizisi $b$ dizisinin prefix sum dizisi olacak şekilde bir $b$ dizisi tanımlayalım. Başka bir deyişle $a_i = \displaystyle\sum_{j=1}^{i} {b_j} $ olmalıdır. Sonradan oluşturduğumuz $b$ dizisi üzerine Fenwick Tree yapısını kuralım. $[l,r]$ aralığındaki her elemana
80+
$x$ değerini eklememiz için uygulamamız gereken işlemler:
81+
82+
- $b_l$ değerini $x$ kadar artır. Böylelikle $l$ indeksli elemandan dizinin sonuna kadar tüm elemanların değeri $x$ kadar artmış olur.
83+
- $b_{r + 1}$ değerini $x$ kadar azalt. Böylelikle $r + 1$ indeksli elemandan dizinin sonuna kadar tüm elemanların değeri $x$ kadar azalmış olur. Bu işlemelerin sonucunda sadece $[l,r]$ aralığındaki elemanların değeri $x$ kadar artmış olur.
84+
85+
### Örnek Kod Parçaları
86+
87+
```c++
88+
const int n;
89+
int a[n + 1], b[n + 1];
90+
91+
void add(int val, int x) { // x indeksli elemanin degerini val degeri kadar artirir.
92+
while (x <= n) {
93+
tree[x] += val;
94+
x += x & (-x);
95+
}
96+
}
97+
98+
int sum(int x) { // 1 indeksli elemandan x indeksli elemana
99+
int res = 0; // kadar olan sayilarin toplamini verir.
100+
while (x >= 1) {
101+
res += tree[x];
102+
x -= x & (-x);
103+
}
104+
return res;
105+
}
106+
void build() {
107+
for (int i = 1; i <= n; i++)
108+
b[i] = a[i] - a[i - 1]; // b dizisini olusturuyoruz.
109+
110+
for (int i = 1; i <= n; i++)
111+
add(b[i], i); // b dizisi uzerine fenwick tree kuruyoruz.
112+
}
113+
114+
void update(int l, int r, int x) {
115+
add(x, l);
116+
add(-x, r + 1);
117+
}
118+
119+
void query(int x) { return sum(x); }
120+
```

docs/data-structures/index.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
---
2+
title: Data Structures
3+
tags:
4+
- Data Structures
5+
---
6+
7+
**Editor:** Tahsin Enes Kuru
8+
9+
**Reviewers:** Baha Eren Yaldız, Burak Buğrul
10+
11+
**Contributors:** Kerim Kochekov
12+
13+
## Giriş
14+
15+
Bilgisayar biliminde veri yapıları, belirli bir eleman kümesi üzerinde verimli bir şeklide bilgi edinmemize aynı zamanda bu elemanlar üzerinde değişiklikler yapabilmemize olanak sağlayan yapılardır. Çalışma prensipleri genellikle elemanların değerlerini belirli bir kurala göre saklamak daha sonra bu yapıları kullanarak elemanlar hakkında sorulara (mesela, bir dizinin belirli bir aralığındaki en küçük sayıyı bulmak gibi) cevap aramaktır.
16+
17+
## Dinamik Veri Yapıları
18+
19+
### [Linked List](linked-list.md)
20+
### [Stack](stack.md)
21+
### [Queue](queue.md)
22+
### [Deque](deque.md)
23+
### [Fenwick Tree](fenwick-tree.md)
24+
### [Segment Tree](segment-tree.md)
25+
26+
## Statik Veri Yapıları
27+
28+
### [Prefix Sum](prefix-sum.md)
29+
### [Sparse Table](sparse-table.md)
30+
### [SQRT Decomposition](sqrt-decomposition.md)
31+
32+
## Örnek Problemler
33+
34+
Veri yapıları üzerinde pratik yapabilmeniz için önerilen problemler:
35+
36+
1. [Link](https://codeforces.com/problemset/problem/797/C){target="_blank"}
37+
2. [Link](https://codeforces.com/contest/276/problem/C){target="_blank"}
38+
3. [Link](https://codeforces.com/contest/380/problem/C){target="_blank"}
39+
4. [Link](https://www.hackerearth.com/problem/algorithm/benny-and-sum-2){target="_blank"}
40+
5. [Link](https://www.hackerearth.com/practice/data-structures/advanced-data-structures/fenwick-binary-indexed-trees/practice-problems/algorithm/counting-in-byteland){target="_blank"}
41+
42+
## Faydalı Bağlantılar
43+
44+
1. <https://en.wikipedia.org/wiki/Data\_structure>{target="_blank"}
45+
2. <https://cp-algorithms.com/data\_structures/sparse-table.html>{target="_blank"}
46+
3. <https://cp-algorithms.com/data\_structures/segment\_tree.html>{target="_blank"}
47+
4. <https://cp-algorithms.com/data\_structures/fenwick.html>{target="_blank"}
48+
5. <https://cp-algorithms.com/data\_structures/sqrt\_decomposition.html>{target="_blank"}
49+
6. <https://cses.fi/book/book.pdf>{target="_blank"}
50+
7. <https://visualgo.net/en/segmenttree>{target="_blank"}
51+
8. <https://visualgo.net/en/fenwicktree>{target="_blank"}
52+
9. <https://www.geeksforgeeks.org/binary-indexed-tree-or-fenwick-tree-2>{target="_blank"}
53+
10. <http://www.cs.ukzn.ac.za/~hughm/ds/slides/20-stacks-queues-deques.pdf>{target="_blank"}
54+
11. <https://www.geeksforgeeks.org/stack-data-structure>{target="_blank"}
55+
12. <https://www.geeksforgeeks.org/queue-data-structure>{target="_blank"}
56+
13. <https://www.geeksforgeeks.org/deque-set-1-introduction-applications>{target="_blank"}
57+
14. <https://www.geeksforgeeks.org/linked-list-set-1-introduction>{target="_blank"}
58+
15. <https://www.geeksforgeeks.org/binary-indexed-tree-range-updates-point-queries>{target="_blank"}
59+
16. <https://visualgo.net/en/list>{target="_blank"}
60+
17. <https://cp-algorithms.com/data\_structures/fenwick.html>{target="_blank"}

docs/data-structures/linked-list.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
---
2+
title: Linked List
3+
tags:
4+
- Data Structures
5+
- Linked List
6+
---
7+
8+
Linked List veri yapısında elemanlar, her eleman kendi değerini ve bir sonraki elemanın adresini tutacak şekilde saklanır. Yapıdaki elemanlar baş elemandan (head) başlanarak son elemana (tail) gidecek şekilde gezilebilir. Diziye karşın avantajı hafızanın dinamik bir şekilde kullanılmasıdır. Bu veri yapısında uygulanabilecek işlemler:
9+
10+
- Veri yapısının sonuna eleman ekleme.
11+
- Anlık veri yapısını baştan (head) sona (tail) gezme.
12+
13+
<figure markdown="span">
14+
![Örnek bir Linked List yapısı](img/linkedlist.png){ width="100%" }
15+
<figcaption>Örnek bir Linked List yapısı</figcaption>
16+
</figure>
17+
18+
```c++
19+
// Her bir elemani (burada sayilari, yani int) tutacak struct olusturuyoruz.
20+
struct node {
21+
int data;
22+
node *next;
23+
};
24+
node *head, *tail;
25+
26+
void push_back(int x) {
27+
// Yeni elemanimizi hafizada olusturuyoruz.
28+
node *t = (node *)malloc(sizeof(node));
29+
t->data = x; // Elemanin verisini atiyoruz.
30+
t->next = NULL; // Sona ekledigimizden sonraki elemanina NULL atiyoruz.
31+
32+
// Eger veri yapimiza hic eleman eklenmediyse head
33+
// ve tail elemanlarini olusturuyoruz.
34+
if (head == NULL && tail == NULL) {
35+
head = t;
36+
tail = t;
37+
}
38+
// Eklenmisse yeni tail elemanimizi guncelliyoruz.
39+
else {
40+
tail->next = t;
41+
tail = t;
42+
}
43+
}
44+
45+
void print() {
46+
// Dizideki tum elemanlari geziyoruz.
47+
node *t = head;
48+
while (t != NULL) {
49+
printf("%d ", t->data);
50+
t = t->next;
51+
}
52+
}
53+
```

docs/data-structures/prefix-sum.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
---
2+
title: Prefix Sum
3+
tags:
4+
- Data Structures
5+
- Prefix Sum
6+
---
7+
8+
Prefix Sum dizisi bir dizinin prefixlerinin toplamlarıyla oluşturulan bir veri yapısıdır. Prefix sum dizisinin $i$ indeksli elemanı girdi dizisindeki $1$ indeksli elemandan $i$ indeksli elemana kadar olan elemanların toplamına eşit olacak şekilde kurulur. Başka bir deyişle:
9+
10+
$$sum_i = \sum_{j=1}^{i} {a_j}$$
11+
12+
Örnek bir $A$ dizisi için prefix sum dizisi şu şekilde kurulmalıdır:
13+
14+
<div align="center" markdown="1">
15+
| **A Dizisi** | $4$ | $6$ | $3$ | $12$ | $1$ |
16+
|-------------------:|:---:|:-----:|:-------:|:----------:|:------------:|
17+
| **Prefix Sum Dizisi** | $4$ | $10$ | $13$ | $25$ | $26$ |
18+
| | $4$ | $4+6$ | $4+6+3$ | $4+6+3+12$ | $4+6+3+12+1$ |
19+
</div>
20+
21+
Prefix sum dizisini kullanarak herhangi bir $[l,r]$ aralığındaki elemanların toplamını şu şekilde kolaylıkla elde edebiliriz:
22+
23+
$$sum_r = \sum_{j=1}^{r} {a_j}$$
24+
25+
$$sum_{l - 1} = \sum_{j=1}^{l - 1} {a_j}$$
26+
27+
$$sum_r - sum_{l-1} = \sum_{j=l}^{r} {a_j}$$
28+
29+
## Örnek Kod Parçaları
30+
31+
Prefix Sum dizisini kurarken $sum_i = sum_{i - 1} + a_i$ eşitliği kolayca görülebilir ve bu eşitliği kullanarak $sum[]$ dizisini girdi dizisindeki elemanları sırayla gezerek kurabiliriz:
32+
33+
```c++
34+
const int n;
35+
int sum[n + 1], a[n + 1];
36+
// a dizisi girdi dizimiz, sum dizisi de prefix sum dizimiz olsun.
37+
38+
void build() {
39+
for (int i = 1; i <= n; i++)
40+
sum[i] = sum[i - 1] + a[i];
41+
return;
42+
}
43+
44+
int query(int l, int r) {
45+
return sum[r] - sum[l - 1];
46+
}
47+
```
48+
49+
## Zaman Karmaşıklığı
50+
51+
Prefix sum dizisini kurma işlemimizin zaman ve hafıza karmaşıklığı $\mathcal{O}(N)$. Her sorguya da $\mathcal{O}(1)$ karmaşıklıkta cevap verebiliyoruz.
52+
53+
Prefix sum veri yapısı ile ilgili örnek bir probleme [buradan](https://codeforces.com/problemset/problem/816/B){target="_blank"} ulaşabilirsiniz.

docs/data-structures/queue.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
---
2+
title: Queue
3+
tags:
4+
- Data Structures
5+
- Queue
6+
---
7+
8+
Queue veri yapısında elemanlar yapıya ilk giren ilk çıkar (FIFO) kuralına uygun olacak şekilde saklanır. Bu veri yapısında uygulayabildigimiz işlemler:
9+
10+
- Veri yapısının en üstüne eleman ekleme.
11+
- Veri yapısının en altındaki elemanına erişim.
12+
- Veri yapısının en altındaki elemanı silme.
13+
- Veri yapısının boş olup olmadığının kontrölü.
14+
15+
C++ dilindeki STL kütüphanesinde bulunan hazır queue yapısının kullanımı aşağıdaki gibidir:
16+
17+
```c++
18+
int main() {
19+
queue<int> q;
20+
cout << q.empty() << endl; // Ilk bashta Queue bosh oldugu icin burada True donecektir.
21+
q.push(5); // Queue'in en ustune 5'i ekler. Queue'in yeni hali: {5}
22+
q.push(7); // Queue'in en ustune 7'yi ekler. Queue'in yeni hali: {7, 5}
23+
q.push(6); // Queue'in en ustune 6'yi ekler. Queue'in yeni hali : {6, 7, 5}
24+
q.pop(); // Queue'in en altindaki elemani siler. Queue'in yeni hali : {6, 7}
25+
q.push(1); // Queue'in en ustune 1'i ekler. Queue'in yeni hali : {1, 6, 7}
26+
cout << Q.front() << endl; // Queue'in en ustundeki elemana erisir. Ekrana 7 yazdirir.
27+
}
28+
```

0 commit comments

Comments
 (0)