fbpx
วิกิพีเดีย

เกรแฮมสแกน

เกรแฮมสแกน (อังกฤษ:Graham Scan) เป็นขั้นตอนวิธีสำหรับคำนวณหา เปลือกนูน ของเซตจุดบนระนาบ โดยมีความซับซ้อนด้านเวลา (time complexity) เป็น O(n log n) ชื่อของชั้นตอนวิธีมาจากผู้เผยเพร่ขั้นตอนวิธีต้นฉบับในปี ค.ศ. 1972

ขั้นตอนวิธี

 
จากภาพ PAB และ ABC เป็นการ "เลี้ยวซ้าย" แต่ BCD เป็นการ "เลี้ยวขวา" ขั้นตอนวิธีจึงไม่รวมจุด C เข้าไปในเซตคำตอบ และไปเลือกจุด D ซึ่งเป็นจุดเลี้ยวซ้ายถัดไปแทน

ขั้นตอนวิธีเริ่มจากจุดที่มีพิกัด 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
  • ตัวอย่างการทำงานของเกรแฮมสแกน
  • เหตุใดเกรแฮมสแกนต้องเรียงลำดับปมก่อนค้นหา

อ้างอิง

  1. Graham, R.L. (1972). An Efficient Algorithm for Determining the Convex Hull of a Finite Planar Set. Information Processing Letters 1, 132-133
  2. 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". สืบค้นเมื่อ 2011-09-18. Unknown parameter |h1= ignored (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. ISBN 0-262-03293-7.

เกรแฮมสแกน, งกฤษ, graham, scan, เป, นข, นตอนว, สำหร, บคำนวณหา, เปล, อกน, ของเซตจ, ดบนระนาบ, โดยม, ความซ, บซ, อนด, านเวลา, time, complexity, เป, อของช, นตอนว, มาจากผ, เผยเพร, นตอนว, นฉบ, บในป, 1972, เน, อหา, นตอนว, ความซ, บซ, อนด, านเวลา, รห, สเท, ยม, เพ, างอ, . ekraehmsaekn xngkvs Graham Scan epnkhntxnwithisahrbkhanwnha epluxknun khxngestcudbnranab odymikhwamsbsxndanewla time complexity epn O n log n chuxkhxngchntxnwithimacakphuephyephrkhntxnwithitnchbbinpi kh s 1972 1 enuxha 1 khntxnwithi 2 khwamsbsxndanewla 3 rhsethiym 4 duephim 5 xangxingkhntxnwithi aekikh cakphaph 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 khuxcanwnkhxngcudthnghmdthdma 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 sungsamarthkhanwnidcakkhnitsastrxyangngaycaknn 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 x 1 y 1 displaystyle x 1 y 1 x 2 y 2 displaystyle x 2 y 2 aela x 3 y 3 displaystyle x 3 y 3 nn samarthkhanwnhathisthangkhxngphllphthcakkarkhrxssewketxr x 1 y 1 x 2 y 2 displaystyle x 1 y 1 x 2 y 2 aela x 1 y 1 x 3 y 3 displaystyle x 1 y 1 x 3 y 3 sungkhanwnidcakekhruxnghmaykhxngniphcn x 2 x 1 y 3 y 1 y 2 y 1 x 3 x 1 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 Pkhwamsbsxndanewla aekikhkareriyngladbcudthnghmdmikhwamsbsxndanewlaepn O n log n swnkarthanganinwngwntrwcsxbwakareluxkcudthdipepnkar eliywkhwa hrux eliywsay ichewlaephiyng O n enuxngcakcudidcanamatrwcsxbephiyngsxngkhrng haktrwcsxbaelwphbwaepncud x 2 y 2 displaystyle x 2 y 2 inkar eliywsay khntxnwithicadaenintxipyngcud x 3 y 3 displaystyle x 3 y 3 aelathahakphbwaepncud x 2 y 2 displaystyle x 2 y 2 inkareliywkhwa cudnnkcaimthuknamaphicarnaxik dngnn ekraehmsaekn mikhwamsbsxnthangewlaepn O n log n tamkareriyngladbcud sungichewlamakthisudinkhntxnwithirhsethiym aekikhxndbaerk 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 Wayne 2 duephim aekikhekraehmsaekninphasa C aela Object Pascal ekraehmsaekninphasa Python twxyangkarthangankhxngekraehmsaekn ehtuidekraehmsaekntxngeriyngladbpmkxnkhnhaxangxing aekikh 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 9780321573513 Rashid Bin Muhammad PhD 2010 11 07 Graham s Scan Lecture by Rashid Bin Muhammad PhD subkhnemux 2011 09 18 Unknown parameter h1 ignored 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 ekhathungcak https th wikipedia org w index php title ekraehmsaekn amp oldid 4748894, wikipedia, วิกิ หนังสือ, หนังสือ, ห้องสมุด,

บทความ

, อ่าน, ดาวน์โหลด, ฟรี, ดาวน์โหลดฟรี, mp3, วิดีโอ, mp4, 3gp, jpg, jpeg, gif, png, รูปภาพ, เพลง, เพลง, หนัง, หนังสือ, เกม, เกม