โปรแกรมเมอร์มีความสำคัญแค่ไหนที่จะรู้วิธีการใช้อัลกอริทึม QuickSort / MergeSort จากหน่วยความจำ [ปิด]


58

ฉันกำลังตรวจสอบบันทึกย่อของฉันและสะดุดกับการใช้อัลกอริทึมการเรียงลำดับที่แตกต่างกัน

ในขณะที่ฉันพยายามทำความเข้าใจการใช้ QuickSort และ MergeSort มันเกิดขึ้นกับฉันว่าแม้ว่าฉันจะเขียนโปรแกรมเพื่อการใช้ชีวิตและคิดว่าตัวเองเหมาะสมกับสิ่งที่ฉันทำฉันไม่มีหน่วยความจำภาพถ่ายหรือสมองที่แท้จริง พึ่งพาบันทึกของฉัน ทั้งหมดที่ฉันจำได้คืออัลกอริธึมบางส่วนนั้นเสถียรและบางตัวไม่ บางคนใช้เวลา O (nlog (n)) หรือ O (n ^ 2) ให้เสร็จ บางคนใช้หน่วยความจำมากกว่าคนอื่น ...

ฉันรู้สึกว่าฉันไม่สมควรได้รับงานประเภทนี้หากไม่ใช่เพราะตำแหน่งของฉันไม่ต้องการให้ฉันใช้อัลกอริทึมการเรียงลำดับอื่นนอกเหนือจากที่พบใน API มาตรฐาน ฉันหมายถึงคุณมีกี่คนที่มีตำแหน่งการเขียนโปรแกรมที่จำเป็นจริง ๆ ที่คุณสามารถจดจำหรือคิดสิ่งเหล่านี้ด้วยตัวเอง


13
คุณต้องจำไว้ว่ามีวิธีแก้ไขอยู่และควรใช้เมื่อใด จากนั้นไปที่เอกสารและนำไปใช้ หากคุณไม่ทราบเกี่ยวกับ quicksort หรือการรวมคุณยังคงใช้ bubbleort และดูโปรแกรมของคุณไปที่การรวบรวมข้อมูลและหาวิธีแก้ปัญหา subpar เมื่อข้อมูลเพิ่มขึ้น
Pieter B

1
นอกเหนือจากคำตอบที่ดีที่กล่าวถึงด้านล่างโปรดทราบว่าหลาย ๆ บริษัท ต้องการที่จะ (1) รู้ความซับซ้อนของอัลกอริทึมดังกล่าว (2) สามารถใช้งานได้อย่างคล่องแคล่วในกระดานดำ
sakisk

3
ฉันแน่ใจว่าการจดจำ algos เหล่านี้เป็นสิ่งสำคัญสำหรับการที่ Google เกิดออฟไลน์บ่อยครั้ง : o
Lee James

คุณจำเป็นต้องรู้ประสิทธิภาพการทำงานกรณีใช้งาน ฯลฯ การรู้วิธีใช้งานด้วยใจเป็นสิ่งที่ บริษัท เทคโนโลยีต้องใช้ในการสัมภาษณ์เท่านั้น
sakisk

@PerterB ฉันไม่เห็นด้วย ไม่จำเป็นต้องรู้เกี่ยวกับ 'การผสาน' และ 'quicksort' ไปยัง Google 'อัลกอริทึมการเรียงลำดับที่มีประสิทธิภาพดีที่สุด'
hyankov

คำตอบ:


117

ลองถามอัลเบิร์ตแล้วดูว่าเขาจะพูดอะไรเกี่ยวกับเรื่องนี้:

“ ฉันไม่จำเป็นต้องรู้ทุกอย่างฉันแค่ต้องรู้ว่าจะหามันที่ไหนเมื่อฉันต้องการ”

- Albert Einsteinถอดความ

สาธุพี่อัลเบิร์ตอาเมน

เมื่อคุณทำการสำรวจอัลกอริทึมที่จำเป็นในระเบียบวินัยใด ๆ (เรียงลำดับค้นหาหรืออะไรก็ตาม) คุณสามารถลืมรายละเอียดการใช้งานจนกว่าคุณจะต้องการ algo จริง ๆ ซึ่งในกรณีนี้คุณจะค้นหามันหรือใช้ มาก่อน lib 25 ปีที่แล้วฉันสร้างระบบการค้นหาที่สำคัญโดยใช้ B * -trees แต่วันนี้ฉันต้อง RTFM เพื่อที่จะใช้งานได้ดี


5
อ้างนี้เป็นที่น่าสงสัย: I am "ไม่สามารถหาหลักฐานที่สำคัญใด ๆ ที่เชื่อมต่อกับคำกล่าวที่ว่าจะน์สไตน์"
กระทะ

