Kayıtlar

CP #30: Maximum Width of Binary Tree Problemi

Resim
 Problem surada . Cozum Ilk aklima gelen cozum sekli, BFS ile tree'yi traverse edip, her bir levelin width'ine bakmak. Ama aralardaki None'lari da hesaba katmamiz gerektigi icin, kucuk bir modifiye ile, bir None node icin, iki tane None child eklmem lazim queue'ya. Bu sekilde None olan parent node'larin cocuklarini da kaybetmemis olacagiz.  Ama bir tehlike var. Eger None olan node'lar icin 2 tane de None cocuk eklersek, bu dongu hicbir zaman bitmez. Queue sonsuza kadar uzar. Bunun onune gecmek icin eger bir level'deki node'larin tamami None ise, donguyu orada bitirmemiz lazim. Konusarak anlatmasi zor, koda gecelim: from collections import deque def widthOfBinaryTree(self, root: TreeNode) -> int:     q = deque([root])     max_width = 0          # que'de eleman oldugu surece     while q:         lenq = len(q)               # mevcut leveldeki tum elemanlari itere et          # child node'lara bak          level = []          for _ in range(lenq):

SD #5: System Design Trade-off'lari

Resim
 Malesef trade-off'a guzel bir Turkce karsilik bulamadim. Vardi birtane ama hatirlayamiyorum suanda. Nyese. Scalability camiasinda hersey bir trade-off. Yani bir yerden kazaniyorsan baska bir taraftan kaybediyorsun. En baslica 3 cesit tradeoff var.  1. Performance vs Scalability - Sistem sadece bir kullanici icin bile yavas ise, performans problemi var demektir. - Sistem bir kullanici icin hizli ama kullanici sayisi artinca yavasliyor ise, scalability problemi var demektir. Peki bu ikisi nasil bir trade-off teskil edebilyor? Su makalede cok guzel ifade etmis: One thing that tripped me up early on in my career was the difference between performance and scalability. At first I thought they were exactly the same. I was quite surprised when my first project to scale a system actually made my code run slower.  Normal 1 kullanici icin cok performansli bir sistemi alip, scalable yaptigimizda, yine sadece 1 kullanici icin test edersek, belki performansin bir miktar dustugunu gorebiliriz.

CP #29: Linked List Problemleri

Resim
 Array gibi, elemanlari devamli bir sekilde (continous) hafizada tutulmayan, elemanlarin birbirine pointerlar ile baglandigi bir veri saklama yapisidir.  Array'a kiyasla su sekilde avantajlari oldugu soylenebilir: - Arary sabit olup eleman sayisi bir kere tanimlandiktan sonra artirilama/azaltilamaz. Bu anlamda LL daha esnektir. Gercekten kullanilan eleman sayisi mertebesinde hafiza kullanir. - Array'a bir eleman eklemen maliyetli bir islemdir. Ornegin ortaya ekelenecekse eleman, oncelikle sag tarafta kalan tum elemanlar saga kaydirilmalidir. Bu O(n) bir islem olamktadir. LL'te ise O(1) seklinde istenilen noktaya eleman eklenebilir. Eleman silme icin de bu durum gecerlidir.  Dezavantajlari: - Random access mumkun degildir. Yani direk ben 12. elemana ulasayim diyemiyoruz. O elemana kadar LL uzerinde traverse etmemiz gerekiyor. Cok basit bir implementasyon: class Node:     def __init__(self, data, next=None):          self.data = data          self.next = next class LinkedList