นี่เป็นปัญหาที่ลึกซึ้งซึ่งมีคำตอบที่เป็นระบบและมีคำตอบอย่างจริงจัง ผมถือว่าคุณต้องการที่จะรู้ว่าสิ่งที่เกี่ยวกับอัลกอริทึม (s)ที่อยู่ในมือ หากคุณต้องการทราบว่าอัลกอริทึมใดทำงานได้ดีกว่าบนเครื่องที่กำหนดในอินพุตที่กำหนดให้ไปข้างหน้าและวัดค่ารันไทม์ หากคุณต้องการเปรียบเทียบคุณภาพของคอมไพเลอร์สำหรับอัลกอริทึมที่กำหนดให้ไปข้างหน้าและวัดค่าเวลาทำงาน สำหรับการเรียนรู้บางอย่างเกี่ยวกับอัลกอริทึมอย่าทำมัน
ให้ฉันก่อนให้เหตุผลบางอย่างว่าทำไมการใช้ runtimes ไม่ใช่ความคิดที่ดี
- Generality
Runtimes วัดโดยใช้หนึ่งภาษาและหนึ่งคอมไพเลอร์ในเครื่องเดียวมีความหมายน้อยถ้าคุณเปลี่ยนส่วนประกอบใด ๆ แม้การใช้งานที่แตกต่างกันเล็กน้อยของอัลกอริทึมเดียวกันอาจดำเนินการแตกต่างกันเพราะคุณทริกเกอร์ opimisation คอมไพเลอร์ในกรณี แต่ไม่ได้อยู่ในอื่น ๆ
- การทำนาย
ดังนั้นคุณมีเวลารันสองรอบสำหรับอินพุตบางตัว สิ่งนั้นบอกอะไรเกี่ยวกับรันไทม์ของอินพุตอื่น? โดยทั่วไปแล้วไม่มีอะไร
- ความสำคัญ
โดยปกติแล้วคุณจะไม่ทำการเปรียบเทียบอินพุตทั้งหมด (บางขนาด) ดังนั้นจึงจำกัดความสามารถของคุณในการเปรียบเทียบอัลกอริธึมในทันที: ชุดทดสอบของคุณอาจเรียกใช้กรณีที่แย่ที่สุดในกรณีที่ดีที่สุด หรืออาจจะเป็นปัจจัยการผลิตของคุณมีขนาดเล็กเกินไปที่จะแสดงพฤติกรรมรันไทม์
- การวัดแสงการวัด
ค่า runtimes อย่างดีนั้นไม่สำคัญ มี JIT ไหม มีการช่วงชิงกันบ้างหรือเปล่านั่นคือคุณนับเวลาที่อัลกอริทึมไม่ได้ทำงานหรือไม่ คุณสามารถสร้างสถานะเครื่องเหมือนกันทุกครั้งสำหรับการทำงานอื่น (ของอัลกอริทึมอื่น) โดยเฉพาะอย่างยิ่งในกระบวนการและแคชที่เกิดขึ้นพร้อมกันได้หรือไม่? การหน่วงเวลาหน่วยความจำมีการจัดการอย่างไร
ฉันหวังว่าสิ่งเหล่านี้ทำให้คุณมั่นใจว่า runtimes เป็นวิธีที่น่ากลัวในการเปรียบเทียบอัลกอริธึมและจำเป็นต้องใช้วิธีการทั่วไปในการตรวจสอบรันไทม์อัลกอริทึม
ไปยังส่วนที่สองของคำถาม ทำไมเราใช้การเปรียบเทียบหรือการดำเนินงานระดับประถมศึกษาที่คล้ายกัน
ความสามารถในการวิเคราะห์ได้
สมมติว่าคุณต้องการทำการวิเคราะห์อย่างเป็นทางการคุณต้องสามารถทำได้ การนับแต่ละประโยคนั้นเป็นเรื่องเทคนิคมากบางครั้งก็ยาก บางคนก็ทำเช่นนั้น (เช่น Knuth) การนับเฉพาะบางคำสั่ง - ข้อความที่มีอิทธิพลเหนือรันไทม์ - นั้นง่ายกว่า ด้วยเหตุผลเดียวกันเรามักจะ "เท่านั้น" ตรวจสอบ (ขอบเขตบนบน) รันไทม์กรณีที่เลวร้ายที่สุด
Dominance
การดำเนินการที่เลือกนั้นควบคุมการทำงานของรันไทม์ นั่นไม่ได้หมายความว่ามันมีส่วนช่วยรันไทม์ส่วนใหญ่ - การเปรียบเทียบไม่ชัดเจนเช่นใน Quicksort เมื่อเรียงลำดับจำนวนเต็มขนาดคำ แต่พวกเขาจะดำเนินการบ่อยที่สุดดังนั้นโดยการนับพวกเขาคุณนับความถี่ส่วนที่ดำเนินการมากที่สุดของอัลกอริทึมจะทำงาน ดังนั้นการทำงานแบบ asymptoticของคุณจึงแปรผันตามจำนวนการปฏิบัติการขั้นพื้นฐานที่สำคัญ นี่คือเหตุผลที่เรารู้สึกสบายใจที่ใช้สัญกรณ์รถม้าสี่ล้อและคำว่า "รันไทม์" แม้ว่าเราจะนับการเปรียบเทียบเท่านั้น
โปรดทราบว่ามันจะมีประโยชน์ในการนับมากกว่าหนึ่งการดำเนินการ ตัวอย่างเช่นตัวแปร Quicksort บางประเภทใช้การเปรียบเทียบมากกว่า แต่มีการแลกเปลี่ยนน้อยกว่ารุ่นอื่น ๆ (โดยเฉลี่ย)
สำหรับสิ่งที่คุ้มค่าหลังจากที่คุณได้ทำทุกทฤษฎีคุณอาจต้องการทบทวน runtimes เพื่อตรวจสอบว่าการคาดการณ์ที่ทฤษฎีของคุณทำนั้นดี หากไม่ใช่ทฤษฎีของคุณก็ไม่มีประโยชน์ (ในทางปฏิบัติ) และต้องขยายออกไป ลำดับชั้นของหน่วยความจำเป็นหนึ่งในสิ่งแรกที่คุณรู้ว่าสำคัญ แต่ขาดไปในการวิเคราะห์ขั้นพื้นฐาน