เหตุใดโครงสร้างข้อมูลจึงมีความสำคัญในการสัมภาษณ์ [ปิด]


106

ฉันต้องยอมรับว่าฉันไม่แข็งแรงในโครงสร้างข้อมูลเมื่อฉันจบการศึกษาจากวิทยาลัย ตลอดการฝึกงานในมหาวิทยาลัยในช่วงที่ฉันเรียนจบฉันได้เห็นว่า บริษัท เทคโนโลยียักษ์ใหญ่อย่าง Amazon, Microsoft และอื่น ๆ มุ่งเน้นที่โครงสร้างข้อมูลเป็นหลัก ดูเหมือนว่าโครงสร้างข้อมูลเป็นสิ่งเดียวที่พวกเขาคาดหวังจากบัณฑิต

พูดตามตรงฉันรู้สึกไม่ดี ฉันเขียนรหัสที่ดี ฉันทำตามรูปแบบการออกแบบมาตรฐานของการเข้ารหัสฉันใช้โครงสร้างข้อมูล แต่ในระดับผิวเผินใน Java ที่เปิดเผย APIs เช่น ArrayList, LinkedList เป็นต้น แต่ บริษัท มักจะเน้นเรื่องโครงสร้างข้อมูลที่ซับซ้อนเช่นการจัดการหน่วยความจำตามตัวชี้และความซับซ้อนของเวลา

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

จริงๆแล้วทำไมทั้งหมดนี้จึงเน้นโครงสร้างข้อมูล?


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

6
@greengit: มีความแตกต่างระหว่างการนำแผนที่แฮชไปใช้กับ API สิ่งที่ฉันจะให้ความสำคัญในการสัมภาษณ์คือถ้าพวกเขาต้องการอธิบายใบสมัครให้ฉันจากนั้นขอให้ฉันสร้างโครงสร้างข้อมูลกลางและอธิบายทางเลือกของฉัน
György Andrasek

7
คุณต้องการให้ถามอะไร
ล่อลวง

13
@Jurily - เพื่อให้เข้าใจว่าเมื่อใดที่จะใช้ไลบรารีคอนเทนเนอร์จะช่วยให้มีความรู้เกี่ยวกับการทำงานของโครงสร้างข้อมูลพื้นฐาน เป็นการยากที่จะยอมรับว่าคุณรู้เกี่ยวกับประสิทธิภาพของโค้ดหากคุณไม่ทราบว่าเวลาและพื้นที่ซับซ้อนของห้องสมุดที่คุณใช้อยู่ - เพียงเพราะมันใช้งานได้ดีกับชุดทดสอบขนาดเล็ก ในโลกแห่งความจริง IMO การทำความเข้าใจเกี่ยวกับความซับซ้อนของเวลาและพื้นที่นั้นเป็นส่วนหนึ่งของการทำความเข้าใจเกี่ยวกับ API เช่นเดียวกับการรู้จักชื่อคลาสและเมธอด
Steve314

2
โครงสร้างข้อมูลที่ดีให้โค้ดที่เรียบง่ายสะอาดตา โครงสร้างข้อมูลที่ไม่ถูกต้องให้รหัสที่ซับซ้อน มันเป็นสิ่งสำคัญที่จะได้รับสิทธิ

คำตอบ:


121

บริษัท เทคโนโลยียักษ์ใหญ่อย่าง Microsoft ส่วนใหญ่เน้นที่โครงสร้างข้อมูลเป็นหลัก ดูเหมือนว่าโครงสร้างข้อมูลเป็นสิ่งเดียวที่พวกเขาคาดหวังจากบัณฑิต

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

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

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

ฉันต้องยอมรับว่าฉันไม่แข็งแรงในโครงสร้างข้อมูล

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

มีมุมมองทั่วไปที่โปรแกรมเมอร์ที่ดีจำเป็นต้องมีความรู้เกี่ยวกับโครงสร้างข้อมูลที่ดี

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

ทำไมทั้งหมดนี้เน้นโครงสร้างข้อมูล?

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

