ขั้นตอนวิธีเคิร์กแพทริก–ไซเดิล

**ขั้นตอนวิธีเคิร์กแพทริก–ไซเดิล** () หรือเรียกอีกชื่อว่า "ขั้นตอนวิธีแต่งงานก่อนเอาชนะ" (marriage-before-conquest algorithm) เป็นขั้นตอนวิธีที่ใช้สำหรับคำนวณหา convex hull ของเซทจุดบนระนาบ โดยมีความซับซ้อนด้านเวลา (time complexity) เป็น O(*n* log *h*) ซึ่ง *n* คือจำนวนจุดนำเข้า และ *h* คือจำนวนขอบของ hull ดังนั้นขั้นตอนวิธีนี้เวลาในการคำนวณจึงขึ้นอยู่กับทั้งขนาดของข้อมูลนำเข้าและข้อมูลส่งออก (output-sensitive algorithm) ชื่อของขั้นตอนวิธีเคิร์กแพทริก–ไซเดิล มาจากชื่อหลังของผู้คิดค้นได้แก่ เดวิด จี. เคิร์กแพทริก (David G. Kirkpatrick) และ ไรมุนด์ ไซเดิล (Raimund Seidel) 

## ขั้นตอนวิธี
ขั้นตอนวิธีที่ใช้หา convex hull แบบเดิมจะใช้ขั้นตอนวิธีการแบ่งแยกและเอาชนะ (divide-and-conquer algorithm) คือการแบ่งจุดที่นำเข้าออกเป็นสองส่วนที่เท่ากัน โดยใช้เส้นแนวตั้งในการแบ่ง และเวียนเกิดหา convex hull ของส่วนย่อยซ้ายและส่วนย่อยขวา จากนั้นนำทั้งสองส่วนย่อยมาผสานกัน ด้วยการหา "bridge edges" ซึ่งก็คือเส้นที่เชื่อมและสัมผัสทั้งสอง hulls จากทั้งด้านบนและด้านล่าง

ขั้นตอนวิธีเคิร์กแพทริก–ไซเดิล นั้นจะมีขั้นตอนกลับลำดับกันกับวิธีแบ่งแยกและเอาชนะ คือหา bridge edges เลยโดยไม่จำเป็นต้องหา convex hull ก่อน ซึ่งในขั้นตอนแรกคือการแบ่งจุดโดยการหาเส้นแบ่งแนวตั้งที่ถูกกำหนดโดยค่ามัธยฐานของพิกัดแกน *x* ของจุดที่นำเข้าทั้งหมด ขั้นตอนต่อไปคือการหาเส้นขอบของ convex hull ที่ตัดกับเส้นแบ่งนั้น ซึ่งขั้นตอนนี้จะใช้เวลาเป็นเชิงเส้น (O(*n*)) หากจุดบนฝั่งซ้ายหรือฝั่งขวาของเส้นแบ่งที่ไม่ช่วยในการหาเส้นขอบจะถูกละทิ้ง ซึ่งในการหาขอบบนของ convex hull นั้นจุดที่ไม่ช่วยในการหาเส้นขอบและจะถูกละทิ้งคือ จุดที่อยู่ใต้ bridge edge ลงมา ในขณะที่การหาขอบล่างของ convex hull นั้นจุดที่อยู่เหนือ bridge edge ขึ้นไปจะถูกละทิ้ง จากนั้นเวียนเกิดด้วยจุดทางฝั่งซ้ายของเส้นแบ่งที่ยังไม่ถูกละทิ้ง และด้วยจุดทางฝั่งขวาของเส้นแบ่งที่ยังไม่ถูกละทิ้งไปเรื่อยๆ จนกระทั่งได้ขอบของ convex hull ครบทั้งหมด โดยขั้นตอนวิธีนี้จะต้องแยกดำเนินการเพื่อหาขอบบน และขอบล่างของ convex hull อีกครั้ง

การหาเส้นขอบบนในเวลา O(*n*) นั้นเราจะสมมติให้เส้นขอบมีความชันเป็น *K** จากนั้นเดาค่าความชัน *K* ขึ้นมาแล้วพยายามคำนวณค่า *K** โดยเปรียบเทียบกับค่า *K* นั้น ให้ *l<sub>i</sub>* จากนั้นทำการหาเส้นตรงที่มีความชัน *K* และผ่านจุดใดๆ ในเซทของจุดทั้งหมดที่นำเข้า ที่ทำให้ทุกๆ จุดในเซทอยู่ใต้มัน (เส้นนี้จะตัดกับเส้นแบ่งสูงที่สุด) เราสามารถหาเส้นนี้ได้ในเวลา O(*n*) ถ้าเส้นที่หาได้นี้ผ่านทั้งจุดทางฝั่งซ้ายและฝั่งขวาของเส้นแบ่ง เส้นนี้ก็คือเส้นขอบบนที่เรากำลังหาอยู่ แสดงว่าค่า *K*=*K** แล้ว แต่ถ้าเส้นนี้ผ่านเฉพาะจุดทางฝั่งซ้ายของเส้นแบ่งเท่านั้น แสดงว่าค่า *K*>*K** จึงต้องเดาค่า *K* ใหม่ให้มีค่าที่น้อยลง และถ้าเส้นนี้ผ่านเฉพาะจุดทางฝั่งขวาของเส้นแบ่งเท่านั้น แสดงว่าค่า *K*h_L\,\! ขอบ และฝั่งขวาของเส้นแบ่งมี h_R\,\! ขอบ ดังนั้นจะได้ h = 1 + h_L + h_R\,\! และให้เวลาในการคำนวณของขั้นตอนวิธีนี้อธิบายได้โดย T(n, h)\,\!

T(n, 1) = cn\,\!
T(n, h) = cn + T(\frac {n}{2}, h_L) + T(\frac{n}{2}, h_R)\,\!

ให้ T(m, h') \le cm \log h' เมื่อ m  และ 1  จะได้ว่า

T(n, h) \le cn + c \frac {n}{2} \log h_L + c \frac{n}{2} \log h_R\,\!

จากนั้นใช้ความจริงที่ว่า \frac {1}{2}(\log h_L + \log h_R) \le \log \frac {h_L + h_R}{2}\,\! จะได้

T(n, h) \le cn + c \frac {n}{2}(2 \log \frac {h_L + h_R}{2}) \le cn + cn(\log (h - 1)) \le cn \log h\,\!

ดังนั้น T(n, h) = O(n \log h)\,\!

## อ้างอิง

## แหล่งข้อมูลอื่น
* ตัวอย่างการหา Convex Hull โดยใช้ขั้นตอนวิธีเคิร์กแพทริก–ไซเดิล
* เรขาคณิตเชิงคำนวณ

หมวดหมู่:ขั้นตอนวิธี
หมวดหมู่:ขั้นตอนวิธีแก้ปัญหาเปลือกนูน