อัลกอริทึมเพื่อผสานสองอาร์เรย์ที่เรียงลำดับด้วยจำนวนการเปรียบเทียบขั้นต่ำ
ป.ร. ให้ไว้สองอาร์เรย์เรียง, BประเภทTที่มีขนาดnและม. ฉันกำลังมองหาอัลกอริทึมที่ผสานสองอาร์เรย์เข้ากับอาร์เรย์ใหม่ (ขนาดสูงสุด n + m) หากคุณมีการเปรียบเทียบราคาถูกนี่ค่อนข้างง่าย เพียงนำจากอาเรย์ที่มีอิลิเมนต์แรกที่ต่ำที่สุดจนกระทั่งหนึ่งหรือทั้งสองอาร์เรย์ถูกสำรวจอย่างสมบูรณ์จากนั้นเพิ่มอิลิเมนต์ที่เหลือ บางสิ่งเช่นนี้/programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array อย่างไรก็ตามสถานการณ์การเปลี่ยนแปลงเมื่อเปรียบเทียบสององค์ประกอบจะมีราคาแพงกว่าการคัดลอกองค์ประกอบจากแถวแหล่งที่มาที่ไปยังอาร์เรย์เป้าหมาย ตัวอย่างเช่นคุณอาจมีอาร์เรย์ของจำนวนเต็มหรือสตริงที่มีความแม่นยำตามอำเภอใจซึ่งการเปรียบเทียบอาจมีราคาค่อนข้างสูง เพียงสมมติว่าการสร้างอาร์เรย์และองค์ประกอบการคัดลอกนั้นฟรีและสิ่งเดียวที่มีค่าใช้จ่ายคือการเปรียบเทียบองค์ประกอบ ในกรณีนี้คุณต้องการที่จะผสานสองอาร์เรย์มีจำนวนต่ำสุดของการเปรียบเทียบองค์ประกอบ นี่คือตัวอย่างบางส่วนที่คุณควรจะทำได้ดีกว่าอัลกอริธึมการผสานอย่างง่าย: a = [1,2,3,4, ... 1000] b = [1001,1002,1003,1004, ... 2000] หรือ a = [1,2,3,4, ... 1000] b = [0,100,200, ... 1000] มีบางกรณีที่อัลกอริทึมการผสานอย่างง่ายจะเหมาะสมที่สุดเช่น a = [1,3,5,7,9,....,999] b = [2,4,6,8,10,....,1000] ดังนั้นอัลกอริธึมจึงควรลดระดับลงอย่างงดงามและทำการเปรียบเทียบสูงสุด n + m-1 ในกรณีที่อาร์เรย์ถูกอินเตอร์ลีบหรืออย่างน้อยก็ไม่ได้แย่ลงอย่างมีนัยสำคัญ สิ่งหนึ่งที่น่าจะทำได้ดีสำหรับรายการที่มีขนาดใหญ่ต่างกันคือใช้การค้นหาแบบไบนารีเพื่อแทรกองค์ประกอบของอาร์เรย์ขนาดเล็กลงในอาร์เรย์ที่ใหญ่กว่า …