การไม่มีความรู้ในโครงสร้างข้อมูลส่งผลกระทบต่ออาชีพการเขียนโปรแกรมหรือไม่?

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

ความรู้ในเรื่องนี้เป็นพื้นฐานที่เพียงพอจริงๆที่จะแยกแยะความแตกต่างระหว่างดีและไม่ดีโปรแกรมเมอร์?

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


10
ขอบคุณ Eric หนึ่งตัน! นี่เป็นคำตอบที่ลดทอนน้อยที่สุดที่ฉันมีสำหรับคำถามของฉัน :-)
Vamsi Emani

2
@EricLippert ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้ ในฐานะนักพัฒนาที่เรียนรู้ด้วยตนเองที่ยังไม่ถูกกัดเพราะขาดความรู้อย่างเป็นทางการเกี่ยวกับโครงสร้างข้อมูลคุณแนะนำหนังสือที่สามารถแสดงสิ่งที่ฉันขาดหายไปได้ไหม?
ปิดคาวบอย

5
@Closure Cowboy: สำหรับพื้นฐานของโครงสร้างข้อมูลและอัลกอริธึม "Introduction to Algorithms" โดย Cormen, Leieserson และ Rivest เป็นตำราเรียนมาตรฐาน หากคุณสนใจโครงสร้างข้อมูลสไตล์การทำงานหนังสือของ Chris Okasaki นั้นดีมาก แต่ค่อนข้างก้าวหน้า
Eric Lippert

2
@ClosureCowboy ตรวจสอบหลักสูตร 'อัลกอริทึม I' ของ Coursera ที่เสนอโดย Princeton ฉันเป็นโปรแกรมเมอร์ที่สอนตัวเองด้วยและมันก็ทำอะไรมากมายเพื่อช่วยเติมช่องว่างของฉันในความรู้ทฤษฎี CS
Evan Plaice

133

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

การไม่มีความรู้ในโครงสร้างข้อมูลส่งผลกระทบต่ออาชีพการงานเขียนโปรแกรมหรือไม่?

ใช่. อย่างแน่นอน. หากคุณไม่ต้องการใช้แอปพลิเคชั่น CRUD ตลอดชีวิต

หรือความรู้ในเรื่องนี้เป็นพื้นฐานที่เพียงพอที่จะแยกแยะความแตกต่างระหว่างโปรแกรมเมอร์ที่ดีและไม่ดี?

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


นิดหน่อยนิดหน่อยฉันจะไม่บอกว่า datastructures ไม่มีเวลาต่อ se โครงสร้างจำนวนมากถูกสร้างแบบจำลองสำหรับการแก้ปัญหาด้วยฮาร์ดแวร์ในปัจจุบัน ตัวอย่างเช่นเราใช้ต้นไม้ B + เพื่อเพิ่มประสิทธิภาพการค้นหาผ่านหน้าไฟล์ แต่ฮาร์ดแวร์พื้นฐานมีการเปลี่ยนแปลง บางที SSD อาจต้องใช้อัลกอริธึมที่แตกต่างกันหรือบางทีที่ซึ่งเคลื่อนไปสู่การเข้าถึง RAM มากกว่าดิสก์ io ดังนั้นในขณะที่อัลกอริธึมในตัวมันเองอาจจะ "ไร้กาลเวลา" มันเป็นสถานที่และจุดประสงค์ไม่ใช่
Homde

3
@ Konrad: นั่นคือสิ่งที่ฉันหมายถึง "เพื่อการปฏิบัติ" ฉันไม่สามารถนึกถึงโครงสร้างข้อมูลหรืออัลกอริทึมที่กลายเป็น "ล้าสมัย" และฉันสงสัยว่าคุณจะเจอหนึ่งในการสัมภาษณ์งาน และเนื่องจากอัลกอริทึม / โครงสร้างข้อมูลส่วนใหญ่ได้รับการพัฒนามานานก่อนฮาร์ดแวร์ปัจจุบันของเราและยังคงมีประโยชน์ฉันยังเดาว่ามีการพัฒนาร่วมกันบางอย่างที่การพัฒนาฮาร์ดแวร์ใหม่ได้รับคำแนะนำจากโครงสร้างข้อมูลที่เรารู้จัก
nikie

