เกรแฮมสแกน (อังกฤษ:Graham Scan) เป็นขั้นตอนวิธีสำหรับคำนวณหา ของเซตจุดบนระนาบ โดยมี (time complexity) เป็น O(n log n) ชื่อของชั้นตอนวิธีมาจากผู้เผยเพร่ขั้นตอนวิธีต้นฉบับในปี ค.ศ. 1972
ขั้นตอนวิธี
ขั้นตอนวิธีเริ่มจากจุดที่มีพิกัด y ต่ำสุด หากพบจุดที่มีคู่อันดับ y ต่ำสุดมากกว่าหนึ่งจุด ให้เลือกจุดที่มีคู่อันดับ x ต่ำสุดในกลุ่มนั้น เรียกจุดนี้ว่าจุด P ขั้นตอนนี้ใช้เวลา O(n) โดยที่ n คือจำนวนของจุดทั้งหมด
ถัดมา เรียงลำดับจุดที่เหลือตามมุมที่จุด P และจุดนั้นๆกระทำกับแกน x โดยเรียงจากน้อยไปหามาก การเรียงลำดับสามารถใช้ขั้นตอนวิธีแบบใดก็ได้ เช่น การเรียงลำดับโดยใช้ฮีป (ใช้เวลา O(n log n)) เพื่อความรวดเร็วในการคำนวณ ไม่จำเป็นต้องหาค่าองศาของมุมระหว่างแกน x และเส้นจากจุด P ไปยังจุดหนึ่งๆ เพื่อนำมาเรียงลำดับ สามารถใช้ค่า โคไซน์ ของมุม ซึ่งในปัญหา convex hull จะเป็นฟังก์ชันลดทางเดียว (monotonically decresing funcion) มีค่าระหว่าง 0 ถึง 180 องศา ซึ่งสามารถคำนวณได้จากคณิตศาสตร์อย่างง่าย
จากนั้น พิจารณาแต่ละจุดตามลำดับที่เรียงไว้ โดยพิจารณาจากจุดนั้นๆร่วมกับก่อนหน้าสองจุด ว่าการเลือกจุดถัดไปนั้นเป็นการ "เลี้ยวขวา" หรือ "เลี้ยวซ้าย" หากเป็นการ "เลี้ยวขวา" หมายความว่าจุดตรงกลางไม่เป็นส่วนหนึ่งของผนัง convex hull และจะไม่นำมาพิจารณาอีก พิจารณาในขั้นตอนนี้ไปเรื่อยๆ จนกระทั่งพบการ "เลี้ยวซ้าย" ซึ่งหมายความว่า จุดตรงกลางคือส่วนหนึ่งของผนัง convex hull จึงพิจารณาจุดถัดไป (หากระหว่างการพิจารณาพบเส้นทางตรงซึ่งไม่มีการเลี้ยว อาจรวม หรือ ไม่รวม จุดนั้นในเซตคำตอบ ขึ้นกับปัญหา เนื่องจากการนำไปใช้บางสถานการณ์จำเป็นต้องรวมทุกจุดบนผนัง convex hull ลงไปในคำตอบ)
เช่นเดียวกับการเรียงลำดับจุดตามมุมในขั้นตอนที่สอง การพิจารณาจุดสามจุดว่าเป็นการ "เลี้ยวขวา" หรือ "เลี้ยวซ้าย" ไม่จำเป็นต้องคำนวณองศาของระหว่างเส้นสองเส้น แต่สามารถคำนวณจากคณิตศาสตร์อย่างง่าย สำหรับจุดสามจุด , และ นั้น สามารถคำนวณหาทิศทางของผลลัพธ์จากการครอสส์เวกเตอร์ และ ซึ่งคำนวณได้จากเครื่องหมายของนิพจน์ หากผลลัพธ์เป็น 0 แสดงว่าจุดสามจุดเรียงกันเป็นเส้นตรง หากผลลัพธ์เป็นบวก แสดงจุดทั้งสามทำให้เกิดการ "เลี้ยวซ้าย" และหากผลลัพธ์เป็นลบ แสดงว่าเกิดการ "เลี้ยวขวา"
สุดท้าย กระบวนการจะวนกลับมายังจุดเริ่มต้น ทำให้เสร็จสิ้นขั้นตอนวิธี ได้ผลลัพธ์เป็นจุดที่อยู่บนผนัง convex hull เรียงตามลำดับทวนเข็มนาฬิกาจากจุด P
ความซับซ้อนด้านเวลา
การเรียงลำดับจุดทั้งหมดมีความซับซ้อนด้านเวลาเป็น O(n log n) ส่วนการทำงานในวงวนตรวจสอบว่าการเลือกจุดถัดไปเป็นการ "เลี้ยวขวา" หรือ "เลี้ยวซ้าย" ใช้เวลาเพียง O(n) เนื่องจากจุดใดๆจะนำมาตรวจสอบเพียงสองครั้ง หากตรวจสอบแล้วพบว่าเป็นจุด ในการ "เลี้ยวซ้าย" ขั้นตอนวิธีจะดำเนินต่อไปยังจุด และถ้าหากพบว่าเป็นจุด ในการเลี้ยวขวา จุดนั้นก็จะไม่ถูกนำมาพิจารณาอีก ดังนั้น เกรแฮมสแกน มีความซับซ้อนทางเวลาเป็น O(n log n) ตามการเรียงลำดับจุด ซึ่งใช้เวลามากที่สุดในขั้นตอนวิธี
รหัสเทียม
อันดับแรก กำหนดฟังก์ชันคำนวณการ "เลี้ยวขวา" และ "เลี้ยวซ้าย" โดย จุดสามจุดก่อให้เกิดการ "เลี้ยวซ้าย" เมื่อ ccw > 0, "เลี้ยวขวา" เมื่อ ccw < 0 และ เรียงตัวเป็นเส้นตรงเมื่อ ccw = 0 เนื่องจาก ccw คือพื้นที่สามเหลี่ยมจากการวางตัวของจุด p1, p2 และ p3 โดยคิดเครื่องหมายบวก-ลบ ด้วย
function ccw(p1, p2, p3): return (p2.x - p1.x)*(p3.y - p1.y) - (p2.y - p1.y)*(p3.x - p1.x)
ให้คำตอบอยู่ในตาราง points
ให้ N = จำนวนจุดทั้งหมด ให้ points[N+1] = ตารางของจุดทั้งหมด สลับ points[1] กับจุดที่มีตำแหน่งบนแกน y ต่าที่สุด เรียง points จากมุมที่จุดต่างๆกระทำกับจุด points[1] จากน้อยไปหามาก # ต้องการให้ points[0] เป็นจุดสุดท้ายซึ่งจะจบการทำงานในวงวน ดังนั้น ให้ points[0] = points[N] # ค่า M จะแสดงถึงจำนวนจุดบนผนัง convex hull ให้ M = 2 for i = 3 to N: # หาจุดบนผนัง convex hull จุดถัดไป while ccw(points[M-1], points[M], points[i]) <= 0: # หากจุดทั้งสามเรียงตัวกันเป็นเส้นตรง จะไม่สนใจจุดนั้น if M == 2: สลับ points[M] กับ points[i] i += 1 else M -= 1 # เพิ่มค่า M ให้ถูกต้อง และสลับจุด points[i] มายังส่วนคำตอบ M += 1 สลับ points[M] กับ points[i]
รหัสเทียมนี้ปรับปรุงจากตำรา Algorithms, 4th edition โดย Sedgewick and Wayne
ดูเพิ่ม
- เกรแฮมสแกนในภาษา C++ และ Object Pascal
- เกรแฮมสแกนในภาษา Python 2012-01-15 ที่ เวย์แบ็กแมชชีน
- ตัวอย่างการทำงานของเกรแฮมสแกน
- เหตุใดเกรแฮมสแกนต้องเรียงลำดับปมก่อนค้นหา
อ้างอิง
- Graham, R.L. (1972). An Efficient Algorithm for Determining the Convex Hull of a Finite Planar Set. Information Processing Letters 1, 132-133
- Sedgewick, Robert (2011). Algorithms. Upper Saddle River, NJ: Addison-Wesley. ISBN .
- Rashid Bin Muhammad, PhD (2010-11-07). "Graham's Scan - Lecture by Rashid Bin Muhammad, PhD". สืบค้นเมื่อ 2011-09-18.
{{}}
: ไม่รู้จักพารามิเตอร์|h1=
ถูกละเว้น ((help)) - Cormen, Thomas H.; Leiserson, Charles E., Rivest, Ronald L., Stein, Clifford (2001) [1990]. "33.3: Finding the convex hull". Introduction to Algorithms (2nd ed.). MIT Press และ McGraw-Hill. หน้า 949–955. .
wikipedia, แบบไทย, วิกิพีเดีย, วิกิ หนังสือ, หนังสือ, ห้องสมุด, บทความ, อ่าน, ดาวน์โหลด, ฟรี, ดาวน์โหลดฟรี, mp3, วิดีโอ, mp4, 3gp, jpg, jpeg, gif, png, รูปภาพ, เพลง, เพลง, หนัง, หนังสือ, เกม, เกม, มือถือ, โทรศัพท์, Android, iOS, Apple, โทรศัพท์โมบิล, Samsung, iPhone, Xiomi, Xiaomi, Redmi, Honor, Oppo, Nokia, Sonya, MI, PC, พีซี, web, เว็บ, คอมพิวเตอร์
ekraehmsaekn xngkvs Graham Scan epnkhntxnwithisahrbkhanwnha khxngestcudbnranab odymi time complexity epn O n log n chuxkhxngchntxnwithimacakphuephyephrkhntxnwithitnchbbinpi kh s 1972khntxnwithicakphaph PAB aela ABC epnkar eliywsay aet BCD epnkar eliywkhwa khntxnwithicungimrwmcud C ekhaipinestkhatxb aelaipeluxkcud D sungepncudeliywsaythdipaethn khntxnwithierimcakcudthimiphikd y tasud hakphbcudthimikhuxndb y tasudmakkwahnungcud iheluxkcudthimikhuxndb x tasudinklumnn eriykcudniwacud P khntxnniichewla O n odythi n khuxcanwnkhxngcudthnghmd thdma eriyngladbcudthiehluxtammumthicud P aelacudnnkrathakbaekn x odyeriyngcaknxyiphamak kareriyngladbsamarthichkhntxnwithiaebbidkid echn kareriyngladbodyichhip ichewla O n log n ephuxkhwamrwderwinkarkhanwn imcaepntxnghakhaxngsakhxngmumrahwangaekn x aelaesncakcud P ipyngcudhnung ephuxnamaeriyngladb samarthichkha okhisn khxngmum sunginpyha convex hull caepnfngkchnldthangediyw monotonically decresing funcion mikharahwang 0 thung 180 xngsa sungsamarthkhanwnidcakkhnitsastrxyangngay caknn phicarnaaetlacudtamladbthieriyngiw odyphicarnacakcudnnrwmkbkxnhnasxngcud wakareluxkcudthdipnnepnkar eliywkhwa hrux eliywsay hakepnkar eliywkhwa hmaykhwamwacudtrngklangimepnswnhnungkhxngphnng convex hull aelacaimnamaphicarnaxik phicarnainkhntxnniiperuxy cnkrathngphbkar eliywsay sunghmaykhwamwa cudtrngklangkhuxswnhnungkhxngphnng convex hull cungphicarnacudthdip hakrahwangkarphicarnaphbesnthangtrngsungimmikareliyw xacrwm hrux imrwm cudnninestkhatxb khunkbpyha enuxngcakkarnaipichbangsthankarncaepntxngrwmthukcudbnphnng convex hull lngipinkhatxb echnediywkbkareriyngladbcudtammuminkhntxnthisxng karphicarnacudsamcudwaepnkar eliywkhwa hrux eliywsay imcaepntxngkhanwnxngsakhxngrahwangesnsxngesn aetsamarthkhanwncakkhnitsastrxyangngay sahrbcudsamcud x1 y1 displaystyle x 1 y 1 x2 y2 displaystyle x 2 y 2 aela x3 y3 displaystyle x 3 y 3 nn samarthkhanwnhathisthangkhxngphllphthcakkarkhrxssewketxr x1 y1 x2 y2 displaystyle x 1 y 1 x 2 y 2 aela x1 y1 x3 y3 displaystyle x 1 y 1 x 3 y 3 sungkhanwnidcakekhruxnghmaykhxngniphcn x2 x1 y3 y1 y2 y1 x3 x1 displaystyle x 2 x 1 y 3 y 1 y 2 y 1 x 3 x 1 hakphllphthepn 0 aesdngwacudsamcuderiyngknepnesntrng hakphllphthepnbwk aesdngcudthngsamthaihekidkar eliywsay aelahakphllphthepnlb aesdngwaekidkar eliywkhwa sudthay krabwnkarcawnklbmayngcuderimtn thaihesrcsinkhntxnwithi idphllphthepncudthixyubnphnng convex hull eriyngtamladbthwnekhmnalikacakcud Pkhwamsbsxndanewlakareriyngladbcudthnghmdmikhwamsbsxndanewlaepn O n log n swnkarthanganinwngwntrwcsxbwakareluxkcudthdipepnkar eliywkhwa hrux eliywsay ichewlaephiyng O n enuxngcakcudidcanamatrwcsxbephiyngsxngkhrng haktrwcsxbaelwphbwaepncud x2 y2 displaystyle x 2 y 2 inkar eliywsay khntxnwithicadaenintxipyngcud x3 y3 displaystyle x 3 y 3 aelathahakphbwaepncud x2 y2 displaystyle x 2 y 2 inkareliywkhwa cudnnkcaimthuknamaphicarnaxik dngnn ekraehmsaekn mikhwamsbsxnthangewlaepn O n log n tamkareriyngladbcud sungichewlamakthisudinkhntxnwithirhsethiymxndbaerk kahndfngkchnkhanwnkar eliywkhwa aela eliywsay ody cudsamcudkxihekidkar eliywsay emux ccw gt 0 eliywkhwa emux ccw lt 0 aela eriyngtwepnesntrngemux ccw 0 enuxngcak ccw khuxphunthisamehliymcakkarwangtwkhxngcud p1 p2 aela p3 odykhidekhruxnghmaybwk lb dwy function ccw p1 p2 p3 return p2 x p1 x p3 y p1 y p2 y p1 y p3 x p1 x ihkhatxbxyuintarang points ih N canwncudthnghmd ih points N 1 tarangkhxngcudthnghmd slb points 1 kbcudthimitaaehnngbnaekn y tathisud eriyng points cakmumthicudtangkrathakbcud points 1 caknxyiphamak txngkarih points 0 epncudsudthaysungcacbkarthanganinwngwn dngnn ih points 0 points N kha M caaesdngthungcanwncudbnphnng convex hull ih M 2 for i 3 to N hacudbnphnng convex hull cudthdip while ccw points M 1 points M points i lt 0 hakcudthngsameriyngtwknepnesntrng caimsniccudnn if M 2 slb points M kb points i i 1 else M 1 ephimkha M ihthuktxng aelaslbcud points i mayngswnkhatxb M 1 slb points M kb points i rhsethiymniprbprungcaktara Algorithms 4th edition ody Sedgewick and Wayneduephimekraehmsaekninphasa C aela Object Pascal ekraehmsaekninphasa Python 2012 01 15 thi ewyaebkaemchchin twxyangkarthangankhxngekraehmsaekn ehtuidekraehmsaekntxngeriyngladbpmkxnkhnhaxangxingGraham R L 1972 An Efficient Algorithm for Determining the Convex Hull of a Finite Planar Set Information Processing Letters 1 132 133 Sedgewick Robert 2011 Algorithms Upper Saddle River NJ Addison Wesley ISBN 9780321573513 Rashid Bin Muhammad PhD 2010 11 07 Graham s Scan Lecture by Rashid Bin Muhammad PhD subkhnemux 2011 09 18 a href wiki E0 B9 81 E0 B8 A1 E0 B9 88 E0 B9 81 E0 B8 9A E0 B8 9A Cite web title aemaebb Cite web cite web a imruckpharamietxr h1 thuklaewn help Cormen Thomas H Leiserson Charles E Rivest Ronald L Stein Clifford 2001 1990 33 3 Finding the convex hull Introduction to Algorithms 2nd ed MIT Press aela McGraw Hill hna 949 955 ISBN 0 262 03293 7