Alıntı (zekeriyadurmus):
> gerçekten çok faydanız oldu bana.
Senin sorunun da bize çok faydası oldu. Deneysel alemlere kaydık. :-p
Alıntı:
> a in b gibi a nın b nin içinde olup olmadığını kontrol edebiliyoruz. Normal arraylar için bunun gibi birşey var mı?
Bu bir arama (find) konusu... Bunun bir çok yolu var.
Eğer dizideki elemanlar baştan sıralanmış iseler, bunun en hızlı yolu ikili aramadır. Şöyle bir kod:
import std.stdio;
import std.range;
import std.algorithm;
import std.random;
int[] sıralıDizi(int uzunluk)
{
return
iota(0, uzunluk)
.map!(a => uniform(0, uzunluk))
.array
.sort;
}
void main()
{
enum size_t uzunluk = 100;
auto dizi = sıralıDizi(uzunluk);
/* Elimizde zaten sıralanmış olan bir dizi olduğunda bunu program dilinde
* ifade etmenin yolu, assumeSorted'ı çağırmaktır. assumeSorted(),
* SortedRange şablonu döndürür ama tam türünü bilmek zorunda
* değilizdir. */
auto kesinSıralıAralık = assumeSorted(dizi);
/* Bazı Phobos algoritmaları SortedRange'i tanıdığından ve böylece
* aralığın sıralı olduğu kesin bilindiğinden, bu noktadan sonra o
* algoritmalar daha hızlı işlerler.
*
* Bu algoritmalardan birisi equalRange()'dir; verilen kıstasa uyan
* "ortadaki" aralığı verir: */
auto aranan = uzunluk / 2;
{
writeln("\n--- equalRange() ile ---");
auto sonuç = kesinSıralıAralık.equalRange(aranan);
if (sonuç.empty) {
writefln("%s aralıkta bulunamadı", aranan);
} else {
writefln("Sonuç: %s", sonuç);
}
}
/* Dizinin sıralı olup olmadığını bilmiyorsak o zaman dizilerde "sırayla
* arama" algoritmasını uygulayan find()'ı kullanabiliriz. */
{
writeln("\n--- find() ile ---");
auto sonuç = dizi.find(aranan);
if (sonuç.empty) {
writefln("%s aralıkta bulunamadı", aranan);
} else {
writefln("Şu noktada bulundu: %s", sonuç);
}
}
}
equalRange()'den başka hızlı algoritmalar da var ama bunlar hep dizinin sıralanmış olmasına dayanıyorlar. (Yani, assumeSorted()'un çağrılmış olması gerek.)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]