ถ้า / เมื่อเห็นพ้องกลายเป็นพฤตินัยบังคับฉันสามารถคิดที่ดีโครงสร้างข้อมูลจำนวนมากที่จะล้าสมัย :)
Homde

9
@ Konrad: และถ้า / เมื่อคอมพิวเตอร์ควอนตัมกลายเป็นมาตรฐานฉันสามารถคิดอีกไม่กี่ แต่ฉันคิดว่า OP ไม่ต้องการรอกับการสัมภาษณ์งานของเขาจนกระทั่งตอนนี้ ;-)
nikie

3
... หรือเมื่อ
ผู้นำทาง

45

ฉันเป็นผู้เรียนอย่างรวดเร็วและฉันสามารถเรียนรู้กรอบงานใหม่ APIs หรือแม้แต่ภาษาโปรแกรมภายในระยะเวลาอันสั้น

ไม่ให้ฟังดูรุนแรงเกินไปนัก แต่ผู้พัฒนาที่มีคุณสมบัติครึ่งหนึ่งจะสามารถเลือกภาษาหรือกรอบงานใหม่ได้ในเวลาอันสั้น

โครงสร้างข้อมูลเป็นสากลมันเป็นพื้นฐานของวิทยาศาสตร์คอมพิวเตอร์ - ต้นไม้สีแดงดำนั้นเป็นพื้นเดียวกันไม่ว่าจะนำไปใช้ใน Java, Python, PHP หรืออะไรก็ตาม ดังนั้นแทนที่จะทดสอบภาษาเฉพาะหรือกรอบงานเฉพาะนายจ้าง (อย่างน้อยผู้ที่มองหานักพัฒนาที่โดดเด่น) จะทดสอบว่าคุณรู้จักพื้นฐานของวิทยาการคอมพิวเตอร์หรือไม่มากกว่าสิ่งที่พวกเขาชอบในแต่ละเดือน กำลังใช้งานอยู่

(อย่างน้อยพวกเขาควรจะทดสอบพื้นฐานเพิ่มเติมจากสิ่งที่พวกเขากำลังใช้อยู่ ... ไม่ต้องจ้างตัวช่วยสร้างวิทยาศาสตร์คอมพิวเตอร์ถ้าเขาไม่เคยเขียนโค้ดในชีวิตของเขา)


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

1
โครงสร้างข้อมูลนั้นเป็นสากลจนกว่าคุณจะได้ติดการเขียนโปรแกรมที่ใช้งานได้จริง: P
Tikhon Jelvis

30

คุณเชื่อไหมว่านักแข่งF1เพียงขับรถยนต์เร็ว ไม่พวกเขาเข้าใจรถที่พวกเขาขับและพวกเขาทำงานร่วมกับช่างเครื่อง / วิศวกรเพื่อปรับแต่ง แน่นอนว่าคนขับธรรมดาแค่ขับ

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

แต่หลาย บริษัท มองหานักพัฒนา F1 ผู้ที่จะพัฒนารู้ว่าสิ่งที่อยู่เบื้องหลังรหัสของพวกเขา คนที่จะช่วยให้ บริษัท สร้างสิ่งที่ดีกว่า

มันค่อนข้างดีที่จะรู้ว่าโครงสร้างข้อมูลไม่เพียงเพราะคุณจะใช้มันในรูปแบบ "การปรุงก่อน" เป็นจำนวนมาก นอกจากนี้ยังดีเพราะคุณจะสร้างสิ่งที่เกิดขึ้นจากความคิดของพวกเขา



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

@ Robbie: +1 LOL คุณชอบที่จะถอดแยกชิ้นส่วนหรือไม่?
graffic

