C ile hızlı sıralama algoritması

Başlatan Erdem , 12 Eylül 2012, 15:36:08

Erdem

Daha bu gün bir arkadaşım bu konuda bir şeyler söylemişti:

Alıntı YapÖrneğin belirli bir dili bilmemin önemli olacağını düşünsem ama o dili sevmesem kesinlik kendi başıma öğrenmem. Bu tür kararlarda mantık da şart değil. Örneğin Java veya C# ne kadar değerli olsalar da ne kadar iyi diller olsalar da benim onlara karşı hiçbir ilgim olmadığı için hiçbir zaman öğreneceğimi sanmıyorum.

Aynen ben de böyle düşünüyorum.

C# ile XNA kullanarak basit bir Pacman oyunu yazmıştım. Ama C++, D, Python gibi dillerin yazım şekline alışınca C# biraz yavan geliyor. Ben zaten D'nin yazım şeklini çok beğeniyorum aslında. Hatta C++'nın bazen oldukça karmaşık olabilen yazım biçimini göre D'nin yazım biçimi daha basit diyebilirim. Benim burada beğenmediğim kısım D'nin isimsiz işlevler için kullandığı yazım biçimi.

Mesela D'de tek sayıları böyle gösterebiliriz:
    immutable sayılar = [1, 2, 3, 4, 5, 6];
    auto tekSayılar = sayılar.filter!(x => x % 2)();


Ama Python'un kullandığı yazım şeklini daha zarif ve kodlaması kolay buluyorum:

    sayilar = [1, 2, 3, 4, 5, 6]
    tekSayilar = [x for x in sayilar if x % 2 == 1]


Bir de sadece tek bir platforma bağlı kalmak bana göre değil  :)



İstediğim zaman Linux istediğim zaman Mac için de kod geliştirebilmeliyim. Sadece bir platforma bağlı kod geliştirdiğinizde dilden ziyade kütüphaneleri öğreniyorsunuz. O zaman başka işletim sistemlerine [geçenlerde hatta VxWorks gibi gerçek zamanlı işletim sistemlerinden bahsedilmişti] geçtiğinizde sudan çıkmış balığa dönüyorsunuz

Bilmiyorum benim düşüncelerim bunlar ..

muhittin_kaplan

Soru Basit "Gerçek Dünyadaki Bilgileri yada Fonksiyonlar Tarafından Üretilmiş Değerleri Neden Sıralama gereği duyarız"
Okullardaki Yarı Piskopat Hocaların "Anlamsız Olarak, Hiç Kullanılmayacak Algoritmalar Yazmalarını İstemeleri" gibi bir durum mudur bu ?
Örnek:
"Sıfırdan, Girilen Sayı Aralığının Finobacchi Dizilimini Yapan Fonksiyonunu Yazınız"


Erdem

Alıntı yapılan: muhittin_kaplan - 13 Eylül 2012, 20:28:04
Örnek:
"Sıfırdan, Girilen Sayı Aralığının Finobacchi Dizilimini Yapan Fonksiyonunu Yazınız"


Hocam işin felsefi boyutlarını fazla bilmiyorum ama D'nin Fibonacci için çözümü şu şekilde:

import std.stdio;
import std.range;
 
struct FibonacciSerisi
{
    ulong baştaki = 0;
    ulong sonraki = 1;
 
    static immutable bool empty = false;
 
    @property ulong front() const
    {
        return baştaki;
    }
 
    void popFront()
    {
        ulong ikiSonraki = baştaki + sonraki;
        baştaki = sonraki;
        sonraki = ikiSonraki;
    }
}
 
void main()
{
    writeln(take(FibonacciSerisi(), 10));
}

fatih6761

@muhittin sorduğunuz soru bana halâ anlamsız geliyor. Yani bu sorduğunuz soru sıra, düzen gibi kavramları yok sayıyor. Yani en basitinden komutan-asker ilişkisini düşün. Bunlar bir anlamda binary tree lere benzer, yetkilerine göre sıralanmış insan nesneleridir. Onbaşının on askeri vardır. Yetkisine 10 diyelim. Yüz başının bunları da kapsayan yüz askeri var. O halde yetkisi 100 olur. Bu iki asker nesnesini sıralamazsak sistem çalışmaz... gibi... Eğer gerçekten kasdettiğin algoritma neden var sorusu ise, biz neden varız?'a kadar gider...

Tagli

Alıntı yapılan: muhittin_kaplan - 13 Eylül 2012, 20:28:04
Soru Basit "Gerçek Dünyadaki Bilgileri yada Fonksiyonlar Tarafından Üretilmiş Değerleri Neden Sıralama gereği duyarız"
Okullardaki Yarı Piskopat Hocaların "Anlamsız Olarak, Hiç Kullanılmayacak Algoritmalar Yazmalarını İstemeleri" gibi bir durum mudur bu ?
Örnek:
"Sıfırdan, Girilen Sayı Aralığının Finobacchi Dizilimini Yapan Fonksiyonunu Yazınız"

Verileri sıralama gereği duymamızın sebebi, onlara daha hızlı ulaşabilmektir. Kitapların raflara rasgele dizildiği bir kütüphane düşün, binlerce kitap var. Ve sen bir tanesini arıyorsun...

