เหตุใดจึงต้องใช้การเปรียบเทียบแทนรันไทม์สำหรับการเปรียบเทียบอัลกอริธึมทั้งสอง


19

ฉันสังเกตเห็นว่าในรายงานวิจัย CS บางฉบับเพื่อเปรียบเทียบประสิทธิภาพของอัลกอริธึมสองอย่างจำนวนการเปรียบเทียบคีย์ทั้งหมดในอัลกอริทึมจะถูกนำมาใช้มากกว่าการคำนวณจริง ทำไมเราไม่เปรียบเทียบว่าอันไหนดีกว่ากันในการรันทั้งสองโปรแกรมและนับเวลาทั้งหมดที่จำเป็นในการรันอัลกอริทึม?


ยินดีต้อนรับ! ฉันหวังว่าเอกสารส่วนใหญ่ไม่ใช้ runtimes ฉันรู้ว่าบางคนทำโดยเฉพาะอย่างยิ่งในชุมชนที่ใช้มากขึ้นและเมื่อระบบที่พิจารณามีความซับซ้อนมาก
Raphael

คำตอบ:


14

นี่เป็นปัญหาที่ลึกซึ้งซึ่งมีคำตอบที่เป็นระบบและมีคำตอบอย่างจริงจัง ผมถือว่าคุณต้องการที่จะรู้ว่าสิ่งที่เกี่ยวกับอัลกอริทึม (s)ที่อยู่ในมือ หากคุณต้องการทราบว่าอัลกอริทึมใดทำงานได้ดีกว่าบนเครื่องที่กำหนดในอินพุตที่กำหนดให้ไปข้างหน้าและวัดค่ารันไทม์ หากคุณต้องการเปรียบเทียบคุณภาพของคอมไพเลอร์สำหรับอัลกอริทึมที่กำหนดให้ไปข้างหน้าและวัดค่าเวลาทำงาน สำหรับการเรียนรู้บางอย่างเกี่ยวกับอัลกอริทึมอย่าทำมัน

ให้ฉันก่อนให้เหตุผลบางอย่างว่าทำไมการใช้ runtimes ไม่ใช่ความคิดที่ดี

  1. Generality
    Runtimes วัดโดยใช้หนึ่งภาษาและหนึ่งคอมไพเลอร์ในเครื่องเดียวมีความหมายน้อยถ้าคุณเปลี่ยนส่วนประกอบใด ๆ แม้การใช้งานที่แตกต่างกันเล็กน้อยของอัลกอริทึมเดียวกันอาจดำเนินการแตกต่างกันเพราะคุณทริกเกอร์ opimisation คอมไพเลอร์ในกรณี แต่ไม่ได้อยู่ในอื่น ๆ
  2. การทำนาย
    ดังนั้นคุณมีเวลารันสองรอบสำหรับอินพุตบางตัว สิ่งนั้นบอกอะไรเกี่ยวกับรันไทม์ของอินพุตอื่น? โดยทั่วไปแล้วไม่มีอะไร
  3. ความสำคัญ
    โดยปกติแล้วคุณจะไม่ทำการเปรียบเทียบอินพุตทั้งหมด (บางขนาด) ดังนั้นจึงจำกัดความสามารถของคุณในการเปรียบเทียบอัลกอริธึมในทันที: ชุดทดสอบของคุณอาจเรียกใช้กรณีที่แย่ที่สุดในกรณีที่ดีที่สุด หรืออาจจะเป็นปัจจัยการผลิตของคุณมีขนาดเล็กเกินไปที่จะแสดงพฤติกรรมรันไทม์
  4. การวัดแสงการวัด
    ค่า runtimes อย่างดีนั้นไม่สำคัญ มี JIT ไหม มีการช่วงชิงกันบ้างหรือเปล่านั่นคือคุณนับเวลาที่อัลกอริทึมไม่ได้ทำงานหรือไม่ คุณสามารถสร้างสถานะเครื่องเหมือนกันทุกครั้งสำหรับการทำงานอื่น (ของอัลกอริทึมอื่น) โดยเฉพาะอย่างยิ่งในกระบวนการและแคชที่เกิดขึ้นพร้อมกันได้หรือไม่? การหน่วงเวลาหน่วยความจำมีการจัดการอย่างไร

ฉันหวังว่าสิ่งเหล่านี้ทำให้คุณมั่นใจว่า runtimes เป็นวิธีที่น่ากลัวในการเปรียบเทียบอัลกอริธึมและจำเป็นต้องใช้วิธีการทั่วไปในการตรวจสอบรันไทม์อัลกอริทึม