2
ได้. พ่อของฉันสอนฉันถึงวิธีการแยกสิ่งต่าง ๆ ออกจากกัน เขาเพิกเฉยที่จะสอนฉันถึงวิธีที่จะนำสิ่งต่าง ๆ กลับมารวมกันรับรู้สิ่งนั้นตลอดชีวิตของฉัน
Robbie

17

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

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

  • การค้นหา abstractions เพื่อจำลองปัญหาที่เป็นรูปธรรม
  • ความสามารถในการย่อยสลายปัญหา
  • ความสามารถในการใช้เหตุผล / เหตุผลอย่างเป็นทางการ
  • ความคิดสร้างสรรค์
  • เป็นต้น

เมื่อ Amazon และไมโครซอฟท์จ้างคนพวกเขาไม่ได้ถามคำถามเกี่ยวกับโครงสร้างข้อมูลเพราะพวกเขาหวังว่าจะคิดค้น quicksort พวกเขาต้องการให้แน่ใจว่าพวกเขาจ้างคนที่มีคุณสมบัติดังกล่าวข้างต้น

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


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


3
และเกี่ยวกับการArrayListโดยไม่มีความเข้าใจที่ดีของโครงสร้างข้อมูลที่คุณอาจไม่ได้ตระหนักว่าArrayListไม่ขนาดไม่มากและคุณจะต้องพบและเขียนโครงสร้างและขั้นตอนวิธีที่ขนาด
phoog

12

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

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

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

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

PS ความเชี่ยวชาญกับโครงสร้างข้อมูลพื้นฐาน (รายการที่เชื่อมโยง, พจนานุกรม, แฮชเทเบิลฯลฯ ) ควรเป็นความรู้ที่จำเป็นสำหรับโปรแกรมเมอร์ DS ใด ๆ


7

จริงๆแล้วทำไมทั้งหมดนี้จึงเน้นโครงสร้างข้อมูล?

ด้วยเหตุผลสองประการ

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

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


ฉันจะนำเสนอความคิดเห็นที่นี่ซึ่งน่าจะเป็นการโต้เถียง คำถามที่ว่าทำไมโครงสร้างข้อมูลหนึ่งหรือโครงสร้างอื่นมีแนวโน้มที่จะลดลงไปถึงประสิทธิภาพและประสิทธิภาพ เราบอกอะไรนักพัฒนาไม่ให้ทำ ไม่มีการเพิ่มประสิทธิภาพก่อนกำหนด! หากคุณไม่ทราบด้วยการทำโปรไฟล์ว่าการเลือกโครงสร้างข้อมูลทำให้เกิดปัญหาประสิทธิภาพการทำงานการเลือก 'ถูกต้อง' เป็นสิ่งที่คุณคุ้นเคยมากที่สุด การตัดสินใจอื่น ๆ คือการปรับให้เหมาะสมก่อนเวลาและดังนั้นจึงชั่วร้าย!
Tom W

2
หยิบโครงสร้างข้อมูลขวาขึ้นด้านหน้าบนพื้นฐานของการบังคับใช้และคาดว่าลักษณะการทำงานเป็นอิสระจากการดำเนินงานพื้นฐานคือไม่ได้ตัวอย่างของการเพิ่มประสิทธิภาพก่อนวัยอันควร
John Bode

การเลือกฟีโบนักชีฮีปมากกว่าฮีปแบบไบนารีสามารถทำได้ การใช้ heap vs list (เมื่อเหมาะสมกับ heap) ไม่ใช่
user470365

5

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


+1 สำหรับสิ่งที่คุณจะทำแบบทดสอบผู้สำเร็จการศึกษาเนื่องจากไม่มีสิ่งอื่นใดที่ผู้สำเร็จการศึกษาวิชาคอมพ์ทุกคนควรรู้ว่าคุณรู้เช่นกัน
เอียน

4

