Arrayler ve Fonksiyonlar

Elimizde şöyle bir array olduğunu düşünelim:

int [] numbers={1,2,3,4,5,6............}public int numbersMethod(int index) {  return index+1;}

düşündüğünüzde numbers array’i numbersMethod fonkisyonu aynı şeylerdir. Şöyleki:

System.out.println(numbers[4]) //5 System.out.println(numbersMethod(4)) //5

numbers array’i memory’de ciddi oranda yer kaplamaktadır ancak numbersMethodu pek bir şey harcamamaktadır. Belirtilen durumda numbersMethod’u kullanmak mantıklı gözükmektedir. Peki ya şu durumda:

int [] factorial={1,1,2,6,24,120.............};public int  factorailMethod(int n){int result=1;for(int i=1;i<=n;i++){result=result*i;}return result;}

İşler şimdi ilginçleşmeye başlamaktadır. Gördüğünüz gibi her faktoriyel hesaplanması array versiyonunda sabit zamanda o(1) olmaktayken method ile hesaplattığımızda o(n) karmaşıklık ile karşılaşmaktayız. Yavaş yavaş önceden hesaplatmak mantıklı bir hale gelmektedir. Ancak sonsuz memorymiz olduğu düşünülürse hesaplatıp kullanmak tek çözüm olarak gözükmektedir.

Faktoriyel yerine daha karmaşık hesaplatmamız gerektiğinde durum daha da dramatikleştirmektedir. Sınırlı hafızamız olması durumunda belli bir seviyeye kadar array’de tutup sonrasında hesaplatmak da bir seçenek olarak ortaya çıkmaktadır:

int [] factorial={1,1,2,6,24,120.............2432902008176640000};
public int factorailMethod(int n){if(n<=20){return factorial[n];}int result=factorial[20];for(int i=20;i<=n;i++){result=result*i;}return result;}

20 faktoriyele kadar olan değerler hızlanmamıştır belirtilen şekilde aynı zamanda sonrası da hızlanmıştır 1 yerine 20'den itibaren başladığı için hesaplamaya.(300 olsa çok daha hızlı olurdu. ). Evet sonuç olarak Space/Time Tradeoff’u (Boyut, zaman ikilemi) ile karşılaşmaktayız ve optimal bir çözüm bulmak problemine göre farklılık göstermektedir.

Originally published at http://anilkaynr.wordpress.com on April 6, 2020.

Computer Engineer,Sociologist, CSE Master Student

Computer Engineer,Sociologist, CSE Master Student