ไปยังส่วนที่สองของคำถาม ทำไมเราใช้การเปรียบเทียบหรือการดำเนินงานระดับประถมศึกษาที่คล้ายกัน

  1. ความสามารถในการวิเคราะห์ได้
    สมมติว่าคุณต้องการทำการวิเคราะห์อย่างเป็นทางการคุณต้องสามารถทำได้ การนับแต่ละประโยคนั้นเป็นเรื่องเทคนิคมากบางครั้งก็ยาก บางคนก็ทำเช่นนั้น (เช่น Knuth) การนับเฉพาะบางคำสั่ง - ข้อความที่มีอิทธิพลเหนือรันไทม์ - นั้นง่ายกว่า ด้วยเหตุผลเดียวกันเรามักจะ "เท่านั้น" ตรวจสอบ (ขอบเขตบนบน) รันไทม์กรณีที่เลวร้ายที่สุด

  2. Dominance
    การดำเนินการที่เลือกนั้นควบคุมการทำงานของรันไทม์ นั่นไม่ได้หมายความว่ามันมีส่วนช่วยรันไทม์ส่วนใหญ่ - การเปรียบเทียบไม่ชัดเจนเช่นใน Quicksort เมื่อเรียงลำดับจำนวนเต็มขนาดคำ แต่พวกเขาจะดำเนินการบ่อยที่สุดดังนั้นโดยการนับพวกเขาคุณนับความถี่ส่วนที่ดำเนินการมากที่สุดของอัลกอริทึมจะทำงาน ดังนั้นการทำงานแบบ asymptoticของคุณจึงแปรผันตามจำนวนการปฏิบัติการขั้นพื้นฐานที่สำคัญ นี่คือเหตุผลที่เรารู้สึกสบายใจที่ใช้สัญกรณ์รถม้าสี่ล้อและคำว่า "รันไทม์" แม้ว่าเราจะนับการเปรียบเทียบเท่านั้น

โปรดทราบว่ามันจะมีประโยชน์ในการนับมากกว่าหนึ่งการดำเนินการ ตัวอย่างเช่นตัวแปร Quicksort บางประเภทใช้การเปรียบเทียบมากกว่า แต่มีการแลกเปลี่ยนน้อยกว่ารุ่นอื่น ๆ (โดยเฉลี่ย)

สำหรับสิ่งที่คุ้มค่าหลังจากที่คุณได้ทำทุกทฤษฎีคุณอาจต้องการทบทวน runtimes เพื่อตรวจสอบว่าการคาดการณ์ที่ทฤษฎีของคุณทำนั้นดี หากไม่ใช่ทฤษฎีของคุณก็ไม่มีประโยชน์ (ในทางปฏิบัติ) และต้องขยายออกไป ลำดับชั้นของหน่วยความจำเป็นหนึ่งในสิ่งแรกที่คุณรู้ว่าสำคัญ แต่ขาดไปในการวิเคราะห์ขั้นพื้นฐาน


1
โปรดทราบว่าการวิเคราะห์อย่างเป็นทางการมีข้อ จำกัด เช่นกัน ตัวอย่างเช่นกรณีเฉลี่ยสำหรับการแจกแจงการป้อนข้อมูลที่ไม่สม่ำเสมอนั้นมักจะเป็นเรื่องยาก
Raphael

10

นี่เป็นเพราะเวลารวมในการเรียกใช้อัลกอริทึมนั้นขึ้นอยู่กับฮาร์ดแวร์ที่ใช้งานพร้อมกับปัจจัยอื่น ๆ มันไม่น่าเชื่อถือเลยที่จะเปรียบเทียบอัลกอริธึมสองอย่างถ้ามีใครใช้ Pentium 4 กับอีกอันที่ทำงานอยู่นั่นคือ Core i7 ไม่เพียงแค่นี้ แต่สมมุติว่าคุณรันทั้งสองอย่างบนคอมพิวเตอร์เครื่องเดียวกัน สิ่งที่จะบอกว่าพวกเขาทั้งสองมีเวลาประมวลผลเท่ากัน? จะเกิดอะไรขึ้นหากกระบวนการอื่นมีลำดับความสำคัญสูงกว่ากระบวนการของอัลกอริทึมอย่างใดอย่างหนึ่ง

เพื่อให้ผ่านสิ่งนี้เราแยกออกจากเวลาโดยรวมนี้ให้เสร็จสมบูรณ์และเปรียบเทียบกันโดยพิจารณาจากความแตกต่างของอัลกอริธึม คุณอาจสังเกตเห็นสัญกรณ์เช่น O (1) หรือ O (n ^ 2) ในงานวิจัย นี้จำเป็นต้องมีมากขึ้นอีกนิดอ่านถ้าคุณมีความเห็นที่สนใจBig O สัญกรณ์


1
นอกจากนี้เวลาทำงานจริงขึ้นอยู่กับขนาดและเนื้อหาของอินพุตจริงที่ใช้ในการเรียกใช้อัลกอริทึม!
Tsuyoshi Ito

7

