ป.ร. ให้ไว้สองอาร์เรย์เรียง, 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 ในกรณีที่อาร์เรย์ถูกอินเตอร์ลีบหรืออย่างน้อยก็ไม่ได้แย่ลงอย่างมีนัยสำคัญ
สิ่งหนึ่งที่น่าจะทำได้ดีสำหรับรายการที่มีขนาดใหญ่ต่างกันคือใช้การค้นหาแบบไบนารีเพื่อแทรกองค์ประกอบของอาร์เรย์ขนาดเล็กลงในอาร์เรย์ที่ใหญ่กว่า แต่นั่นจะไม่ลดลงอย่างสง่างามในกรณีที่รายการทั้งสองมีขนาดเท่ากันและมีการแทรก
สิ่งเดียวที่มีให้สำหรับองค์ประกอบคือฟังก์ชั่นการสั่งซื้อ (รวม) ดังนั้นจึงไม่สามารถใช้รูปแบบการเปรียบเทียบที่ถูกกว่าได้
ความคิดใด ๆ
ฉันได้มาด้วยบิตนี้ในกาลา ฉันเชื่อว่าเป็นสิ่งที่ดีที่สุดเกี่ยวกับจำนวนการเปรียบเทียบ แต่มันเกินความสามารถในการพิสูจน์มัน อย่างน้อยก็เป็นมากง่ายกว่าสิ่งที่ฉันได้พบในวรรณคดี
และตั้งแต่การโพสต์ต้นฉบับฉันเขียนบล็อกโพสต์เกี่ยวกับวิธีการทำงาน