9
นั่นตอบคำถามได้อย่างไร เขาพูดว่า“ ฉันไม่จำเป็นต้องรู้ทุกอย่าง” เขาไม่ได้พูดว่า“ ฉันไม่จำเป็นต้องรู้อะไรเลย” ทักษะบางอย่างเป็นพื้นฐานและคำถามทั้งหมดนั้นเกี่ยวกับว่าข้อมูลชิ้นใดชิ้นหนึ่งเป็นของทักษะพื้นฐานหรือไม่
Konrad Rudolph

1
การคิดว่าเป้าหมายคือการจดจำ quicksort คือการพลาดจุดของคำถาม แน่นอนว่าในโลกแห่งความเป็นจริงถ้าคุณต้องการ quicksort ทั่วไปคุณต้องใช้รูทีนไลบรารี่หรือค้นหาโค้ดและคัดลอกมัน การทดสอบคือการดูว่าคุณเข้าใจการวนรอบแบบวนซ้ำค่าคงที่แบบวนซ้ำ ฯลฯ และการขอให้คุณจดอัลกอริธึมการเรียงลำดับอย่างรวดเร็วนั้นเป็นเพียงการสาธิตความรู้ที่เรียบง่ายจริงๆ หากคุณไม่สามารถรับสายด่วน 20 บรรทัดได้อีกครั้งคุณมีหลายสิ่งที่ทำอย่างไม่มีประสิทธิภาพหรือไม่ถูกต้องโดยไม่รู้ตัว
Larry Gritz

3
@ Larry: ฉันคิดว่าฉันลืมมากกว่าโปรแกรมเมอร์หลายคนรู้เกี่ยวกับรายละเอียดของอัลกอริทึม - และการเรียงลำดับอย่างรวดเร็วจากศูนย์เป็นหนึ่งในนั้น - ด้วยเหตุผลที่ดีมาก - ฉันเลือกที่จะอ่านในระดับสูงและใช้ภาษาระดับสูงแทน กว่าอยู่ในชามของรายละเอียดการใช้งานในระดับต่ำ ตรงไปตรงมา - ฉันไม่สนใจสิ่งที่เรียงลำดับห้องสมุดประจำฉันใช้ใช้ - มันสามารถใช้ฝุ่นและนางฟ้านางฟ้าเท่าที่ฉันกังวล เอกสารจะบอก O () สำหรับการปรับขนาดนั่นคือทั้งหมดที่ฉันต้องรู้
mattnz

2
@mattnz: การติดตามผลล่าช้าไปยัง "O () การปรับขนาด" ของคุณ สิ่งหนึ่งที่ฉันได้เรียนรู้วิธีที่ยากคือการที่ชุดข้อมูลขนาดใหญ่ในพื้นที่อ้างอิงไม่ดีสามารถครอบงำ O () ได้อย่างสมบูรณ์ คุณอาจมีอัลโกนั่นคือO(n log n)แต่ถ้าคุณได้รับแคชจำนวนมากพลาดหรือ (พระเจ้าห้าม) คุณตีดิสก์แล้วนั่นn log nจะเป็นเพียงความทรงจำที่รัก
Peter Rowell

49
  1. มันไม่ใช่เรื่องของการท่องจำ มันเป็นเรื่องของการทำความเข้าใจคลาสอัลกอริทึมทั่วไปอย่างลึกซึ้งเช่นการหารและการพิชิต หากคุณเข้าใจการแบ่งและพิชิตจริงๆแล้วคุณไม่จำเป็นต้องจดจำ quicksort คุณสามารถรับซ้ำได้ตามต้องการ นอกจากนี้ผลตอบแทนที่แท้จริงไม่ได้อยู่ในความสามารถที่จะได้รับ quicksort อีกครั้งด้วยตัวคุณเองคุณสามารถรับรู้เมื่อมีปัญหาใหม่ที่คล้อยตามการหารและการแก้ปัญหา

  2. งานการเขียนโปรแกรมไม่เหมือนกันทั้งหมด งานบางอย่างต้องการความรู้อย่างลึกซึ้งเกี่ยวกับอัลกอริทึมบางคนต้องการคนที่เข้าใจทฤษฎีประเภทและบางคนก็ต้องการคนที่สามารถขูดข้อมูลจากเว็บฟอร์มและย้ายไปยังฐานข้อมูล บางงานต้องใช้ทักษะเหล่านั้นทั้งหมดในครั้งเดียว คุณต้องการทำงานประเภทใด