บ่อยครั้งที่รหัสที่ดีที่สุดหลีกเลี่ยงการรวมโครงสร้างข้อมูลระดับต่ำ โดยเฉพาะอย่างยิ่งในภาษาระดับสูง ฉันสังเกตเห็นแนวโน้มของคำถามโครงสร้างข้อมูลระดับต่ำแม้ในงาน CRUD YMMV แต่ดูเหมือนว่าการเน้นความเชี่ยวชาญของนักวิทยาศาสตร์แฮ็กเกอร์ได้บดบังทักษะอื่น ๆ ที่ทำให้นักพัฒนาที่ยอดเยี่ยม:

  • การจัดการโครงการ / เวลา: ความสามารถในการติดตามโลกแห่งความจริงที่ขับเคลื่อนโดยธุรกิจไม่ใช่รายการที่เชื่อมโยงใหม่ที่ทำงานได้เร็วขึ้น 1%
  • จำนวนของทักษะทางสังคมขั้นต่ำ: นักพัฒนาที่หยิ่งและไม่สามารถเข้าร่วมได้ก็เป็นเพียงสมอ
  • ความสามารถในการเรียนรู้สิ่งใหม่ ๆ อย่างรวดเร็วและต่อเนื่อง: โครงสร้างข้อมูลแทบจะไม่เปลี่ยนแปลงในช่วงหลายปีที่ผ่านมา ... แต่ทุกอย่างอื่นก็ทำ โครงสร้างข้อมูลเป็นพื้นฐานที่ดีและนักพัฒนาทุกคนควรรู้จักพวกเขาค่อนข้างดี แต่นักบัญชีไม่ได้รับการทดสอบทักษะการแบ่งระยะยาวเมื่อพวกเขาเข้าสัมภาษณ์ นักพัฒนาที่ยอดเยี่ยมคือประเภทของคนที่สามารถค้นหาสิ่งใหม่ ๆ และชอบได้

โครงสร้างข้อมูลยอดเยี่ยม โครงสร้างข้อมูลมีความสำคัญ โปรแกรมเมอร์ทุกคนควรมีความเข้าใจ อย่างไรก็ตามเราหมกมุ่นอยู่กับการผลักดันปัจจัยพื้นฐานเหล่านี้ออกไปนอกสถานที่ของพวกเขา มันไม่ได้เกี่ยวกับโครงสร้างข้อมูลและใน 99% ของกรณีไม่จำเป็นต้องถามคำถามเกินกว่าพื้นฐานของโครงสร้างข้อมูล หากคุณสัมภาษณ์นักบัญชีให้ถามพวกเขาว่าอะไรคือ 81 หารด้วย 9 แต่ถ้าคุณถามต่อไปว่า "คิวบ์รูทของ 98425454242412 * 4512324 คืออะไร? จากนั้นคุณจะต้องตกใจกับคนที่เหมาะสมมีไหวพริบฉลาดมีความสามารถและเป็นที่น่าพอใจที่คุณมี ถามว่าพวกเขาสามารถสร้างแบบจำลองข้อมูลเชิงสัมพันธ์ขั้นพื้นฐานได้หรือไม่ถามว่าพวกเขาสามารถใช้โครงสร้างอาร์เรย์แบบปรับปรุงที่จัดทำโดยกรอบงานที่เกี่ยวข้องหรือไม่ และถามว่าพวกเขาสามารถอธิบายได้หรือไม่ว่าการค้นหาแบบไบนารีนั้นเร็วกว่าการค้นหาแบบแฟลตหรือไม่ แต่ไม่มีอะไรมากไปกว่านั้น หากพวกเขาสามารถทำสิ่งเหล่านั้นได้ให้เริ่มมองหาคนที่มีความคิดสร้างสรรค์และดีที่สุดในอาชีพ

