Kodunuzdaki aşağıdaki satırı zipf()
yapılan her arama için n
kez yürütülür:
sum_prob = sum_prob + c/pow((double) i, alpha);
O pow()
işlevi çağırmak için gerekli olduğunu üzüntü vericidir, içten, bu işlev çünkü Bir değil iki Taylor dizisi toplar. [pow(x, alpha) == exp(alpha*log(x))
]. alpha
bir tamsayıysa, elbette, pow()
'u basit çarpma ile değiştirerek kodu çok hızlandırabilirsiniz. alpha
rasyonel bir sayı ise, o zaman iki Taylor serisinin yerini almak için bir Newton-Raphson iterasyonunu kodlayarak kodu daha az bir dereceye kadar hızlandırabilirsiniz. Son durumun tutulması halinde lütfen öneride bulunun.
Neyse ki, alpha
'un değişmediğini belirttiniz. pow((double) i, alpha)
tablosunu hazırlayarak kodu fazla hızlandıramazsınız, daha sonra tabloya zipf()
numaranızı verebilirsiniz? Bu şekilde, zipf()
'un pow()
'u aramak zorunda kalmayacaktı. Bunun önemli zaman tasarrufu sağlayacağından şüpheleniyorum.
Yine de daha fazla iyileştirme mümkündür. sumprob()
işlevini zipf()
dışında bir faktöre çarptınysan ne olur? sumprob()
'un kullanımı için daha agresif bir arama tablosu hazırlamıyor musunuz? Belki bu fikirlerden bazıları sizi doğru yönde hareket ettirecektir. Onlarla ne yapamayacağınızı görün.
Güncelleme: Şimdi tekrar gözden geçirilmiş olarak sorduğunuz sorunun bu cevabı kullanamayacağını görüyorum. Şu andan itibaren, sorunuz karmaşık değişken teorisinde bir soruya dönüşebilir. Bu, genellikle bildiğiniz gibi kolay sorular değildir. Yeterince zeki bir matematikçi, ilgili bir yineleme ilişkisini veya normal dağıtımının Box-Muller tekniği gibi bir hile olduğunu keşfetmiş olabilir, ancak eğer varsa, tekniği tanımadım. İyi şanslar. (Muhtemelen sizin için önemli değildir, ancak, N. N. Lebedev'in 1972 tarihli mükemmel kitabı Özel İşlevleri ve Uygulamaları, Rusça'dan İngilizce bir çevirimiçi baskıda mevcuttur.Gerçekten, gerçekten bu sorunu vurmak istiyorum varsa, Lebedev sonraki okuyabilir - ama tabii ki umutsuz ölçüsüdür, değil mi) Bu arada
İşe Yarar 'veya aynı değerini her zaman var:
İşte
o sadece birine uygunluk
genzipf.c
yılındazipf()
işlevini yerine edilir işlevi mi çağırıyorsun? – thbAlfa parametresi, işlevi her çağırdığımda aynı değere sahiptir. –
Bu sorun için hala daha verimli bir çözümle ilgileniyor musunuz? – cardinal