Fannkuch
C++'tan 1,04 kat hızlı9 öğenin 362.880 permütasyonu · küçük liste işlemleri. Çubuk uzunsa daha hızlı.
Liste ve dizi
9 öğenin bütün permütasyonları üretilir; her birinde baştaki öğe 1 olana dek ön ek ters çevrilir. Küçük listelerde dizinlemeyi, takası ve dallanmayı ölçer.
Bu sayfayı KabaLang ile yazılmış sunucu sundu.
Canlı ölçüm
Fannkuch tarayıcınızda, WebAssembly ile koşar: KabaLang, C++, JavaScript ve Python. Ölçüm sayfası bu testi seçili açar; sonuçlar cihazınızda kalır.
9 öğenin 362.880 permütasyonu · küçük liste işlemleri. Çubuk uzunsa daha hızlı.
| Dil | En iyi | Ortalama | Derleme | İkili boyutu |
|---|---|---|---|---|
| KabaLang | 16,1 ms | 16,5 ms | 768 ms | 990 KB |
| C++ | 16,6 ms | 17,5 ms | 414 ms | 17 KB |
| Python | 362 ms | 368 ms | – | – |
Ne ölçüyor?
Kategori: Liste ve dizi. Liste okuma/yazma, dizinleme ve sınır denetimi. Üç program da aynı algoritmayı aynı adımlarla uygular ve aynı çıktıyı üretmek zorundadır; çıktı tutmazsa ölçüm geçersiz sayılır.
8629 30Derleme
kabalang derle program.kbl -o program
./programclang++ -O2 -o program program.cpp
./programpython3 program.py-O 2; program, çalışma zamanıyla
birlikte bağlama anında eniyilenir ve statik bağlanır (tek, bağımlılıksız ikili).-O2; standart kütüphaneye dinamik bağlı.Kaynak
Aşağıdaki dosyalar ölçülen programların kendisidir.
fonksiyon fannkuch(n: sayi) -> liste<sayi>:
perm1 = [0] * n
dongu i icinde 0..<n:
perm1[i] = i
sayac = [0] * n
en_cok = 0
saglama = 0
sira = 0
r = n
iken dogru:
iken r != 1:
sayac[r - 1] = r
r -= 1
perm = perm1
cevirme = 0
k = perm[0]
iken k != 0:
i = 0
j = k
iken i < j:
gecici = perm[i]
perm[i] = perm[j]
perm[j] = gecici
i += 1
j -= 1
cevirme += 1
k = perm[0]
eger cevirme > en_cok:
en_cok = cevirme
eger sira % 2 == 0:
saglama += cevirme
degilse:
saglama -= cevirme
iken dogru:
eger r == n:
don [saglama, en_cok]
ilk = perm1[0]
dongu i icinde 0..<r:
perm1[i] = perm1[i + 1]
perm1[r] = ilk
sayac[r] -= 1
eger sayac[r] > 0:
kir
r += 1
sira += 1
don [saglama, en_cok]
sonuc = fannkuch(9)
yazdir(sonuc[0], sonuc[1])#include <algorithm>
#include <iostream>
#include <vector>
std::pair<int, int> fannkuch(int n) {
std::vector<int> perm1(n), perm(n), sayac(n, 0);
for (int i = 0; i < n; ++i) perm1[i] = i;
int en_cok = 0, saglama = 0, sira = 0, r = n;
while (true) {
while (r != 1) {
sayac[r - 1] = r;
--r;
}
perm = perm1;
int cevirme = 0;
int k = perm[0];
while (k != 0) {
std::reverse(perm.begin(), perm.begin() + k + 1);
++cevirme;
k = perm[0];
}
en_cok = std::max(en_cok, cevirme);
saglama += sira % 2 == 0 ? cevirme : -cevirme;
while (true) {
if (r == n) return {saglama, en_cok};
int ilk = perm1[0];
for (int i = 0; i < r; ++i) perm1[i] = perm1[i + 1];
perm1[r] = ilk;
if (--sayac[r] > 0) break;
++r;
}
++sira;
}
}
int main() {
auto [saglama, en_cok] = fannkuch(9);
std::cout << saglama << " " << en_cok << std::endl;
return 0;
}def fannkuch(n):
perm1 = list(range(n))
sayac = [0] * n
en_cok = 0
saglama = 0
sira = 0
r = n
while True:
while r != 1:
sayac[r - 1] = r
r -= 1
perm = perm1[:]
cevirme = 0
k = perm[0]
while k != 0:
perm[: k + 1] = perm[k::-1]
cevirme += 1
k = perm[0]
en_cok = max(en_cok, cevirme)
saglama += cevirme if sira % 2 == 0 else -cevirme
while True:
if r == n:
return saglama, en_cok
ilk = perm1[0]
for i in range(r):
perm1[i] = perm1[i + 1]
perm1[r] = ilk
sayac[r] -= 1
if sayac[r] > 0:
break
r += 1
sira += 1
saglama, en_cok = fannkuch(9)
print(saglama, en_cok)function fannkuch(n) {
const perm1 = Array.from({ length: n }, (_, i) => i);
const sayac = new Array(n).fill(0);
let enCok = 0, saglama = 0, sira = 0, r = n;
for (;;) {
while (r !== 1) {
sayac[r - 1] = r;
r--;
}
const perm = perm1.slice();
let cevirme = 0;
let k = perm[0];
while (k !== 0) {
// ilk k + 1 öğeyi ters çevir
for (let i = 0, j = k; i < j; i++, j--) {
const t = perm[i]; perm[i] = perm[j]; perm[j] = t;
}
cevirme++;
k = perm[0];
}
enCok = Math.max(enCok, cevirme);
saglama += sira % 2 === 0 ? cevirme : -cevirme;
for (;;) {
if (r === n) return [saglama, enCok];
const ilk = perm1[0];
for (let i = 0; i < r; i++) perm1[i] = perm1[i + 1];
perm1[r] = ilk;
if (--sayac[r] > 0) break;
r++;
}
sira++;
}
}
export default function program(yaz = console.log) {
const [saglama, enCok] = fannkuch(9);
yaz(saglama + " " + enCok);
}
// `node program.js` ile de koşar (tarayıcıda ölçüm işçisi program()ı çağırır).
if (globalThis.process?.argv?.[1]?.endsWith("program.js")) program();