ฉันชอบงานเขียนของ Joel แต่ฉันคิดว่าสิ่งที่ "โรงเรียน Java" ของเขาผิดปกติ มีหลายสิ่งหลายอย่างที่สามารถพิสูจน์ได้ว่าใครบางคนฉลาดเกินกว่าการควบคุม C ++ ลองคิดดูคุณสามารถพูดคุยกับใครสักคนเป็นเวลา 10 นาทีโดยไม่ต้องถามพวกเขาเกี่ยวกับตัวชี้ทางคณิตศาสตร์และได้รับความคิดที่ดีว่าพวกเขาเป็นคนประเภทที่สามารถทำสิ่งต่าง ๆ และคิดออกหรือไม่ เราไม่จำเป็นต้องเป็นเช่นนี้:

ผู้สัมภาษณ์: "บอกฉันเกี่ยวกับความสำเร็จของคุณ"

Coder: "ในตำแหน่งสุดท้ายของฉันฉันเป็นผู้พัฒนาระบบ ERP แบบกำหนดเอง แต่เพียงผู้เดียวสำหรับ บริษัท ทางการเงินหนึ่งพันล้านดอลลาร์เราส่งมอบล่วงหน้าหลายเดือนก่อนกำหนดและระบบดังกล่าวได้มีการผลิตในช่วง 3 ปีที่ผ่านมา"

ผู้สัมภาษณ์: "ให้ฉันอธิบายให้ฉันฟังเกี่ยวกับความสำเร็จในการเขียนโปรแกรมของคุณ"

รหัส: "อืมม ... "

ผู้สัมภาษณ์: "ยกตัวอย่างเช่นคุณเคยทำลิสต์ของคุณเองหรือ"

Coder: "... [เดินออกไป]"


ที่น่าสนใจ - รายการที่ดี มองต่างออกไปเล็กน้อย 1. การจัดการโครงการ / เวลา: ความสามารถในการเตรียมสิ่งต่าง ๆ ในลักษณะที่โครงสร้างข้อมูลเสียเวลาในการสัมภาษณ์เพียงเล็กน้อยเท่านั้น 2. ทักษะทางสังคมขั้นต่ำ: นักพัฒนาที่สามารถเข้าใจได้ว่าผู้สัมภาษณ์ต้องการตรวจสอบโครงสร้างข้อมูลพื้นฐานอย่างรวดเร็วก่อนดำเนินการต่อในพื้นที่ที่น่าสนใจ 3. ความสามารถในการเรียนรู้สิ่งใหม่ ๆ ได้อย่างรวดเร็วและต่อเนื่องโดยไม่มีสิ่งรบกวนซึ่งอาจเกิดจากการขาดความรู้พื้นฐานโครงสร้างข้อมูลที่ดี
ริ้น

@gnat - ก็ดีเช่นกัน ฉันเดาว่าสิ่งที่ฉันได้รับคือความเข้าใจในเชิงลึกที่สุดของพื้นฐานไม่ได้พูดถึงความสามารถโดยรวมที่ผ่านจุดหนึ่ง แต่มีแนวโน้มที่จะถือว่าตรงกันข้าม โครงสร้างข้อมูลเป็นสิ่งที่คนส่วนใหญ่ได้รับการสอนจากบุคคลอื่น (โดยปกติจะเป็นครู) ฉันต้องการรู้ว่าพวกเขาสามารถเรียนรู้อะไรได้ด้วยตัวเองเพราะนั่นคือวิธีการทำงานของโลกแห่งความจริง โปรแกรมเมอร์ที่ดีสามารถออกแบบระบบที่เหมาะสมตามแนวปฏิบัติที่ดีที่สุด โปรแกรมเมอร์ที่ยอดเยี่ยมสามารถเรียนรู้ระบบบ้าที่เขียนโดยโปรแกรมเมอร์ที่น่ากลัวโดยใช้วิธีปฏิบัติที่เลวร้ายที่สุดและทำให้มันทำงานได้
Morgan Herlocker

1
ฉันสามารถจินตนาการได้ว่าคนที่ทำงานในระบบ ERP นั้นไม่เหมาะสำหรับทีม
Christopher Mahan

4

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

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


2