เนื่องจากคำตอบอื่น ๆ อธิบายว่าทำไมเราวิเคราะห์ runtime ในแง่ของจำนวนการดำเนินงานเบื้องต้นให้ฉันเสนอเหตุผลสองประการว่าทำไมการเปรียบเทียบจึงเป็นตัวชี้วัดที่ถูกต้องของอัลกอริทึมการเรียงลำดับ (ไม่ใช่ทั้งหมด):

  • สำหรับอัลกอริธึมการเรียงลำดับจำนวนมากการเปรียบเทียบนั้นควบคุมเวลาทำงานนั่นคืออย่างน้อยที่สุดเมื่อทำการเปรียบเทียบหลาย ๆ ครั้งจะเป็นการดำเนินการขั้นพื้นฐานอื่น ๆ
  • การเปรียบเทียบเป็นการดำเนินการที่มีราคาแพง คิดเกี่ยวกับวิธีการนำรูทีนการเรียงลำดับมาใช้ในไลบรารี: ฟังก์ชันการเรียงลำดับจะถูกส่งผ่านอาร์เรย์ขององค์ประกอบและตัวชี้ไปยังฟังก์ชันที่เปรียบเทียบสององค์ประกอบ โดยทั่วไปแล้วการโทรและรอฟังก์ชั่นเปรียบเทียบเพื่อดำเนินการมีราคาแพงกว่าการดำเนินการ "ภายใน" เนื่องจากฟังก์ชั่นนี้ให้บริการโดยผู้ใช้จึงเป็นการยากที่จะปรับให้เหมาะสม
  • (นี่อาจเป็นเหตุผลที่ดีสำหรับบางคน) เราสามารถพูดสิ่งที่น่าสนใจเกี่ยวกับจำนวนการเปรียบเทียบที่เพียงพอและจำเป็นในการเรียงลำดับ เรารู้วิธีการทำเช่นนี้ในกรณีที่เลวร้ายที่สุดและโดยเฉลี่ยสำหรับการกระจายต่างๆแม้กระทั่งวิธีการออกแบบอัลกอริทึมที่ลู่ไปที่ดีที่สุดเท่าที่จะมีการเรียกใช้ในรายการชิม IID จากการกระจายที่ไม่รู้จัก (เป็นตัวเองปรับปรุงอัลกอริทึม ); เรารู้วิธีการทำเช่นนี้เมื่อมีการเปรียบเทียบบางอย่างฟรี ( เรียงลำดับด้วยข้อมูลบางส่วน )

1) "อย่างน้อยที่สุดการเปรียบเทียบจำนวนมากจะดำเนินการเหมือนกับการดำเนินงานระดับประถมศึกษาอื่น ๆ " - ขึ้นอยู่กับปัจจัยคงที่เท่านั้น 2) "การเปรียบเทียบเป็นการดำเนินการที่มีราคาแพง" - ซึ่งถือว่าเป็นการตั้งค่าทั่วไป สำหรับการเรียงลำดับจำนวนเต็ม (ซึ่งมักจะวิเคราะห์) โดยทั่วไปสัญญาแลกเปลี่ยนจะมีราคาแพงกว่า
กราฟิลส์

แน่ใจ op ดูเหมือนจะสับสนเกี่ยวกับการวิเคราะห์อัลกอริทึมโดยทั่วไปไม่ต้องการนำปัจจัยคงที่มาใช้ ฉันหวังว่าข้อเท็จจริงที่ว่าฉันกำลังพูดถึงการตั้งค่าทั่วไปมีความชัดเจนจากคำอธิบาย - ชุดคำสั่งการเรียงลำดับในไลบรารีมาตรฐานไม่ใช่การเรียงลำดับจำนวนเต็ม
Sasho Nikolov

รวมทั้งเอกสารที่ op op ไม่แน่นอนเกี่ยวกับอัลกอริธึมการเรียงจำนวนเต็มไม่มีใครนับจำนวนการเปรียบเทียบ
Sasho Nikolov

@Raphael การเรียงลำดับจำนวนเต็มขนาดเล็กไม่ใช่ปัญหาทั่วไปในทางปฏิบัติ ฉันจะเดิมพันส่วนใหญ่ที่เกิดขึ้นในโลกอยู่ในสาย ( ความยาวหรืออื่น ๆ ) แม้สำหรับการเรียงลำดับจำนวนเต็มฉันไม่แน่ใจว่ามันถูกต้องหรือไม่ที่การแลกเปลี่ยนมีราคาแพงกว่าการแยกย่อยเป็นการดำเนินการที่ค่อนข้างแพงในโปรเซสเซอร์ระดับสูงที่ทันสมัย
Gilles 'หยุดชั่วร้าย'

@Gilles ในตัวเองการแลกเปลี่ยนมีราคาแพงกว่าการเปรียบเทียบจำนวนเต็มมากกว่าแพลตฟอร์มใด ๆ ที่ฉันรู้ ค่าใช้จ่าย "รอง" อย่างเช่นการคาดคะเนความผิดพลาดของสาขาเป็นปัจจัยที่แน่นอนแน่นอนผลกระทบจากการวิจัยยังดำเนินอยู่ (เกี่ยวกับการใช้ในทางปฏิบัติผมไม่สามารถทำคำสั่งที่มีคุณภาพ แต่ผมสังเกตได้ว่าผู้ดูแลห้องสมุดมาตรฐานให้การปรับปรุงขั้นตอนวิธีการเรียงลำดับที่พวกเขาใช้สำหรับประเภทข้อมูลดั้งเดิมดังนั้นผมคิดว่าพวกเขาจะเห็นจำนวนมาก (AB) การใช้งาน..)
ราฟาเอล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.