DCTLib นั้นถูกต้อง แต่ลืมคณิตศาสตร์ไปหนึ่งวินาที
โดยตรรกะของคุณแล้วn -ary ควรจะเร็วที่สุด แต่ถ้าคุณคิดเกี่ยวกับมันn -ary จะเท่ากับการค้นหาการวนซ้ำปกติ (เพียงแค่วนซ้ำในรายการ 1 คูณ 1 แต่เรียงตามลำดับย้อนหลัง) ก่อนอื่นให้คุณเลือกรายการสุดท้าย (หรือถัดจากสุดท้าย) ในรายการและเปรียบเทียบค่านั้นกับค่าการเปรียบเทียบของคุณ จากนั้นคุณลบรายการนั้นออกจากรายการของคุณแล้วเลือกรายการสุดท้ายในรายการใหม่ซึ่งเป็นเพียงถัดจากค่าสุดท้ายในอาร์เรย์ แต่ละครั้งคุณจะกำจัดค่า 1 ครั้งเท่านั้นจนกว่าคุณจะพบค่าของคุณ
คุณควรคิดแบบนี้แทน - ฉันจะกำจัดค่ามากที่สุดจากรายการแต่ละการวนซ้ำได้อย่างไร ในการค้นหาแบบไบนารีคุณจะกำจัดรายการครึ่งหนึ่งได้เสมอ ในการค้นหาแบบไตรภาคมีความเป็นไปได้ (33.33% มีโอกาสจริง ๆ ) ที่คุณสามารถกำจัด 2/3 ของรายการ แต่มีโอกาสมากขึ้น (66.66%) ที่คุณจะกำจัดเพียงหนึ่งในสามของรายการ ในการคำนวณ O (n) คุณต้องดูสถานการณ์กรณีที่เลวร้ายที่สุดคือ 1/3 ซึ่งน้อยกว่า 1/2 เมื่อคุณเข้าใกล้ n มากขึ้นเรื่อย ๆ มันยิ่งแย่ลงไปอีก
สถานการณ์กรณีที่เลวร้ายที่สุดไม่เพียง แต่จะได้รับการปรับปรุงด้วยการค้นหาแบบไบนารี แต่เวลาเฉลี่ยของคุณก็จะดีขึ้นเช่นกัน ดูค่าที่คาดหวัง (ส่วนใดของรายการที่เราสามารถลบได้โดยเฉลี่ย) เราใช้สูตรนี้:
(P_lower) x (ส่วนที่เราสามารถลบได้ถ้าต่ำกว่า) + (P_higher) x (ส่วนที่เราสามารถลบได้ถ้าสูงกว่า) = E
สำหรับการค้นหาแบบไบนารีนี่คือ. 5x.5 + .5x.5 = .5 (เราลบครึ่งรายการเสมอ) สำหรับการค้นหาแบบไตรภาคค่านี้คือ. 666x.333 + .333x.666 = 0.44 หรือในแต่ละขั้นตอนเรามีแนวโน้มที่จะลบ 44% ของรายการเท่านั้นทำให้มีประสิทธิภาพน้อยกว่าการค้นหาแบบไบนารีโดยเฉลี่ย ค่านี้มีค่าสูงสุดที่ 1/2 (ครึ่งหนึ่งของรายการ) และลดค่าที่คุณได้รับให้ใกล้กับ n (กลับรายการซ้ำ) และ 0 (การวนซ้ำปกติ)
ตกลงดังนั้นฉันโกหก .. มีคณิตศาสตร์เล็กน้อยที่เกี่ยวข้อง แต่ฉันหวังว่าจะช่วยได้!