ในปัญหาข้อนี้เราจะใช้ binary search เหมือนกับปัญหาข้อที่ผ่านๆ มา แต่วัตถุที่เราทำการค้นหาจะแตกต่างจากข้ออื่นมาก
เพื่อความสะดวก เราจะกำหนดให้อะเรย์ และ มีช่อง และ โดยที่ และ กล่าวคือ และ จะมีค่าน้อยกว่าอะเรย์ช่องอื่นๆ ทั้งหมด แต่เราจะไม่นับว่าช่องที่เพิ่มมาใหม่นี้เป็นส่วนหนึ่งของอะเรย์
เราจะพิสูจน์ข้อความสามข้อความต่อไปนี้
lemma 1: ถ้า และ เป็นจำนวนเต็มที่
- และ
- และ
- และ
- และ
แล้วสมาชิกตัวที่น้อยที่สุดเป็นอันดับที่ ในอะเรย์ และ คือ
พิสูจน์: ให้ เป็นจำนวนที่น้อยกว่าระหว่าง และ แล้วจะได้ว่ามีจำนวน ตัวใน ที่น้อยกว่า และจำนวน ตัวใน ที่น้อยกว่ามัน ฉะนั้นมีจำนวน ตัวใน และ ที่น้อยกว่ามันพอดี ดังนั้น เป็นสมาชิกตัวที่น้อยที่สุดเป็นอันดับที่ พอดี
lemma 2: ถ้า คือจำนวนที่มีค่าน้อยที่สุดเป็นอันดับที่ ใน และ โดยที่ แล้ว หากให้ แล้ว เราจะได้ว่า และ
พิสูจน์: เนื่องจาก เป็นสมาชิกตัวที่น้อยที่สุดเป็นอันดับที่ ดังนั้นจะต้องมีสมาชิกใน และ ที่น้อยกว่ามัน ตัวพอดี และเนื่องจากมีสมาชิกที่น้อยกว่า อยู่ ตัวในอะเรย์ จะต้องมีสมาชิกที่้น้อยกว่า อยู่ ตัวใน ซึ่งนี่หมายความว่า
อนึ่ง เราจะได้ว่า ด้วย ฉะนั้น lemma เป็นจริง
lemma 3: ถ้า คือจำนวนที่มีค่าน้อยที่สุดเป็นอันดับที่ ใน และ โดยที่ แล้ว หากให้ แล้ว เราจะได้ว่า และ
พิสูจน์: ใช้วิธีพิสูจน์เดียวกันกับ lemma 2
สังเกตว่า lemma 2 และ lemma 3 เป็น converse ของ lemma 1 ฉะนั้นเราสามารถสรุปได้ว่า
Proposition 4: เราสามารถหาสมาชิกตัวที่มีค่าน้อยที่สุดเป็นอันดับ ในอะเรย์ และ ได้โดยการหาจำนวนเต็ม และ ที่ทำให้ (1) และ (2) และ (3) แล้วจึีงหาคำตอบด้วยการหาค่าที่น้อยกว่าระหว่าง และ
(ข้อสังเกต: lemma 2 และ lemma 3 เป็นข้อความที่มีความสำคัญมากเนื่องจากมันรับประกันว่าจะีมี และ เีพียงคู่เดียวเท่านั้นที่จะสอดคล้องกับเงื่อนไขทั้งหมดใน lemma 1)
อัลกอริทึม
อาศัย Proposition 4 เราจะแก้ปัญหานี้ด้วยการทำ binary search บนวัตถุคู่ำลำดับ โดยที่ โดยเราจะได้ว่าคู่ำลำดับนี้จะมีอยู่อย่างมาก ตัวด้วยกัน ได้แต่
สำหรับวัตถุแต่ละอัน เราจะทำการเปรียบเทียบสองครั้ง ได้แก่ (1) เปรียบเทียบ กับ และ (2) เปรียบเทียบ กับ โดยการเปรียบเทียบนี้เกิดผลได้ 3 แบบด้วยกัน
- และ : ในกรณีเราจะได้ว่าเราหา ที่ต้องการเจอแล้ว เราสามารถหยุดการทำงานของ binary search ได้
- และ : ในกรณีเราพบว่าสำหรับคู่ลำดับ อื่นๆ ที่ เราจะได้ว่า และ ด้วยเหตุนี้ จึีงไม่สามารถนำไปสู่จำนวนที่มีค่าน้อยที่สุดเป็นอันดับที่ ได้ ฉะนั้นในกรณีนี้เราสามารถตัดวัตถุ โดยที่ ออกจากวัตถุที่เป็นไปได้ทั้งหมด
- และ : ในกรณีเราพบว่าสำหรับคู่ลำดับ อื่นๆ ที่ เราจะได้ว่า และ ด้วยเหตุนี้ จึีงไม่สามารถนำไปสู่จำนวนที่มีค่าน้อยที่สุดเป็นอันดับที่ ได้ ฉะนั้นในกรณีนี้เราสามารถตัดวัตถุ โดยที่ ออกจากวัตถุที่เป็นไปได้ทั้งหมด
จากแนวคิดข้างต้น เราสามารถเขียน pseudocode ของอัลกอริืทึมได้ดังต่อไปนี้
<geshi lang="c">
Search(A, B, k)
{
i_left = 0
i_right = k-1
while i_left <= i_right do
{
i = (i_left + i_right) / 2
j = k - 1 - i
if A[i+1] > B[j] and B[j+1] > A[i] then
return min(A[i+1], B[j+1])
else if A[i+1] > B[j] and B[j+1] < A[i] then
i_right = i-1
else if A[i+1] < B[j] and B[j+1] > A[i] then
i_left = i+1
}
}
</geshi>
เนื่องจากในการเช็คเงื่อนไขแต่ละครั้งเราสามารถตัดวัตถุที่เป็นไปได้ออกประมาณครึ่งหนึ่ง เราจะได้ว่าจะมีการวนลูปใน pseudocode อย่างมาก ครั้ง ฉะนั้นอัลกอริทึมข้างบนจึงทำงานภายในเวลา ตามต้องการ