ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 7"
Aoy (คุย | มีส่วนร่วม) |
Aoy (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 1 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
แถว 7: | แถว 7: | ||
จากแนวคิดข้างต้น นำมาเขียนเป็น pseudocode ได้ดังนี้ | จากแนวคิดข้างต้น นำมาเขียนเป็น pseudocode ได้ดังนี้ | ||
+ | <geshi lang="c"> | ||
FINDMAX(A,i,j) | FINDMAX(A,i,j) | ||
− | + | { | |
− | + | max<-- -1000000 | |
− | + | for k=i to i<=j | |
− | + | { | |
− | + | if A[k] > max | |
− | + | { | |
+ | max= A[k] | ||
+ | max_k=k | ||
+ | } | ||
+ | } | ||
+ | return max_k | ||
+ | } | ||
+ | </geshi> | ||
+ | <geshi lang="c"> | ||
FINDMIN(A,i,j) | FINDMIN(A,i,j) | ||
− | + | { | |
− | + | min<-- 1000000 | |
− | + | for k=i to k<=j | |
− | + | { | |
− | + | if A[k] < min | |
− | + | { | |
+ | min= A[k] | ||
+ | min_k=k | ||
+ | } | ||
+ | } | ||
+ | return min_k | ||
+ | } | ||
+ | </geshi> | ||
+ | <geshi lang="c"> | ||
COUNTINTERVAL(A,n) | COUNTINTERVAL(A,n) | ||
− | + | { | |
− | + | count <-- 0 | |
− | + | for i=0 to i<n | |
− | + | { | |
− | + | for j=i to j<n | |
− | + | { | |
− | + | max=FINDMAX(A,i,j) | |
− | + | min=FINDMIN(A,i,j) | |
− | + | r=max-min | |
− | + | for k=p to k<=q | |
+ | { | ||
+ | if r=k | ||
+ | count <-- count + 1 | ||
+ | } //end for k | ||
+ | } //end for j | ||
+ | } //end for i | ||
+ | return count | ||
+ | } | ||
+ | </geshi> | ||
เวลาการทำงานของอัลกอริทึม การหยิบลำดับย่อยแต่ละลำดับมาดู เราใช้ for loop สองชั้น และการคำนวณค่าพิสัยของแต่ละลำดับย่อยใช้เวลาอีก <math>O(n) \,</math> ดังนั้นเวลารวมของสองขั้นตอนนี้คือ<math>O(n^3) \,</math> ส่วนการตรวจสอบว่าค่าพิสัยของลำดับย่อยอยู่ในช่วง <math>[p,q] \,</math> หรือไม่ใช้เวลาอีก <math>q-p+1 \, </math> ดังนั้นเวลาการทำงานทั้งหมดจึงเป็น <math>O(n^3) \,</math> | เวลาการทำงานของอัลกอริทึม การหยิบลำดับย่อยแต่ละลำดับมาดู เราใช้ for loop สองชั้น และการคำนวณค่าพิสัยของแต่ละลำดับย่อยใช้เวลาอีก <math>O(n) \,</math> ดังนั้นเวลารวมของสองขั้นตอนนี้คือ<math>O(n^3) \,</math> ส่วนการตรวจสอบว่าค่าพิสัยของลำดับย่อยอยู่ในช่วง <math>[p,q] \,</math> หรือไม่ใช้เวลาอีก <math>q-p+1 \, </math> ดังนั้นเวลาการทำงานทั้งหมดจึงเป็น <math>O(n^3) \,</math> |
รุ่นแก้ไขปัจจุบันเมื่อ 09:47, 4 กันยายน 2552
อินพุต: ลำดับของจำนวนเต็ม จำนวน และช่วง
เอาพุต: จำนวนของลำดับย่อยที่มีพิสัยในช่วง
แนวคิด ข้อนี้วัตถุที่เราสนใจคือ ช่วง เรามีวิธีในการหาช่วงแล้วในห้องเรียน เราจะใช้วิธีนั้นกัน ค่าของวัตถุที่เราสนใจก็คือ การนำค่ามากที่สุดในช่วง มาลบกับค่าที่น้อยที่สุดในช่วง ซึ่งวิธีในการหาค่ามากที่สุด กับน้อยที่สุดเราก็เรียนไปแล้วในห้องเรียน และเงื่อนไขในข้อนี้คือ พิสัยอยู่ในช่วง ดังนั้นเมื่อได้พิสัยของแต่ละช่วงมาแล้ว เราก็ต้องนำมาตรวจสอบว่าอยู่ในช่วงดังกล่าวหรือไม่ ถ้าอยู่ที่เพิ่มตัวนับจำนวนขึ้นไปเรื่อย ๆ
จากแนวคิดข้างต้น นำมาเขียนเป็น pseudocode ได้ดังนี้
<geshi lang="c"> FINDMAX(A,i,j) {
max<-- -1000000 for k=i to i<=j { if A[k] > max { max= A[k] max_k=k } } return max_k
} </geshi>
<geshi lang="c"> FINDMIN(A,i,j) {
min<-- 1000000 for k=i to k<=j { if A[k] < min { min= A[k] min_k=k } } return min_k
} </geshi>
<geshi lang="c"> COUNTINTERVAL(A,n) {
count <-- 0 for i=0 to i<n { for j=i to j<n { max=FINDMAX(A,i,j) min=FINDMIN(A,i,j) r=max-min for k=p to k<=q { if r=k count <-- count + 1 } //end for k } //end for j } //end for i return count
} </geshi>
เวลาการทำงานของอัลกอริทึม การหยิบลำดับย่อยแต่ละลำดับมาดู เราใช้ for loop สองชั้น และการคำนวณค่าพิสัยของแต่ละลำดับย่อยใช้เวลาอีก ดังนั้นเวลารวมของสองขั้นตอนนี้คือ ส่วนการตรวจสอบว่าค่าพิสัยของลำดับย่อยอยู่ในช่วง หรือไม่ใช้เวลาอีก ดังนั้นเวลาการทำงานทั้งหมดจึงเป็น