ฉันต้องการอัลกอริธึมหรือโค้ดที่เร็วใน C จริงๆ เพื่อทำงานต่อไปนี้: รวมตัวเลขทั้งหมดตั้งแต่ 1 ถึง N สำหรับจำนวนเต็ม N ที่กำหนดใดๆ โดยไม่ถือว่า N เป็นบวก ฉันสร้างการวนซ้ำโดยรวมจาก 1 ถึง N แต่มันช้าเกินไป
อัลกอริธึมที่เร็วที่สุดในการรวมตัวเลขสูงสุด N [ปิด]
คำตอบ (8)
ถ้า N
เป็นบวก: int sum = N*(N+1)/2;
ถ้า N
เป็นค่าลบ: int tempN = -N; int sum = 1 + tempN*(tempN+1)/2 * (-1);
+ 1
ต่อท้าย 1 + 0 + -1 + -2 = -2 ไม่ใช่ -3
- person tloflin; 12.04.2010
>> 1
)
- person erikkallen; 12.04.2010
N/2
ค้นหาค่าเฉลี่ยของตัวเลขทั้งหมดระหว่าง 0 ถึง N เราเริ่มต้นที่ 1 ดังนั้นให้เปลี่ยนเป็น (N+1)/2
ตอนนี้เรามีค่าเฉลี่ยแล้ว เราแค่ต้องคูณด้วยจำนวนค่าในลำดับ (N) (จริงๆ แล้ว N-1(ค่าเริ่มต้น)+1(1 ถึง 2 มี 2 ค่า ไม่ใช่ 2-1=1 ) แต่ N-1+1=N) ดังนั้น N*((N+1)/2)
ลดลง = N*(N+1)/2
- person Ponkadoodle; 13.04.2010
สูตรที่คุณกำลังมองหาคือรูปแบบทั่วไปของสูตรที่โพสต์ในหลายคำตอบสำหรับคำถามของคุณ ซึ่งก็คือ ชุดเลขคณิต/ความก้าวหน้า ด้วยปัจจัย ผลต่าง ที่ 1 จาก Wikipedia มีดังต่อไปนี้:
สูตรข้างต้นจะจัดการกับจำนวนลบตราบใดที่ m น้อยกว่า n เสมอ ตัวอย่างเช่น หากต้องการหาผลรวมตั้งแต่ 1 ถึง -2 ให้ตั้งค่า m เป็น -2 และ n เป็น 1 กล่าวคือ ผลรวมจาก -2 ถึง 1 การทำเช่นนี้ส่งผลให้:
(1 - -2 + 1) * (1 + -2) / 2 = 4 * -1 / 2 = -4 / 2 = -2.
ซึ่งเป็นผลที่คาดว่าจะได้รับ
เพียงเพื่อตอบคำถามข้างต้นให้สมบูรณ์ นี่คือวิธีที่คุณพิสูจน์สูตร (ตัวอย่างสำหรับจำนวนเต็มบวก แต่หลักการจะเหมือนกันสำหรับค่าลบหรือชุดเลขคณิตใดๆ ตามที่ Void ชี้ให้เห็น)
เพียงเขียนชุดสองครั้งตามด้านล่างแล้วบวกตัวเลข:
1+ 2+ 3+ ... n-2+ n-1+ n = sum(1..n) : n terms from 1 to n
+ n+ n-1+ n-2+ ... 3+ 2+ 1 = sum(n..1) : the same n terms in reverse order
--------------------------------
n+1+ n+1+ n+1+ ... n+1+ n+1+ n+1 = 2 * sum(1..n) : n times n+1
n * (n+1) / 2 = sum(1..n)
เพื่อจัดการกับจำนวนเต็มล้น ฉันจะใช้ฟังก์ชันต่อไปนี้:
sum = (N%2) ? ( ((N+1)/2)*N ) : ( (N/2)*(N+1) );
ลองสิ่งนี้...
โดยที่ n คือจำนวนเต็มสูงสุดที่คุณต้องหาผลรวม
ผลรวมคือ (n*(N+1))/2
คุณเคยได้ยินเกี่ยวกับลำดับและซีรีส์บ้างไหม? รหัส 'เร็ว' ที่คุณต้องการคือผลรวมของชุดเลขคณิตตั้งแต่ 1 ถึง N .. google it .. infact เปิดหนังสือคณิตศาสตร์ของคุณ ..
ถ้า |n| มีขนาดเล็กพอ ตารางการค้นหาจะเป็นตารางที่เร็วที่สุด
หรือใช้แคช ค้นหาแคชก่อน หากไม่พบบันทึก ให้คำนวณผลรวมโดยใช้ n * (n + 1) / 2(ถ้า n เป็นบวก) แล้วบันทึกผลลัพธ์ลงในแคช
O(log N)
จริงๆ เว้นแต่คุณจะจำกัดค่าของ N
ซึ่งในกรณีนี้ naïve loop จะเป็น O(1)
เช่นกัน
- person avakar; 12.04.2010
O(log N)
อยู่จริงหรือไม่ Wikipedia ไม่แสดงรายการใดๆ: en.wikipedia.org/wiki/
- person erikkallen; 13.04.2010
log N
ก็ควรจะพูดว่า \Omega(log N)
- person avakar; 13.04.2010
O(log N log log N log log log N)
- person erikkallen; 13.04.2010