มีการผสมทุกประเภทอยู่ คุณมีโครงสร้างข้อมูลซึ่งไม่เกี่ยวข้องกับอัลกอริธึมอัลกอริธึมซึ่งไม่ต้องการโครงสร้างข้อมูลจริง แต่ส่วนใหญ่ทั้งสองจะมาในแพ็คเกจเดียว
แก้ไข:เนื่องจาก @Doval ชี้อย่างถูกต้องโครงสร้างข้อมูลต่อ se ไม่มีการดำเนินการใด ๆ ที่เกี่ยวข้อง การกระทำของการรวมโครงสร้างข้อมูลและอัลกอริทึมในรูปแบบข้อมูลนามธรรม
โครงสร้างข้อมูลที่ไม่มีอัลกอริธึม
พิจารณาโครงสร้างข้อมูลตัวอย่างเช่นสำหรับการจัดเก็บพิกัด 2 Point
มิติที่เรียกว่าเหมาะสม ไม่มีอะไรมากในแง่ของอัลกอริทึมที่จะทำเพื่อจุดและมันเป็นเพียงที่เก็บสำหรับx
และy
ค่า แน่นอนว่าด้วยโครงสร้างข้อมูลนี้คุณสามารถเพิ่มอัลกอริธึมได้ทุกประเภทด้านบนของมัน (การคำนวณระยะทางฮัลล์นูนสิ่งที่มีคุณ)
คุณสามารถคิดถึงโครงสร้างข้อมูลจำนวนมากซึ่งเป็นเพียงการสะสมของข้อมูลส่วนบุคคล ในขณะที่สิ่งเหล่านี้เกิดขึ้นบ่อยครั้งในทางปฏิบัติพวกเขาไม่ได้ทำเพื่อการสอนที่ดีเพราะไม่มีสิ่งใดที่จะเรียนรู้ได้เมื่อคุณเข้าใจแล้วว่าข้อมูลรายการเดียวสามารถสะสมเป็นโครงสร้างข้อมูลใหม่ได้ (เช่นสิ่งที่คุณเรียนรู้ หลังจากPoint
ตัวอย่างด้านบนถ้าฉันให้โครงสร้างข้อมูลที่น่ากลัวที่เรียกว่าPoint3D
ซึ่งสามารถทำสิ่งเดียวกันสำหรับพื้นที่ 3 มิติได้)
อัลกอริทึมที่ไม่มีโครงสร้างข้อมูล (จริง)
"จริง" เพราะเห็นได้ชัดว่าอัลกอริทึมที่น่าสนใจทุกอย่างต้องการชนิดข้อมูลดั้งเดิมเช่นจำนวนเต็มหรือบูลีนและเราไม่ต้องการพิจารณาสิ่งเหล่านั้นเป็นโครงสร้างข้อมูลในบริบทนี้ ในทำนองเดียวกันกับข้างบนอัลกอริทึมเหล่านี้มักจะค่อนข้างง่าย โดยเฉพาะอย่างยิ่งพวกเขาไม่ได้มาพร้อมกับสถานะที่ซับซ้อนของการเรียงลำดับใด ๆ เพราะมักจะเข้าไปในโครงสร้างข้อมูล (ดูหัวข้อถัดไป)
ตัวอย่างสำหรับอัลกอริทึมดังกล่าวจะคำนวณตัวหารร่วมมากของตัวเลขสองตัว อัลกอริทึมของ Euklid สำหรับ gcd ต้องการเพียงจำนวนเต็มสองจำนวนเท่านั้นและจัดการมัน
เมื่อสิ่งต่าง ๆ เริ่มน่าสนใจยิ่งขึ้นคุณก็จะเข้าสู่โลกของประเภทข้อมูลนามธรรม ตัวอย่างเช่นตะแกรงของ Eratosthenes ขึ้นอยู่กับอาร์เรย์ ตอนนี้เราอาจมีการอภิปรายไม่ว่าจะเป็นอาเรย์ยังคงดั้งเดิมหรือในความเป็นจริงคุณสามารถพูดคุยว่าจำนวนเต็มไม่ได้เป็นโครงสร้างข้อมูลแล้ว ทั้งสองวิธีอัลกอริทึมที่มีอยู่อย่างสมบูรณ์โดยไม่มีโครงสร้างข้อมูลค่อนข้างน่าเบื่อแม้ว่าคุณจะยอมรับการแยกตัวตนของพวกเขา
อัลกอริทึมรวมกับโครงสร้างข้อมูลหรือที่เรียกว่าประเภทข้อมูลนามธรรม
ตอนนี้สิ่งเหล่านี้เป็นสิ่งที่น่าสนใจ แต่ด้วยเหตุผลสองประการที่แตกต่างกันมาก โดยทั่วไปคุณสามารถเข้าถึงสิ่งเหล่านี้ได้จากสองทิศทาง: โครงสร้างข้อมูลก่อนหรืออัลกอริทึมก่อน
ในขณะที่ประเภทข้อมูลนามธรรมถูกกำหนดโดยการรวมกันของโครงสร้างข้อมูล + อัลกอริทึม / การดำเนินงานเรามักจะดูพวกเขาด้วยการมุ่งเน้นไปที่หนึ่งในนั้นและพิจารณาอีกประเภทหนึ่งเป็น enablers
โครงสร้างข้อมูลจากนั้นอัลกอริทึม
คุณจะพบกับชนิดข้อมูลนามธรรมซึ่งค่อนข้างง่ายต่อการใช้ แต่เกี่ยวข้องกับอัลกอริทึมที่ซับซ้อนมากขึ้นหรือน้อยลงเพื่อให้ทำงานภายในได้ ตัวอย่างเช่น a HashMap
เป็นเรื่องเล็กน้อยที่จะใช้ แต่เกี่ยวข้องกับฟังก์ชั่นแฮชที่ดีและจัดการกับการชนของแฮชในภายใน แต่จากมุมมองของคุณในฐานะผู้ใช้ที่คุณใส่ใจเป็นสิ่งที่เก็บข้อมูลให้คุณไม่ใช่สิ่งที่ทำเพื่อคุณ
ตรงกันข้ามกับกลุ่มสุดท้ายด้านล่างโครงสร้างข้อมูลเหล่านี้ไม่เปิดเผยผู้ใช้ของพวกเขากับอัลกอริทึมเหล่านี้ คุณไม่จำเป็นต้องรู้หรือสนใจเกี่ยวกับHashMap
ฟังก์ชันแฮชภายในเพื่อที่จะสามารถใช้งานได้ (หากต้องการใช้อย่างมีประสิทธิภาพคุณอาจต้องการทราบสิ่งเหล่านี้)
อัลกอริทึมจากนั้นโครงสร้างข้อมูล
อีกทางหนึ่งหมายถึงคุณมีอัลกอริทึมที่คุณต้องการใช้งานได้ง่าย แต่ต้องการโครงสร้างข้อมูลภายในเพื่อให้สามารถทำงานได้ตามที่ต้องการ ตัวอย่างจะเป็นอัลกอริทึมการแบ่งพื้นที่แบบไบนารี (BSP) ซึ่งคุณสามารถขอแบบ 2 มิติPoint
จากชุดของจุดขนาดใหญ่ที่ใกล้เคียงกับจุดสอบถามที่กำหนด อย่างไรก็ตามคุณจำเป็นต้องมีโครงสร้างต้นไม้ (และอัลกอริธึมเพิ่มเติมเช่นการคำนวณระยะทาง) ที่ด้านในเพื่อเขียนอัลกอริทึมจริง ๆ
โดยทั่วไปเราสามารถพูดได้ว่าอัลกอริทึมในกลุ่มนี้ใช้โครงสร้างข้อมูลที่เกี่ยวข้องสำหรับการแสดงสถานะภายในของพวกเขา ฉันจะเถียงว่าอัลกอริทึมกลุ่มนี้มีความหลากหลายมากที่สุดและคุณจะพบกับกลุ่มที่แตกต่างกันมากมายที่เหมาะกับรูปแบบทั่วไปนี้ เกี่ยวกับมุมมองเราเห็นว่าสิ่งเหล่านี้น่าสนใจเพราะพวกเขาทำอะไรบางอย่าง (f.ex. การเรียงลำดับ) สำหรับเราและไม่สนใจอะไรมากเกี่ยวกับส่วนที่เก็บข้อมูล
โครงสร้างข้อมูลและอัลกอริธึมที่เกี่ยวข้องอย่างใกล้ชิด
ในที่สุดคุณมีโครงสร้างข้อมูลที่เกี่ยวข้องอย่างใกล้ชิดกับอัลกอริทึมที่ตรงกับพวกเขา ตัวอย่างทั่วไปคือต้นไม้ไบนารีซึ่งเมื่อคุณต้องการทำอะไรที่มีความหมายกับมันบังคับให้หัวข้อของอัลกอริธึมการเดินบนต้นไม้กับคุณ
สำหรับกรณีเหล่านี้เราเปลี่ยนโฟกัสของมุมมองของเราเกี่ยวกับประเภทข้อมูลนามธรรมที่เกิดขึ้นบ่อยครั้ง บางครั้งคุณสนใจโครงสร้างของต้นไม้ไม่กี่นาทีต่อมาคุณสนใจที่จะสามารถค้นหาการดำเนินการได้จากนั้นคุณสงสัยว่าจะลบโหนดและทันทีเกี่ยวกับลักษณะโครงสร้างที่ตามมา ในขณะที่สิ่งเหล่านี้ถือเป็นจริงสำหรับส่วนอื่น ๆ ข้างต้นเช่นกันมันไม่ใช่สิ่งที่เป็นจุดสนใจหลักในใจของคุณตัวอย่างเช่นเมื่อคุณเก็บ / ดึงข้อมูลไปยัง / จาก a Map
หรือเมื่อคุณเรียงลำดับรายการที่เชื่อมโยง