Algoritma/Optimizasyon Yarışması 2 - ihan3t

ihan3t

Kadim Üye
7 Şub 2012
5,018
22
Merhabalar herkese, ikinci algoritma yarışması ile yeni bir konuda buluşuyoruz.

Algoritma, "bir sorunun çözümü için tasarlanan işlemler" diye tanımlanabilir. Yazılım dünyasında ise algoritma denildiğinde "akış diyagramı" ndan ziyade, veri yapıları üzerinde yapılan işlemler akla gelir. Örneğin graph gezme algoritmaları, tree algoritmaları, sıkıştırma algoritmaları, görüntü işleme, machine learning, kriptoloji algoritmaları vs vs..

Bu liste çok uzun.

Optimizasyon ise, bir algoritmanın daha performanslı (hem hız, hem bellek açısından) çalışmasını sağlama işlemidir.

Bu konumuzda çok hoş olacağını düşündüğüm bir algoritma ve optimizasyon sorusu soracağım, sonrasında ise çözümünü anlatacağım.

Sorumuz "Fibonacci" üzerine.

Öncelikle fibonacci serisi nedir onu bir göstereyim :

0 1 1 2 3 5 8 13 21 34 55 89 144 . . . . . . .

diye devam eden bir seri.

Serinin hesaplanması ise şöyle. Başlangıç sayılarımız = 0 1

Bu sayılardan başlayarak kendisinden bir önceki sayı ile toplayarak devam ediyoruz.

0 1

0 + 1 = 1
0 1 1

1 + 1 = 2
0 1 1 2

1 + 2 = 3
0 1 1 2 3

şeklinde devam ediyor.

Sanırım burası anlaşıldı.

Soru şu şekilde : "Fibonacci(x) denildiğinde en kısa adım sayısı ve en az bellek kullanımı ile bu sayıyı hesaplayan algoritmayı herhangi bir dil ile yazın"


Not :

Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(2) = 1
Fibonacci(3) = 2
Fibonacci(10) = 55

Not 2 :

Programlama dillerinin hazır fibonacci kütüphanesi ile yapmak yasaktır. Soruda istenen şey algoritmayı sizin implement etmenizdir.


Soru gayet açık. Bu akşam 00:00 da çözümü açıklayacağım.

Katılan arkadaşlara başarılar.

Dipnot : Bu tarz algoritma soruları programlama yeteneğinizin ve algoritma kabiliyetinizin artmasını sağlar, bana ne faydası olacak diye soran kişilere istinaden bunu belirtiyorum.

Çözüm :

Kod:
def mfib(n):
    cache = [-1 for x in range(n+1)]
    cache[0] = 0
    cache[1] = 1

    return fib(n, cache)

def fib(n, cache):
    if cache[n] != -1:
        return cache[n]
    else:
        cache[n] = fib(n - 1, cache) + fib(n - 2, cache)
        return cache[n]

Recursive fibonacci hesaplamasında, (dynamic programming genelde recursive metodlar ile işler) memoization denen bir işlem uyguluyoruz. Yani daha önce hesapladığımız adımları tekrar hesaplamak yerine bir bufferdan/cache den getiriyoruz. Normal fibonacci hesaplamasına göre çok daha performanslı.

Normal fibonacci kodu :

Kod:
def nfib(n):
    if n <= 1:
        return n

    return nfib(n - 1) + nfib(n - 2)

Normal fibonacci hesabında recursive yapıda oluşan node lar :

fibonacci__binary_tree_recursive.svg


Memoization işlemi yaptıktan sonra hesaplanacak node lar :

fibonacci__binary_tree_memoized.svg


Gördüğünüz gibi oldukça performans sağlıyor, işlem sayısını azaltıyor.

Bu konunun amacı dynamic programming ve memoization işlemini anlatmaktı, fibonacci mantığı anlamak için güzel bir örnek, gerçi fibonacci hesaplaması için matematiksel başka yöntemlerde olduğundan biraz eksik bir örnek gibi gözükebilir fakat görselleri ve kodu inceledikten sonra mantığı anlamanız yeterli. Önemli olan "alt parçalara ayrılabilen problemleri" analiz edip çözebilmek.
 
Son düzenleme:

xdebron

Kıdemli Üye
29 Ocak 2015
2,441
1
.
cevabım, matematik...

image8.gif


Kod:
#include <stdio.h>
#include <math.h>

int main()
{
	float step=5000000.0;
	printf("sonuc: %d\n",Fibonacci(&step));
}
int Fibonacci(float *step)
{
	const float kokbes=pow(5.0, 1.0/2.0),x=(1.0+kokbes)/2,y=(1.0-kokbes)/2;
	return (pow(x,*step)-pow(y,*step))/kokbes;
}
 

ihan3t

Kadim Üye
7 Şub 2012
5,018
22
sende hep matematik soruları soruyorsun :D
adamlar google amcadan buluyor :)