โครงสร้างข้อมูล, ความซับซ้อนของเวลา, การจัดการหน่วยความจำและพอยน์เตอร์เป็นพื้นฐานทั้งหมดที่ใครบางคนที่เรียกตัวเองว่านักวิทยาศาสตร์คอมพิวเตอร์ควรรู้ รหัสลิงใด ๆ สามารถเรียนรู้ภาษาและเรียนรู้วิธีการใช้งานได้ แต่ที่ผู้เชี่ยวชาญด้าน CS และนักเรียนควรแยกตัวออกจากกันคือไม่รู้ว่าจะใช้รายการที่เชื่อมโยงหรือแผนที่แฮช แต่ทำไม

ทำไมจึงเป็นสิ่งที่ทำให้พวกเราทุกคนแตกต่างจากตัวละครสคริปต์พื้นฐานรหัสลิงและความไม่แน่นอนของโลกแห่งการคำนวณ ทำไมต้องใช้ตารางแฮชแทนรายการที่เชื่อมโยงทำไมตารางแฮชของฉันควรมีความหนาแน่นของคลัสเตอร์โดยประมาณ 0.6-6.8 ทำไมฉันจึงควรใช้รายการที่เชื่อมโยงแบบวงกลมที่นี่แทนที่จะเป็นรายการที่ลิงก์ทวีคูณ ทำไมรหัสของฉันควรทำงานอย่างมีประสิทธิภาพ 'x' ในกรณีที่เลวร้ายที่สุดและ 'y' ในกรณีทั่วไป

โครงสร้างข้อมูลพื้นฐานและความรู้เหล่านี้ไม่เพียง แต่จะถูกนำมาใช้อย่างไร (ควรเป็นอย่างไรในโปรแกรมเมอร์ทุกคนจะต้องมีการตอบโต้ต่อไป) แต่ผู้ที่ไม่เชื่อเรื่องภาษาใช้ทำไมซึ่งพวกเขาใช้ซึ่งมีแนวโน้มมากกว่าสิ่งที่พวกเขาต้องการ

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


0

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

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

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

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


-2

หากต้องการสร้างสิ่งที่@Pelshoff กล่าวไว้แสดงว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่ หากคุณใช้ LinkedList สำหรับทุกสิ่งที่อาจแสดงว่าคุณไม่รู้ว่าคุณกำลังทำอะไรอยู่หรือคุณไม่สนใจที่จะหยุดและคิดถึงปัญหา ยิ่งไปกว่านั้นอย่างน้อยหลักสูตรโครงสร้างข้อมูลที่ฉันได้กล่าวถึงทฤษฎีความซับซ้อนขั้นพื้นฐานของโครงสร้างข้อมูลเหล่านั้นซึ่งเมื่อจัดการกับชุดข้อมูลขนาดใหญ่มีความสำคัญมาก นั่นเป็นเหตุผลว่าทำไม บริษัท เช่น Amazon หรือ Microsoft จะทำสิ่งนี้

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


"ถ้าคุณใช้ LinkedList สำหรับทุกอย่างที่อาจแสดงไม่ทราบว่าสิ่งที่คุณทำ" หรือคุณเป็น :-) โปรแกรมเมอร์เสียงกระเพื่อม
ปีเตอร์อเล็กซานเด

@ Peter - ซึ่งจะพิสูจน์จุดของฉันคุณไม่รู้ว่าคุณกำลังทำอะไร! ;)
Jetti

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

-2

ไม่ว่าคุณจะเขียนรหัสที่ดีหรือไม่ก็เป็นคำสั่งอัตนัย สิ่งสำคัญคือต้องรู้ว่ารหัสการทำงานนั้นไม่ได้สร้างรหัสที่ดีเสมอไป

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

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

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


-3

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

ตัวอย่างเช่นเรามีความต้องการในการจัดการวัตถุนับพัน ทุกครั้งที่เราจำเป็นต้องอัปเดตการประทับเวลาของวัตถุตาม ID ของมัน ทุกครั้งที่เราจำเป็นต้องลบวัตถุที่ไม่ได้รับการปรับปรุงเป็นเวลามากกว่า X นาที

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.