(Dengan asumsi bilangan positif.)
KPK terkecil kemungkinan besar berasal dari elemen terkecil, oleh karena itu untuk memangkas nilai percobaan, kita dapat mengurutkan array.
int[] v = { ... };
int minLCM = Integer.MAX_VALUE;
int bestVi = -1;
int bestVj = -1;
Arrays.sort(v);
for (int i = 0; i < v.length; ++i) {
int vi = v[i];
// _____________
for (int j = i + 1; j < v.length && v[j] < minLCM; ++j) {
int vj = v[j];
int lcm = lcm(vi, vj);
if (lcm < minLcm) {
minLCM = lcm;
bestVi = vi;
bestVj = vj;
}
}
}
Untuk pemangkasan:
lcm(vi, vj) >= vi
lcm(vi, vj) >= vj
(lcm(vi, vj) <= vi*vj
Pemangkasan ini dapat dilakukan di loop for-j hanya sebagai vj >= vi
.
Pemangkasan yang lebih baik dapat dilakukan jika Anda memiliki daftar (paling banyak ²log value
) faktor prima. Karena faktorisasi juga memerlukan biaya, kita bisa mencoba (2, 3, 5, 7) misalnya.
Perulangan yang lebih baik juga dapat dicapai dengan mengganti kedua perulangan bersarang sehingga yang terkecil (vi, vj) didahulukan. Di atas (v0, v100) muncul sebelum (v1, v2). Ulangi i+j yang semakin meningkat.
i j
0 1
0 2
0 3
1 2
0 4
1 3
0 5
1 4
2 3
...
(Perhitungan untuk penghitung loop menggunakan diagonal adalah teka-teki yang bagus. Harus benar-benar diselesaikan.)
Meskipun masih O(n²)
ini mungkin berhasil.
Terkadang bahasa pemrograman juga penting, dan dalam konteks tersebut sering kali kita melihat kontribusi C. Dalam kasus seperti itu, penggunaan Ruby mungkin kontraproduktif.
person
Joop Eggen
schedule
17.04.2019