Aslında soru tam olarak matematik sorusu değil, soruyu fibonacci ile sorduğum için matematiksel formülü mevcut.

Aslında soruda teşvik etmeye çalıştığım şey: dynamic programming - memoization.
 

Tetrox

Kıdemli Üye
14 Mar 2017
2,338
2
none
Ah ah bi programlama dili bileydik fakat o tekniğide öğrenmiş oldum fibonnic bilmem ne :D
0 + 1 = 1
1 + 2 = 3
2 + 3 = 5
5 + 6 = 11
11 + 12 = 23

Bilmemek ayıp değil öğrenmemek ayıptır :D Saolasın :)
 

TheHEROZ

Katılımcı Üye
3 Haz 2017
331
0
ice world
Aslında soru tam olarak matematik sorusu değil, soruyu fibonacci ile sorduğum için matematiksel formülü mevcut.

Aslında soruda teşvik etmeye çalıştığım şey: dynamic programming - memoization.

bence konuları biraz zorlaştıralım matematik sorusu oldumu buluyorlar zaten kodlar internette var
diyorumki daha zor bişe deneyelim tht nin sınirını zorlayalım :D mesela bi ara c# ile bi program yazmıştım masaüstündeki txt leri aes ile sıfrelyip uzantılarını değiştiriyordu bir daha kine bunu soralım :D
 

ihan3t

Kadim Üye
7 Şub 2012
5,018
22
Ah ah bi programlama dili bileydik fakat o tekniğide öğrenmiş oldum fibonnic bilmem ne :D
0 + 1 = 1
1 + 2 = 3
2 + 3 = 5
5 + 6 = 11
11 + 12 = 23

Bilmemek ayıp değil öğrenmemek ayıptır :D Saolasın :)

Dostum biraz yanlış anlamışsın fibonacci sırasını, tekrar oku istersen konudakini :D

bence konuları biraz zorlaştıralım matematik sorusu oldumu buluyorlar zaten kodlar internette var
diyorumki daha zor bişe deneyelim tht nin sınirını zorlayalım :D mesela bi ara c# ile bi program yazmıştım masaüstündeki txt leri aes ile sıfrelyip uzantılarını değiştiriyordu bir daha kine bunu soralım :D

Eğer AES algoritmasını implemente ettireceksek, s-box tasarımını, mix columns işlemlerini vs vs yazdırmak lazım.

Yoksa dilin içerisinde gelen crypto kütüphanesi ile yaptırdıktan sonra bahsettiğin uygulama 1 dakikalık iş.

Aslında baya zor bir challange açmıştım fakat kimse tam anlamıyla başarılı olamadı hatta konu kapatıldı : http://www.turkhackteam.org/off-top...cilar-belli-olacak-teknik-yarisma-ihan3t.html

Burada birçok kişi zaten soruyu ve çözüm yolunu anlayamadı. Interpreter yapımını anlatacaktım.
Önü kapandı maalesef.

Aslında bu konuda da gayet güzel bir konu işlemeye çalışıyorum, "dynamic programming - memoization" çok güzel bir kon. Araştıranlar anlayacaktır.
 

ZeussHack

Katılımcı Üye
6 Haz 2016
739
0
ANA KARNI
Dostum biraz yanlış anlamışsın fibonacci sırasını, tekrar oku istersen konudakini :D



Eğer AES algoritmasını implemente ettireceksek, s-box tasarımını, mix columns işlemlerini vs vs yazdırmak lazım.

Yoksa dilin içerisinde gelen crypto kütüphanesi ile yaptırdıktan sonra bahsettiğin uygulama 1 dakikalık iş.

Aslında baya zor bir challange açmıştım fakat kimse tam anlamıyla başarılı olamadı hatta konu kapatıldı : http://www.turkhackteam.org/off-top...cilar-belli-olacak-teknik-yarisma-ihan3t.html

Burada birçok kişi zaten soruyu ve çözüm yolunu anlayamadı. Interpreter yapımını anlatacaktım.
Önü kapandı maalesef.

Aslında bu konuda da gayet güzel bir konu işlemeye çalışıyorum, "dynamic programming - memoization" çok güzel bir kon. Araştıranlar anlayacaktır.

Kerdeş azcık türkçe konuşsana :) implemente ne, mix columns ne, interpreter yapımı ne :D
 

Tetrox

Kıdemli Üye
14 Mar 2017
2,338
2
none
Dostum biraz yanlış anlamışsın fibonacci sırasını, tekrar oku istersen konudakini :D



Eğer AES algoritmasını implemente ettireceksek, s-box tasarımını, mix columns işlemlerini vs vs yazdırmak lazım.

Yoksa dilin içerisinde gelen crypto kütüphanesi ile yaptırdıktan sonra bahsettiğin uygulama 1 dakikalık iş.

