คำตอบอื่น ๆ ทั้งหมดถูกต้องฉันแค่ต้องการแก้ไขต่อไปนี้ ฉันอยากจะดูว่าถ้าการลดการเอ็กซีคิวต์ของ k-loop นั้นเพียงพอแล้วที่จะลดความซับซ้อนที่แท้จริงด้านล่างO(n⁴).
ดังนั้นฉันจึงเขียนสิ่งต่อไปนี้:
for (int n = 1; n < 363; ++n) {
int sum = 0;
for(int i = 1; i < n; ++i) {
for(int j = 1; j < i * i; ++j) {
if(j % i == 0) {
for(int k = 0; k < j; ++k) {
sum++;
}
}
}
}
long cubic = (long) Math.pow(n, 3);
long hypCubic = (long) Math.pow(n, 4);
double relative = (double) (sum / (double) hypCubic);
System.out.println("n = " + n + ": iterations = " + sum +
", n³ = " + cubic + ", n⁴ = " + hypCubic + ", rel = " + relative);
}
หลังจากดำเนินการตามนี้จะเห็นได้ชัดว่าความซับซ้อนนั้นจริงn⁴
แล้ว บรรทัดสุดท้ายของการส่งออกมีลักษณะเช่นนี้:
n = 356: iterations = 1989000035, n³ = 45118016, n⁴ = 16062013696, rel = 0.12383254507467704
n = 357: iterations = 2011495675, n³ = 45499293, n⁴ = 16243247601, rel = 0.12383580700180696
n = 358: iterations = 2034181597, n³ = 45882712, n⁴ = 16426010896, rel = 0.12383905075183874
n = 359: iterations = 2057058871, n³ = 46268279, n⁴ = 16610312161, rel = 0.12384227647628734
n = 360: iterations = 2080128570, n³ = 46656000, n⁴ = 16796160000, rel = 0.12384548432498857
n = 361: iterations = 2103391770, n³ = 47045881, n⁴ = 16983563041, rel = 0.12384867444612208
n = 362: iterations = 2126849550, n³ = 47437928, n⁴ = 17172529936, rel = 0.1238518469862343
สิ่งนี้แสดงให้เห็นว่าความแตกต่างสัมพัทธ์จริงระหว่างจริงn⁴
และความซับซ้อนของส่วนรหัสนี้เป็นปัจจัยเชิงเส้นกำกับที่มีค่า0.124...
(จริง ๆ 0.125) แม้ว่ามันจะไม่ให้คุณค่าที่แน่นอนแก่เรา แต่เราสามารถอนุมานได้ดังนี้:
ความซับซ้อนเวลาเป็นสิ่งn⁴/8 ~ f(n)
ที่f
เป็นหน้าที่ของคุณ / วิธีการ
- หน้าวิกิพีเดียในสัญลักษณ์ Big O ระบุไว้ในตารางของ 'Family of Bachmann – Landau notation' ที่
~
กำหนดขีด จำกัด ของตัวถูกดำเนินการทั้งสองด้านเท่ากัน หรือ:
f เท่ากับ g asymptotically
(ฉันเลือก 363 เป็นขอบเขตบนที่ไม่รวมเนื่องจากn = 362
เป็นค่าสุดท้ายที่เราได้รับผลลัพธ์ที่สมเหตุสมผลหลังจากนั้นเราเกินพื้นที่ยาวและค่าสัมพัทธ์กลายเป็นลบ)
ผู้ใช้ kaya3 คิดออกดังต่อไปนี้:
ค่าคงที่เชิงเส้นกำกับเท่ากับ 1/8 = 0.125 โดยวิธี; นี่คือสูตรที่แน่นอนผ่าน Wolfram Alpha
for (j = i; j < i *i; j += i)
จากนั้นคุณไม่จำเป็นต้องทดสอบโมดูลัส (เพราะj
รับประกันได้ว่าจะหารด้วยi
)