Selam millet! Bilgisayar bilimleri yüksek lisans derecemi alıyorum ve şu anda ana akım literatürde çok konuşulmayan bazı algoritmalar (orta düzey makaleler ve diğer blog yazıları) üzerinde çalışıyorum. Hakkında çok fazla konuşulmayan ancak kalın araştırma makalelerine dalacak sabrınız olmayan algoritmalar hakkında bilgi edinmek istiyorsanız, bu makale tam size göre.
Bu gönderi Mesa-Gries algoritması hakkındadır. Akış modelinde sözde Heavy vurucuları saymak için kullanılan oldukça basit bir algoritmadır . Ağır vuruşlar , akıştan diğerlerinden daha sık meydana gelen unsurları ifade eder .
Önce akış modelini tanımlayayım : Bu modelde, bilgisayarın gelen verilerle ilgili hiçbir bilgisinin olmadığı bir bilgi işlem birimine akıtılan bir dizi öğeye sahibiz (öğelerin sayısı için m harfini kullanacağım ). içinde.
Bir öğe akışının ilginç bir özelliği, içindeki farklı öğelerin sayısıdır . "Bunu hesaplaması kolay, akıştan gelen tüm öğeleri takip edebilir ve ardından ne kadar farklı öğe olduğunu sayabiliriz!" Diye düşünebilirsiniz , ancak böyle bir yaklaşım tüm akış öğelerinin depolanmasını gerektirir . Ayrıca, akışın her öğesi için bir sayaç tutabilirdik, ancak her öğenin farklı olması durumunda, tüm öğeleri depolamakla aynı sorun olur.
Aslında, akış modelinde, akıştaki m öğesinin sayısının bir bilgisayarın depolayabileceğinden çok daha fazla olduğunu söylüyoruz . Biraz nehre üzerinde yüzen nesnelerle bakmanız gibi: Onlara bakabilirsiniz, belki bir veya iki tane tutabilirsiniz, ama muhtemelen hepsini tutacak kadar eliniz yok.
Öyleyse, küçük bir hafıza alanıyla tüm farklı öğeleri nasıl sayabiliriz? Misra-Gries algoritması ile hangi öğelerin ağır vuruşlar olduğunu tahmin etmek mümkündür . Bu algoritmayla, öğelerin sıklığı tahmin edilebilir ve hatta daha iyisi, tanımlanmış bir k için akışta m / k defadan fazla meydana gelen tüm öğeleri bulabilir . Örneğin, k = 3 olan [1,1,2,3,4,5,1,1,1,5,3,3,1,1,2] dizisinde , 15/3 = 5 kez.
İşte diğer bazı gösterimler: [n] = {1,2,…, n} evreninden gelen aₓ öğelerinin bir listesini içeren m boyutunda bir S akışı kullanıyoruz (Her aₓ öğesi , küme {1,2,… n}).
Bir tek geçişli tüm unsurları sayarak algoritması gerektirecektir Ω (m) biz istemiyor budur, bilgisayar boşluk. Ancak Mesa-Gries algoritması ile bir elemanın frekansını tahmin ederek, alan kullanımı O ( k * (log (m) + log (n))) ile sınırlandırılabilir . Bu algoritma tarafından yapılan tahmin, tek taraflı bir hataya izin verir. Bu, en sık kullanılan öğelerin tümü en sonunda çıktıda yer alsa bile, bazı nadir öğeler de olabileceği anlamına gelir .
Algoritmanın kendisi oldukça basit. Biz akışı olduğunu varsayalım S ile m ondan gelen elemanları. Akan öğeler için sayaçları tutan bir sözlük D kullanıyoruz .
Bir sözlük başlatma D
her madde için bir akış gelen S :
▹ bir ise D , ardından [a] ++ D
▹ boyutu Başka eğer D daha az olduğu , k-1 , uç bir de D değeri 1
▹ else eksiltme tüm sayaçlar D tarafından 1 ve sayısı ile tüm öğeleri kaldırmak 0
Let f belli öğenin sıklık tahmini olmalı ve f akışı içinde bu ürünün gerçek frekansı S . F - m / k ≤ f̂ ≤ f olduğunu iddia edebiliriz . Olduğunu, tahmin edilen frekans f ait öğenin büyüktür ya da gerçek frekans için eşit f öğesi, eksi ait m / k.
Varsayalım e büyük bir frekansa sahip bir elementtir m / k .
E öğesinin bir oluşumu sayılmadığında, bunun iki nedeni olabilir:
Bu nedenle , algoritmanın sonunda e hala D içindeyse, m / k kezden fazla meydana geldi .
D' de en fazla k-1 sayacı vardır ( k'ye basitleştirebiliriz ). Her bir sayaç için, arasında olabilir anahtar bir rol oynayacaktır 1 için n ve arasında olabilir karşılık gelen bir değeri 1 için m .
Bir n anahtarının depolanması log (n) alanı gerektirir ( ikili gösterimleri düşünün) ve bir sayaç m , log (m) alanı gerektirir . Dolayısıyla, bir anahtar / değer çifti, günlük (n) + günlük (m) alanını temsil eder .
K-1 anahtarlarımız olduğu için, algoritma alanı kullanımı için daha yüksek bir O ( k * (log (m) + log (n))) ile sonuçlanır .
Misra-Gries algoritması, ağır vuruşları tahmin etmek için gayet iyi çalışan basit bir algoritmadır, ancak yukarıda bahsettiğim gibi, seyrek öğeler de üretebilir. Algoritmayı değiştirmek ve hatta sık olmayan öğeler çıkarmadan ağır vuruşların sıklığını tahmin edebilen farklı algoritmalar kullanmak mümkündür.
Daha fazla bilgi edinmek istiyorsanız, Bloom filtreleri ve Count-min çizimleri gibi akış algoritmaları ve veri yapıları hakkında okumanızı tavsiye ederim.
Bu makale hakkında herhangi bir sorunuz veya yorumunuz varsa lütfen bize bildirin! Şerefe, Stéphane
Yasal Uyarı: Bu makale yalnızca eğitim amaçlıdır. Kimseyi web sitelerini, özellikle de bu tür eylemlere karşı hüküm ve koşulları olabilecek web mülklerini kazımaya teşvik etmiyoruz.
Biçimsel bir sistem, temel sembollerden ve bu sembolleri manipüle etmek için bir dizi kuraldan oluşan bir mantık yapısıdır. Bu semboller “temeldir” çünkü içsel bir anlamları yoktur.
asla kırılmayan, kendi yolunu bulan, ateşle şıngırdayan, her zaman inanmak isteyen, başka her şey neden önemli olsun ki, her şey bir yolunu bulup dururken, yavaş yavaş kalbimi veren türden. Bir yabancıya, hiç ayrılmak istemeyeceklerini umarak, umarım yeterli olur, her şey zorlaştığında ve umarım bir gün, o kadar da sert olmadığımı bilerek, kendimi yeterli bulurum. gerçekten blöf dediğim bu 'korkusuz Varlık'ta.
Amerikalı koşucu Athing Mu, profesyonel kariyerinde ilk kez 800 metrelik bir yarışı kaybedebilirmiş gibi görünüyordu. Mu, tipik olarak, az kol hareketi ve görünüşte az enerji içeren benzersiz ve zahmetsiz bir adımla yarışlarına hükmeder.
Kedi Felix'in 9. doğum gününde, yetişkin hayatımın en büyük kayıplarından birini hatırlıyorum - 2013'teki Sophie'm. Bu makaleyi yazdım ve 2013'te bu platformda kısaca paylaştım.
"Bozulma" terimi, nedensel mekanizma bilinmediğinde kullanılır ve bireyin altta yatan bilişinde ve nörobiyolojisinde bir işlev bozukluğunu ima eder. 1952'de, DSM 1, klinik kullanım için zihinsel bozuklukları kategorize eden APA Adlandırma ve İstatistik Komitesi tarafından yayınlandı.