Alıntı (erdem):
>Burada bahsettiğiniz hız farkı mihenk olarak seçilen değer ile ilgili değil sanırım.
Onunla ilgili değil. Ama mihenk olarak ilk elemanın seçilmesinin uygun olmadığı da bilinir. Ben de bir çok qsort gerçekleştirmesi gibi ortadaki elemanı seçiyordum.
Alıntı:
>Benim hatırladığım kadarıyla dilimler bir referans gerçekleşmesi değil miydi.
Evet, var olan ve çoğunlukla çalışma ortamının (D runtime) sahip olduğu elemanlara erişim sağlayan araçlardır.
Alıntı:
>'array()' işlevini kullanmadan sadece dilimlerle yapsaydık nasıl olurdu.
Sadece dilimlerle yapabilmek için yine de elemanların bir yerde bulunmaları gerekirdi. Dilimler de onlara erişim sağlıyor olurlardı. O elemanlar nerede olsa? En iyisi baştan verilen elemanlardır. Sıralamayı onun üzerinde yapsak hiç yeni bellek ayırmak gerekmez.
array() heveslidir. Bunu çok daha basit bir örnekte görelim:
import std.stdio;
import std.algorithm;
void main()
{
auto sayılar = [ 1, 2, 3, 4, 5 ];
auto tekler = sayılar.filter!(x => x % 2)();
writeln(tekler);
}
O koddaki tekler'in bir dizi veya dilim olmadığını görüyor muyuz? filter süzme işini hevesli bir biçimde hemen yapmaz. O, yalnızca süzme işini gerçekleştirecek olan bir aralık döndürür. sayılar'ın uzunluğu sonsuz bile olsa filter hemen o arılığı üretir ve döner.
writeln de InputRange'lerle işlemeyi bildiği için filter'ın döndürdüğü aralığı popFront() yapa yapa ilerletir ve eline geçen tek sayıları yazdırır.
Buraya kadar güzel: Tembellik harika! :)
Sen ise o tembel aralığın ürettiği elemanlardan array() ile bir dizi oluşturuyorsun. array, InputRange'i tüketene kadar eleman çeker ve bir dizinin sonuna ekler.
Birinci sorun o: elemanlar teker teker bir dizinin sonuna eklenecekler. Bu işlem sırasında kapasite yetmedikçe daha büyük yer ayrılacak ve eklemeler orada devam edecek, vs.
Ondan sonra küçük ve büyük dizilerini de ayrıca birleştiriyorsun. Eğer yine kapasite yeterli değilse yine yeni bir yere kopyalanacaklar demektir.
(Elemanların nerede durduklarını dilimlerin .ptr niteliği ile görebiliriz.)
Phobos'un partition3 işlevi ise hiç yer ayırmadan kendisine verilen elemanları değiş tokuş ederek gittikçe doğru sırayı buluyor. Döndürdüğü şey üç dilimden oluşan bir çokuzludur: mihenkten küçük olanlar, mihenge eşit olanlar, ve mihenkten büyük olanlar.
Dilimlerin referanslıklarının yararı partition3'te görülüyor: Eleman kopyalama yok; yalnızca o bölümlere eriştiren dilimler döndürüyor.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]