5
ฉันไม่คิดว่าเป็นไปได้ที่จะเข้าใจ QuickSort โดยไม่จดจำ QuickSort มันไม่ซับซ้อนและเป็นเรื่องลึกลับมันเป็นแค่ความคิดทั่วไปสองข้อที่รวมกัน สิ่งเดียวกันนี้ใช้กับการผสานการจัดเรียง แต่คุณมีเพียงหนึ่งความคิด: P
drxzcl

ฉันไม่เห็นด้วยกับประเด็นที่ 2 งานทั้งหมดเหมือนกันมีการเปลี่ยนแปลงผู้สัมภาษณ์เท่านั้น อันนี้รู้การเรียงลำดับได้ดีมากและคิดว่าโปรแกรมเมอร์ที่ดีทุกคนต้องรู้การเรียงลำดับเพราะนั่นคือทั้งหมดที่เขารู้และใส่ใจ
IAdapter

2
@ อะแดปเตอร์แน่นอนคุณตลก! ฉันรู้จากประสบการณ์ของฉันเองว่าความรู้และทักษะที่ฉันต้องการสำหรับงานเขียนครั้งแรกของฉันมาโคร TROFF สำหรับ บริษัท ซอฟต์แวร์ตัวย่อตัวนั้นแตกต่างจากที่ฉันต้องการสำหรับงานปัจจุบันของฉันในห้องปฏิบัติการชีววิทยาเชิงคำนวณ
Charles E. Grant

@ CharlesE.Grant เวลาส่วนใหญ่ไม่ได้ตรวจสอบว่าคุณมีทักษะที่จำเป็นในการทำงานของคุณหรือไม่ (ฉันจำคำถาม javascript / css สุดท้ายที่ฉันถูกถามและฉันทำ webapps)
IAdapter

10

ฉันคิดว่าครั้งเดียวที่คุณต้องจำไว้ทั้งหมดคือเมื่อสมัครงานเมื่อคุณต้องหาคำตอบในที่เกิดเหตุและไม่มีทรัพยากรภายนอก

ฉันมีเพื่อนร่วมงานเขียน quicksort และ whatnot แต่ฉันบอกให้พวกเขากลับไปใช้ฟังก์ชั่นการเรียงลำดับที่สร้างขึ้นในภาษา ฉันรู้ว่าขึ้นอยู่กับประเภทของโครงการที่เราทำงานอยู่ที่เราต้องจำอัลกอริธึมอื่น ๆ เนื่องจากพวกเขามักจะไม่รวมอยู่ในไลบรารีมาตรฐาน

เมื่อเราจำเป็นต้องจำอัลกอริธึมเหล่านั้นเรามักจะหันไปหา google หรือหนังสือและโดยปกติแล้วมันไม่ได้มองหาการใช้งานที่เฉพาะเจาะจง แต่สิ่งที่จะเป็นวิธีที่ดีที่สุดสำหรับปัญหาของเรา


6

เพียงแค่จดจำว่าอัลกอริทึมใดมีประโยชน์ในสถานการณ์ใดบ้างจะมีมากเกินพอที่จะช่วยเหลือในระหว่างการทำงานของคุณ ในความเป็นจริงมากที่สุดงานการเขียนโปรแกรมไม่จำเป็นต้องใช้ความจำของวิธีการ, แต่พวกเขามีความสนใจในวิธีการของคุณตระหนักถึงรูปแบบอัลกอริทึมเมื่อต้องเผชิญกับปัญหาที่เกิดขึ้น

ตามความเป็นจริงมีข้อมูลมากมายในการเขียนโปรแกรมบล็อก / บทความในหัวข้ออัลกอริทึม ดังนั้นการจดจำการใช้งานที่แน่นอนจึงไม่สำคัญ ข้อมูลที่มีค่าที่สุดจะได้รับแนวคิดพื้นฐานเกี่ยวกับประเภทของอัลกอริทึมที่มีอยู่และปัญหาเฉพาะใดที่พวกเขาสามารถแก้ไขได้ดี การค้นหาการใช้งานที่แน่นอนเมื่อคุณรู้ว่าสิ่งที่คุณกำลังมองหาอยู่นั้นค่อนข้างเร็ว

โดยสรุปจะเป็นการดีกว่าที่จะรู้ว่าสิ่งที่คุณมองหาและแหล่งอ้างอิงคืออะไร - ซึ่งจะแนะนำคุณไปยังแหล่งข้อมูล


5

การใช้งานที่แน่นอนนั้นไม่สำคัญมาก แต่หลักการที่อยู่เบื้องหลังการควบรวมกิจการ / quicksort - การเรียกซ้ำการแบ่งพาร์ติชันเป็นต้นนั้นเป็นสิ่งที่พื้นฐานมากและโปรแกรมเมอร์ทุกคนควรเข้าใจ อัลกอริทึมเหล่านี้จริง ๆ แล้วง่ายมากที่จะอธิบายในคำเมื่อคุณเข้าใจ