Hocaları öğrencilere anlamsız algoritmalar yazdırmalarının sebebi de, başlangıç seviyesindeki öğrencilerin anlamlı algoritmalar yazacak seviyeye ulaşmamış olmalarıdır. Öğrenmek için de birşeyler yazmaları gerekiyor sonuçta.
Gökçe Tağlıoğlu

z

Alıntı yapılan: muhittin_kaplan - 13 Eylül 2012, 20:28:04
....Okullardaki Yarı Piskopat Hocaların "Anlamsız Olarak, Hiç Kullanılmayacak Algoritmalar Yazmalarını İstemeleri" gibi bir durum mudur bu ? ....
Örnek:
"Sıfırdan, Girilen Sayı Aralığının Finobacchi Dizilimini Yapan Fonksiyonunu Yazınız"


Matematikte öyle sorularla sorulur ki bu sorularla gerçek hayatta bugüne kadar hiç karşılaşılmamıştır belki de gelecekte de hiç karşılaşılmayacaktır.

Bu tip sorular problem çözmeyi öğretir. Piskopat olarak bahsettiğiniz hocaların sorduğu algoritma soruları, öğrencilerin algoritma oluşturma yeteneklerini artırmayı hedeflemektedir. Öte yandan bir algoritmanın hiç kullanılmayacağını söyleyebilmek için tüm bilim dallarına hakim olmak gerek.

Öte yandan algoritma oluşturmak,  problemin bilgisayara çözümünü tarif etmenin daha ötesinde bir çalışmadır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muuzoo

Hemen aklıma geldi bir kullanım alanı. Genetik algoritmada elitizm uygularken elimizdeki değerlerin sıralanıp değerlendirilmesi gerekiyor.  Mesela alışveriş sitelerinde fiyata göre sıralama yaptırıyoruz. Yada bir sınav sonucundaki başarı listesini oluşturuyoruz. Düşündükçe pek çok örnek çıkıyor.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

muhittin_kaplan

Konu Başka yerlere gidecek. Korkuyorum.

@Fatih hocam Böyle bir algoritma oluşturup sıralayacağıma 2 derinlikli bir değişkenle sıra ve yetki tanımlaması yaparım.kaldıki Uygulamada böyledir. uniq olan bir id ve yetki kodu verilir kullanıcılara.

@Tagli Hocam Sıra erişimli bellek te tutarsak bilgileri dediğiniz doğru ama Rastgele erişimşide adresi ver bilgiyi versin. neden sıralayıp tekrardan işlem yapayım ki  ?

@Z hocam Algoritma geliştirmeyi öğretmek için "gerçektem kullanılır" sorular verilsin. Sonrasında gerçek hayatta gerçek algoritmalar oluştursunlar.

@muuzoo Hocam elektronikte değilde genelde bilgisayar ve hatta veritabanında SQL kullanılarak yapılır dediğiniz. oda gerekirse "büyükten küçüğe sıralayarak ilk on kaydı ver" gibi. burada esas amaç en büyüğü yada tersini küçüğü bulmaktır.

ama aklıma birşey geldi. sıkıştırma algoritmalarında bu büyükten küçüğe sıralama kullanılıyor olabilr mi ?

Ayrıca Teker Teker Gelin

Klein

Neden sıralama yaparız?

gerçek hayattan gerçek bir gerekçe:

10 tane motorun var.  1-2 tanesi asıl diğerleri yedek.
Eş yaşlandırma yapacaksın.  Yani bir motor belirli bir süre çalıştıktan sonra, bir sonraki operasyonda ilk start alacak motor en az çalışmış olan yani en genç motor olacaktır. Aynı şekilde bir motor yetmediğinde 2., 3. ve sıra ile en genç olandan en yaşlı olana doğru motorları devreya alman gerekecek.   Motorların çalışma saatlerine (workhour)  bakarak motorları sıraya sokarsın.

Bunun için illa ki sıralama yapmak zorunda mıyız? hayır!
Ama öyle  ya da böyle bu motorların saatleri karşılaştırılacak.  Öyleyse her seferinde bunları karşılaştırmaktansa bir kez sıralar ve yoluma devam ederim.

Erdem

Alıntı yapılan: muhittin_kaplan - 14 Eylül 2012, 16:00:45
@Z hocam Algoritma geliştirmeyi öğretmek için "gerçektem kullanılır" sorular verilsin. Sonrasında gerçek hayatta gerçek algoritmalar oluştursunlar.

Evet bence  de mantıklı.

Örneğin bir arabanın üretim zincirinde mümkün olan işlemleri paralel yürüterek araba üretim süresinin minimuma indirilmesi çizit kuramının bir uygulamasıdır. Denilerek öğrenci teşvik edilebilir. Örneğin parçaların montajı ve direksiyonun bağlanmasından hemen sonra kablo ve elektrik işleri yapılacak vs..

Bu konu hocasının yeteneğine kalmış diye düşünüyorum. Örneğin burada daha ilk haftalardan Pacman'e nasıl arama yapacağını öğretmenizi istiyorlar:

http://www-inst.eecs.berkeley.edu/~cs188/fa11/projects/search/search.html