Cuma gununu, haftanin yorgunlugunu atarak, biraz daha merak ettigim birkac seye bakarak gecirdim. Fizik tarafindan ilham alarak son donemde ugrastigim seylerle iliskilendirip ufak da bir proje bile yaptim.

  • Dun aksam Veritasium’un Youtube kanalinda izledigim Turbulance videosu epey enteresan geldi. Bu konunun degme fizikcileri dize getirdigini bildigimden, calisilmasinin ne kadar zor olabilecegini hayal edebiliyorum. Fakat acaba “en basit haliyle” kucuk olcekli bir simulasyon yapip bunu gorsellestirebilir miyim diye kendi kendime sorarken, gece saat 1 olmasi beni durdurmadi, muthis bir “rabbit hole”‘a dalmistim bile.

    • Oncelikle, bu tip dinamik sistem, istatistiksel mekanik temali konularda kaynaklara goz atmak icin ilk adresim olan Cosma’s Notebook’ta “Turbulance” basligina baktim ve temel giris kitaplarina bir goz attim. Buradan ogrendim ki turbulance modeller icin Cellular Automata (CA) temelli, Lattice Boltzman Gas modelleri diye bir seyler de kullaniliyormus. Guzel, gecen hafta CA’ler uzerine bir seyler yapmistim, bu fikri ileri tasimak icin harika firsat!

    • Sonra bu modeller de ne ola ki diye arastirirken, fark ettim ki CodingTrain’den D. Schifmmann buna benzer bir yontemi ele alan, bastan sona harika bir uygulama videosu cekmis. Videoda referans verdigi ve kedisi de p5.js‘e dogrudan port ettigi, C ile yazilmis bir kodu kullaniyor. Modelleyecegimiz akiskani, 2 boyutlu bir Cellular Automata gibi dusunup, elimizdeki N x N’lik gridi zamanla evriltiyoruz. Zamanla evrim kismi biraz karisik, difuzyonu, viskoziteyi ve advection’i goz onune almak gerekiyor. Fakat detaylara cok dalmadan, birkac saatte kodu calisir ve gorsel hale getirmeyi basardim.

    • Boylece kodu Python’a port edip, biraz numpy uygulamasi yapmis oldum. Kodun icinde buyuk degisiklikler yapmadan, ilk etapta su sonuc cikti:

    Numpy ile hesaplayip, matplotlib ile gorsellestirdigim; ortada rastgele yogunluk ve hiz alani ureten bir kaynaktan cikan parcaciklarin viskoz bir akiskandaki hareketinin oyuncak modeli

    • Bir sonraki hedefim, kodun temelini olusturan yaziyi ve ilgili kaynaklari detayli okuyup kod arka taraftaki denklemleri nasil cozuyor, bunu anlamak. Sonrasinda kodu hizlandirmak icin kullandigim islemleri “vektorize” etmek ve becerebilirsim hizlandirmak icin paralel hesaplama yontemlerini uygulamak. Al sana sahane bir haftasonu projesi!

    • Kodun, su anda sadece Python’a aktarilip, gorsellestirilmenin ekledigi halini kurcalamak isteyenler projenin Github reposunu inceleyebilirler.

  • LeetCode’un bugunku Challange‘i O(1) zamanda, ekleme, cikarma ve rastgele eleman dondurebilen bir veri yapisi tasarlamakti. Bu konulari daha yeni ogrendigimden, cozume dair kabaca bir fikrim var. Amac ogrenmek oldugundan problemi internette biraz arayip fikirlerimi teyit edip, cozume dair fikir alarak cozdum bugunku problemi. Sabit O(1) zamanda erisim saglamak icin verilen bir verinin nerede oldugunu da tutmak gerekiyor. Bunun icinde de Python’daki hashmap seklinde calisan dict yapilari kullanip, buna ek olarak da veriyi tutacagimiz bir dinamik liste, Python’da standart list, isimizi goruyor sanirim.

# LeedCode June Challange Day 12
# Insert Delete GetRandom O(1) Problem

# Design a data structure that supports all following operations in average O(1) time.

#     insert(val): Inserts an item val to the set if not already present.
#     remove(val): Removes an item val from the set if present.
#     getRandom: Returns a random element from current set of elements. Each element must have the same probability of being returned.


import random

class RandomizedSet:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.array = []
        self.hashmap = {}
        

    def insert(self, val: int) -> bool:
        """
        Inserts a value to the set. Returns true if the set did not already contain the specified element.
        """
        if(val not in self.array):
            index = len(self.array)
            self.array.append(val)
            self.hashmap[val] = index
            return True
        return False

    def remove(self, val: int) -> bool:
        """
        Removes a value from the set. Returns true if the set contained the specified element.
        """
        if(val in self.array):
            index = self.hashmap[val]
            last_element = self.array[-1]
            self.array[index] = last_element
            self.hashmap[last_element] = index
            del self.hashmap[val]
            self.array.pop()
            return True
        return False
        

    def getRandom(self) -> int:
        """
        Get a random element from the set.
        """
        return random.choice(self.array)