Aslında baya zor bir challange açmıştım fakat kimse tam anlamıyla başarılı olamadı hatta konu kapatıldı : http://www.turkhackteam.org/off-top...cilar-belli-olacak-teknik-yarisma-ihan3t.html

Burada birçok kişi zaten soruyu ve çözüm yolunu anlayamadı. Interpreter yapımını anlatacaktım.
Önü kapandı maalesef.

Aslında bu konuda da gayet güzel bir konu işlemeye çalışıyorum, "dynamic programming - memoization" çok güzel bir kon. Araştıranlar anlayacaktır.

Tamamdır şimdi anladım ben bir sonraki sandım :)
 

ihan3t

Kadim Üye
7 Şub 2012
5,018
22
Kerdeş azcık türkçe konuşsana :) implemente ne, mix columns ne, interpreter yapımı ne :D

Mix columns, aes algoritmasının içerisinde bulunan bir işlem.

Implement, implementasyon bunlar yazılım ile ilgilenen kişilere anlam ifade eden teknik bir tabir. Anlamı bir şeyi yazılım dili ile hayata geçirme işlemi (bkz implementasyon : 1. yaşama geçirme. 2. yerine getirme. 3. uygulama).

Interpreter, gene yazılım ile ilgilenen kişilerin ne olduğunu bildiği Türkçe'si "yorumlayıcı" olan, interpreted dilleri çalıştıran bir yazılım.
 

MyWhite

Uzman üye
18 Mar 2017
1,006
0
127.0.0.1
hocam ayt de yapılan bir sınav vardı txt belgesinin içine resim şifrelenmiş mesajlar zafiyet kodları felan ekliyordu ve bunları belirli bir süre içinde bulanlara bir kaç sınav daha yapıyordu zorlaştırarak bence sizde yapabilirsiniz hem forumda gelişim sağlanmış olur :)
 

TheHEROZ

Katılımcı Üye
3 Haz 2017
331
0
ice world
Dostum biraz yanlış anlamışsın fibonacci sırasını, tekrar oku istersen konudakini :D



Eğer AES algoritmasını implemente ettireceksek, s-box tasarımını, mix columns işlemlerini vs vs yazdırmak lazım.

Yoksa dilin içerisinde gelen crypto kütüphanesi ile yaptırdıktan sonra bahsettiğin uygulama 1 dakikalık iş.

Aslında baya zor bir challange açmıştım fakat kimse tam anlamıyla başarılı olamadı hatta konu kapatıldı : http://www.turkhackteam.org/off-top...cilar-belli-olacak-teknik-yarisma-ihan3t.html

Burada birçok kişi zaten soruyu ve çözüm yolunu anlayamadı. Interpreter yapımını anlatacaktım.
Önü kapandı maalesef.

Aslında bu konuda da gayet güzel bir konu işlemeye çalışıyorum, "dynamic programming - memoization" çok güzel bir kon. Araştıranlar anlayacaktır.

sen bu forumda harcanıyorsun sende benim gibi legal olarak yazılım yapıp sat derim para çok ama zahmetli eline saglık konu güzel beğendim
 

ihan3t

Kadim Üye
7 Şub 2012
5,018
22
sen bu forumda harcanıyorsun sende benim gibi legal olarak yazılım yapıp sat derim para çok ama zahmetli eline saglık konu güzel beğendim

Zaten hali hazırda sektörde çalışıyorum. Okurkende freelance + startupta çalışmam oldu. Sorun yok o yüzden.

Tht deki bazı hevesli kişilere faydalı olsa benim için yeterli. Türkiye'de bu işi ilerletmek lazım.
 

siberdrone15

Kıdemli Üye
20 Ağu 2016
4,446
3
Zaten hali hazırda sektörde çalışıyorum. Okurkende freelance + startupta çalışmam oldu. Sorun yok o yüzden.

Tht deki bazı hevesli kişilere faydalı olsa benim için yeterli. Türkiye'de bu işi ilerletmek lazım.

Hocam bu konular heveslileri korkutmasın :)
Daha yeni başlayanlar için Acemi konuları da bekliyoruz inşallah.
 

TheHEROZ

Katılımcı Üye
3 Haz 2017
331
0
ice world
Zaten hali hazırda sektörde çalışıyorum. Okurkende freelance + startupta çalışmam oldu. Sorun yok o yüzden.

Tht deki bazı hevesli kişilere faydalı olsa benim için yeterli. Türkiye'de bu işi ilerletmek lazım.

istek önemli hocam bu işte tr çok geri kalmış yazılımda senin gibi 2 tane yoktur bu ülkede
bende troll olarak takılıyorum tek paylaştığım konu adam akıllı c# sanal makina tespiti ::D
 

ihan3t

Kadim Üye
7 Şub 2012
5,018
22
Çözümü konuya ekledim, görsel ile açıklama da ekledim.
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.