ในปัญหาข้อนี้เราจะใช้ binary search เหมือนกับปัญหาข้อที่ผ่านๆ มา แต่วัตถุที่เราทำการค้นหาจะแตกต่างจากข้ออื่นมาก
เพื่อความสะดวก เราจะกำหนดให้อะเรย์
Wikimedia Error
Error
Too many requests (f061ab2)
และ
มีช่อง
และ
Wikimedia Error
Error
Too many requests (f061ab2)
โดยที่
และ
Wikimedia Error
Error
Too many requests (f061ab2)
กล่าวคือ
และ
จะมีค่าน้อยกว่าอะเรย์ช่องอื่นๆ ทั้งหมด แต่เราจะไม่นับว่าช่องที่เพิ่มมาใหม่นี้เป็นส่วนหนึ่งของอะเรย์
เราจะพิสูจน์ข้อความสามข้อความต่อไปนี้
lemma 1: ถ้า
และ
เป็นจำนวนเต็มที่
แล้วสมาชิกตัวที่น้อยที่สุดเป็นอันดับที่
ในอะเรย์
และ
คือ
พิสูจน์: ให้
Wikimedia Error
Error
Too many requests (f061ab2)
เป็นจำนวนที่น้อยกว่าระหว่าง
และ
แล้วจะได้ว่ามีจำนวน
ตัวใน
ที่น้อยกว่า
และจำนวน
ตัวใน
ที่น้อยกว่ามัน ฉะนั้นมีจำนวน
ตัวใน
และ
ที่น้อยกว่ามันพอดี ดังนั้น
เป็นสมาชิกตัวที่น้อยที่สุดเป็นอันดับที่
พอดี
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 อย่างมาก
ครั้ง ฉะนั้นอัลกอริทึมข้างบนจึงทำงานภายในเวลา
ตามต้องการ