มันไม่ใช่ปัญหาว่าคุณจะสามารถค้นหามันได้หรือไม่หรือว่าคุณสามารถ google มันเป็นโปรแกรมเมอร์เข้าใจเทคนิคเหล่านี้ในการแก้ปัญหาและสามารถนำไปใช้กับสถานการณ์อื่น ๆ ได้หรือไม่


3

ฉันเป็นคนสองคนที่คิดเรื่องนี้ ฉันรู้จักโปรแกรมเมอร์หลายคนที่ไม่รู้ว่าอัลกอริธึมการเรียงลำดับคืออะไร แต่ทำงานได้ดีพอสมควร ฉันเชื่อในการทำความเข้าใจหลักการเพื่อเข้าใจโดเมนอย่างแท้จริง

มันยากสำหรับฉันที่จะได้คำตอบที่เป็นกลางในเรื่องนี้เนื่องจากฉันได้เขียนโปรแกรมมานานแล้วฉันอาจจะลืมอัลกอริธึมเพิ่มเติมที่ฉันรู้อยู่ในขณะนี้ - แต่ฉันก็ยังรู้ถึงการเรียงลำดับที่กล่าวถึงในคำถาม ฉันคิดว่าผู้นำทางความคิดใน Agile (เช่น Ron Jeffries, Alistair Cockburn) มีความคิดที่ดีใกล้กับความคิดนี้ (เช่น Shu-Ha-Ri)

โดยสรุปสำหรับคำตอบของการท่องเที่ยว: ใช้ API อย่างแน่นอน (NIH เป็นสัญลักษณ์ของความไม่บรรลุนิติภาวะของนักพัฒนา) แต่เข้าใจหลักการพื้นฐานเสมอ ฉันหวังว่านี่จะช่วยได้.


2

การเรียงลำดับและการค้นหามีความสำคัญอย่างน่าอัศจรรย์ไม่ว่าคุณจะเป็นแฟนโดนัลด์ Knuth หรือต้องการเป็นหน้าลาร์รีหน้าต่อไป ขึ้นอยู่กับธุรกิจที่คุณอยู่และระดับการแข่งขันที่คุณสามารถควบคุมได้ระหว่างผู้สมัครของคุณฉันขอแนะนำให้คุณรวมแนวคิดต่อไปนี้ไว้ในการสัมภาษณ์

การเรียงลำดับ

  • ร่างขั้นตอนวิธีการเรียงลำดับบางอย่าง
  • แสดงรายการตัวอย่างของขั้นตอนวิธีการเรียงลำดับ
  • เปรียบเทียบ / เปรียบต่างสองประเภทที่มีคุณสมบัติด้านประสิทธิภาพที่แตกต่างกัน
  • หากพวกเขาไม่พูดถึงการใช้หน่วยความจำถามเกี่ยวกับมัน

ค้นหา

  • ตั้งชื่ออัลกอริธึมการค้นหาให้มากที่สุดเท่าที่จะทำได้
  • เปรียบเทียบ / เปรียบเทียบอัลกอริทึมการค้นหาสองแบบ
  • ร่างการค้นหาอื่น ๆ นอกเหนือจากการค้นหาเชิงเส้น

บางคนอาจบอกว่าต้องใช้รหัสสำหรับอัลกอริทึมเหล่านี้มากเกินไปเว้นแต่งานอยู่บนเกาะร้างที่ไม่มีการเชื่อมต่ออินเทอร์เน็ต การพิจารณาอีกอย่างคือถ้าคุณมีเวลา 30 นาทีและคุณต้องการถามเรื่องอื่นสำหรับผู้สมัครหลาย ๆ คนการใช้การเรียงลำดับอาจใช้เวลาส่วนใหญ่ของคุณ


ฉันเคยคิดว่าการขอให้ผู้คนเข้าร่วมการสัมภาษณ์นั้นเป็นเรื่องไร้สาระ แต่คุณก็ไม่เชื่อว่าจำนวนคนที่มีประวัติย่อที่น่าอัศจรรย์และผู้ที่ตอบคำถาม "สังคม" ที่มีสีบินได้ แต่สำหรับชีวิตของพวกเขา จดการดำเนินการที่ถูกต้องของ 'strcat' หรือฟังก์ชั่นพื้นฐานอื่น ๆ หลายครั้งที่สิ่งนี้ทำให้ฉันรอดพ้นจากการจ้างคนที่ถ้ามันไม่ได้เป็นคำถามที่โง่ ๆ อาจทำให้เกิดความโศกเศร้าไม่รู้จบและลากทีมลงไปด้วยความไร้ความสามารถ
Larry Gritz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.