การใช้โครงสร้างข้อมูลที่แตกต่างกันในทางปฏิบัติ [ปิด]


102

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

โครงสร้างข้อมูล - ตัวอย่าง / ใช้สำหรับ

ตารางแฮช - การค้นหาข้อมูลอย่างรวดเร็ว ... จากนั้นยกตัวอย่าง

อาร์เรย์ - ...

ต้นไม้ไบนารี - ...

หากมีแหล่งข้อมูลเช่นนี้โปรดแจ้งให้เราทราบ

ขอบคุณ!

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

คำตอบ:


96

พบรายการในคำถามที่คล้ายกันก่อนหน้านี้ใน StackOverflow:

Hash Table - ใช้สำหรับการค้นหาข้อมูลอย่างรวดเร็ว - ตารางสัญลักษณ์สำหรับคอมไพเลอร์การสร้างดัชนีฐานข้อมูลแคชการแสดงข้อมูลเฉพาะ

Trie - พจนานุกรมเช่นที่พบในโทรศัพท์มือถือสำหรับการเติมข้อความอัตโนมัติและการตรวจตัวสะกด

ต้นไม้คำต่อท้าย - การค้นหาข้อความเต็มอย่างรวดเร็วที่ใช้ในโปรแกรมประมวลผลคำส่วนใหญ่

Stack - เลิกทำ \ ทำซ้ำการดำเนินการในโปรแกรมประมวลผลคำการประเมินนิพจน์และการแยกวิเคราะห์ไวยากรณ์เครื่องเสมือนจำนวนมากเช่น JVM จะเน้นแบบสแต็ก

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

ลำดับความสำคัญ - การจัดตารางเวลากระบวนการในเคอร์เนล

ต้นไม้ - พาร์เซอร์ระบบไฟล์

ต้นไม้ Radix - ตารางเส้นทาง IP

ต้นไม้ BSP - คอมพิวเตอร์กราฟิก 3 มิติ

กราฟ - การเชื่อมต่อ / ความสัมพันธ์ในไซต์เครือข่ายสังคมการกำหนดเส้นทางเครือข่ายการสื่อสารการจัดระเบียบข้อมูล ฯลฯ

ฮีป - การจัดสรรหน่วยความจำแบบไดนามิกในเสียงกระเพื่อม

นี่คือคำตอบที่โพสต์โดยRV Pradeep

ลิงค์อื่น ๆ ที่มีประโยชน์น้อยกว่า:

แอปพลิเคชันจะแสดงรายการสำหรับโครงสร้างข้อมูลบางส่วนเท่านั้น

ไม่เน้นการใช้งานโดยสรุปที่ดีและตรงประเด็น


1
ลิงก์แรกของคุณเสีย
Dan Beaulieu

ขอบคุณ @DanBeaulieu ฉันลบลิงค์ที่ตายแล้ว
MXMLLN

1
สรุปดีมาก อาจเป็นรายการของการใช้งานที่ไม่สิ้นสุด แต่มีคนเข้าใจ
Nick L.

1
การเลิกทำ / ทำซ้ำจะเป็นกองหรือไม่ หากเลิกทำจากด้านบนของกองซ้อนคุณจะไม่สามารถทำซ้ำได้
Tony L.

5
@TonyL. ฉันรู้ว่านี่เป็นคำถามที่เก่ากว่า แต่ฉันเชื่อว่ามีการใช้ 2 สแต็กหรือเลิกทำ / ทำซ้ำ เมื่อคุณเลิกทำการกระทำมันจะถูกดึงออกมาจากกองการกระทำและวางไว้บน Redo Stack หากคุณทำซ้ำคุณจะนำมันออกจาก Redo Stack แล้วดันไปที่ Action Stack ฉันอาจใช้ศัพท์ผิด แต่ควรมีตัวอย่าง
Rick Henderson

14

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

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

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

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

ฉันยังโพสต์บันทึกบน github หากคุณสนใจ


7

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

