ความสัมพันธ์ระหว่างโครงสร้างข้อมูลและอัลกอริทึมคืออะไร? [ปิด]


13

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

ในหลักสูตรนี้คุณจะได้เรียนรู้หลักการพื้นฐานหลายประการของการออกแบบอัลกอริทึม: วิธีการแบ่งและพิชิตอัลกอริธึมกราฟ โครงสร้างข้อมูลที่ใช้งานได้ (ฮีปตารางแฮชแผนภูมิการค้นหา)อัลกอริธึมแบบสุ่มและอื่น ๆ [แหล่ง]

และ

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

และ

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

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

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


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

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

7
@Eurhoric ฉันจะเถียงว่ามันผิดที่จะบอกว่าอัลกอริทึมเป็นส่วนหนึ่งของโครงสร้างข้อมูล มีมากกว่าหนึ่งวิธีในการใช้การค้นหาแบบไบนารี: คุณสามารถif less than recurse to the left; if greater than, recurse to the right; if equal, returnทำการค้นหาที่ไร้เดียงสาหรือซับซ้อนกว่าเล็กน้อยif less than recurse to the left; otherwise keep track of this value as a potential candidate and recurse to the right; check for equality once we reach the leavesได้ พวกเขามีการเปรียบเทียบแตกต่างกันเล็กน้อย ทั้งสองเป็นหนึ่งในหลาย ๆ สิ่งที่คุณสามารถเลือกที่จะทำกับต้นไม้
Doval

4
@Euphoric คุณกำลังสับสนโครงสร้างข้อมูลด้วยชนิดข้อมูลนามธรรมที่การรวมกันของโครงสร้างข้อมูลและอัลกอริทึมใช้
Doval

7
@ ความสุขฉันต้องไม่เห็นด้วย จัดเรียงผสานเป็นอัลกอริทึม อาร์เรย์คือโครงสร้างข้อมูล รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลที่แตกต่างกัน ฉันสามารถเขียนการใช้งาน MergeSort เพื่อใช้งานได้เช่นกัน โครงสร้างข้อมูลบางอย่างอาจดูเป็นธรรมชาติหรือมีประสิทธิภาพมากกว่าสำหรับอัลกอริทึมเฉพาะ แต่มันไม่ค่อยเป็นข้อกำหนดที่แน่นอน (คุณต้องมี heap เพื่อนำ heap sort มาใช้) Nicholas Wirth เขียนหนังสือเรียนยอดนิยมในปี 1980 หัวข้อ: "Algorithms + Data Structures = Programs"
Charles E. Grant

คำตอบ:


20

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

แก้ไข:เนื่องจาก @Doval ชี้อย่างถูกต้องโครงสร้างข้อมูลต่อ se ไม่มีการดำเนินการใด ๆ ที่เกี่ยวข้อง การกระทำของการรวมโครงสร้างข้อมูลและอัลกอริทึมในรูปแบบข้อมูลนามธรรม

โครงสร้างข้อมูลที่ไม่มีอัลกอริธึม

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

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

อัลกอริทึมที่ไม่มีโครงสร้างข้อมูล (จริง)

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

ตัวอย่างสำหรับอัลกอริทึมดังกล่าวจะคำนวณตัวหารร่วมมากของตัวเลขสองตัว อัลกอริทึมของ Euklid สำหรับ gcd ต้องการเพียงจำนวนเต็มสองจำนวนเท่านั้นและจัดการมัน

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

อัลกอริทึมรวมกับโครงสร้างข้อมูลหรือที่เรียกว่าประเภทข้อมูลนามธรรม

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

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

โครงสร้างข้อมูลจากนั้นอัลกอริทึม

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

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

อัลกอริทึมจากนั้นโครงสร้างข้อมูล

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

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

โครงสร้างข้อมูลและอัลกอริธึมที่เกี่ยวข้องอย่างใกล้ชิด

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

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


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

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

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

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

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

5

โครงสร้างข้อมูลมักจะมีอิทธิพลต่อรายละเอียดของอัลกอริทึม ด้วยเหตุนี้ทั้งสองมักจะจับมือกัน

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

ในที่สุดโครงสร้างของข้อมูลของคุณอาจมีผลกระทบอย่างมีนัยสำคัญต่อการตัดสินใจของคุณสำหรับวิธีการพัฒนาอัลกอริทึมของคุณ (หรืออัลกอริทึมที่จะใช้) ด้วยเหตุผลนี้ทั้งสองหัวข้อจึงเข้ากัน

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

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