ตอนนี้ประเภทข้อมูลเหล่านี้สามารถแบ่งออกเป็นแบบดั้งเดิมนามธรรมคอมโพสิตตามวิธีที่สร้างและเข้าถึงอย่างมีเหตุผล

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

ฉันหวังว่านี่จะช่วยให้คุณดำน้ำได้


6

หนังสือ " คู่มือการออกแบบอัลกอริทึม " ที่ยอดเยี่ยมของSkienna มีที่เก็บอัลกอริทึมและโครงสร้างข้อมูลขนาดใหญ่

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

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

อีกแหล่งข้อมูลที่ดีเป็นNIST พจนานุกรมของโครงสร้างข้อมูลและขั้นตอนวิธี


4

การประยุกต์ใช้โครงสร้างข้อมูลในทางปฏิบัติเพิ่มขึ้นเล็กน้อย

ต้นไม้สีแดง - ดำ (ใช้เมื่อมีการแทรก / ลบบ่อยครั้งและการค้นหาน้อย) - การจัดกลุ่ม K-mean โดยใช้ต้นไม้สีแดงดำ, ฐานข้อมูล, ฐานข้อมูลที่เข้าใจง่าย, ค้นหาคำภายในพจนานุกรม, ค้นหาบนเว็บ

ต้นไม้ AVL (การค้นหามากขึ้นและการแทรก / ลบน้อยลง) - การวิเคราะห์ข้อมูลและการขุดข้อมูลและแอปพลิเคชันที่เกี่ยวข้องกับการค้นหามากขึ้น

Min Heap - อัลกอริทึมการจัดกลุ่ม


3

การจัดลำดับโครงสร้างข้อมูลต่างๆอย่างน้อยบางส่วนจะเชื่อมโยงกับบริบทของปัญหา จะช่วยในการเรียนรู้วิธีวิเคราะห์ประสิทธิภาพของเวลาและพื้นที่ของอัลกอริทึม โดยทั่วไปจะใช้ "สัญกรณ์ O ขนาดใหญ่" เช่นการค้นหาแบบไบนารีอยู่ในเวลา O (log n) ซึ่งหมายความว่าเวลาในการค้นหาองค์ประกอบคือบันทึก (ในฐาน 2 โดยปริยาย) ของจำนวนองค์ประกอบ โดยสังหรณ์ใจเนื่องจากทุกขั้นตอนจะทิ้งข้อมูลที่เหลือครึ่งหนึ่งโดยไม่เกี่ยวข้องการเพิ่มจำนวนองค์ประกอบเป็นสองเท่าจะทำให้เวลาเพิ่มขึ้น 1 ขั้น (สเกลการค้นหาแบบไบนารีค่อนข้างดี) ประสิทธิภาพของพื้นที่เกี่ยวข้องกับจำนวนหน่วยความจำที่เพิ่มขึ้นสำหรับชุดข้อมูลขนาดใหญ่ นอกจากนี้โปรดทราบว่าสัญกรณ์ big-O จะละเว้นปัจจัยคงที่ - สำหรับชุดข้อมูลขนาดเล็กอัลกอริทึม O (n ^ 2) อาจยังเร็วกว่าอัลกอริทึม O (n * log n) ที่มีค่าคงที่สูงกว่า

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

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

มีตำรามากมายเกี่ยวกับการวิเคราะห์อัลกอริทึม / ประสิทธิภาพโครงสร้างข้อมูลที่ผู้คนแนะนำ แต่สิ่งที่ทำให้ฉันเข้าใจได้จริงๆคือการเรียนรู้ OCaml การจัดการกับโครงสร้างข้อมูลที่ซับซ้อนเป็นชุดที่แข็งแกร่งของ ML และพฤติกรรมของพวกเขาจะชัดเจนกว่ามากเมื่อคุณสามารถหลีกเลี่ยงตัวชี้และการจัดการหน่วยความจำเช่นเดียวกับใน C. (การเรียนรู้ OCaml เพียงเพื่อทำความเข้าใจโครงสร้างข้อมูลนั้นเกือบจะเป็นหนทางที่ยาวนาน :))

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