ควรใช้ DAG (Directed Acyclic Graph) ในการเขียนโปรแกรมเมื่อใด


37

ฉันเพิ่งพบกรอบชื่อecto

ในเฟรมเวิร์กนี้ส่วนประกอบพื้นฐานที่ชื่อว่า"พลาสม่า"ซึ่งเป็นกราฟเชิงเส้นกำกับของ ecto ใน ecto พลาสซึมสามารถดำเนินการได้โดยตัวจัดตารางเวลาของ ecto

ฉันสงสัยว่ากลไกนี้มีประโยชน์อย่างไรและในสถานการณ์อื่นใดที่เราสามารถใช้ประโยชน์จากแนวคิดของ DAG ได้?


6
ระบบการจัดการการควบคุมแหล่งที่มาส่วนใหญ่ใช้การแก้ไขเป็น DAG
Oded

1
การวางแผนเป็นสาขาทั้งปัญหาที่เกี่ยวข้องกับ DAG มาก
TC1

1
หลายสิ่งหลายอย่างที่ได้รับการแสดงเป็นต้นไม้ควรจริงๆจะแสดงเป็น DABs ความเมื่อเก็บไว้ในใจแปลกที่ยังยังคงค่อนข้างทั่วไปกรณีขอบ
Joachim Sauer

@JoachimSauer เช่นระบบไฟล์ที่มีฮาร์ดลิงก์
jk

คำตอบ:


29

คำถามที่ดี

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

แก้ไข:

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

ทรัพยากรที่ดี:


1
ไม่มีลูป? ฉันคิดว่าตราบใดที่ลูปสิ้นสุดลงควรมีคุณสมบัติ แทนที่จะเป็น A -> B -> C มันอาจเป็น A -> B -> A1 -> B1 -> A2 -> B2 -> C. Cyclic ในแง่หนึ่ง แต่ไม่ใช่ในอีกแง่หนึ่ง เป็นเหมือนเกลียวมากกว่าเป็นวงกลม
GlenPeterson

@GlenPeterson ใช่คุณพูดถูก ฉันได้แก้ไขคำตอบของฉัน ขอบคุณสำหรับความคิดเห็น :)
Md Mahbubur Rahman

ยังไม่คิดว่าจำเป็นต้องใช้ "เส้นตรง" 'G' ใน DAG ย่อมาจากกราฟ ตรวจสอบคำตอบของฉันด้านล่าง ขออภัยฉันไม่ได้อ่านอย่างละเอียดพอที่จะตอบ แต่ฉันได้ +1 คำตอบของคุณสำหรับความสมบูรณ์และการตรัสรู้ในทุกระดับ
GlenPeterson

@GlenPeterson ขออภัยในความผิดพลาด ฉันได้อัพเดตคำตอบแล้ว ฉันชอบคำตอบของคุณ ทำให้ +1 เป็นคำตอบของคุณ
Md Mahbubur Rahman

3
ขอบคุณสำหรับ +1 ของคุณ ฉันยังคิดว่ารหัสทั้งหมดเป็น DAG ไม่ จำกัด เฉพาะนิพจน์ทางคณิตศาสตร์ I / O, ข้อยกเว้น, การทำงานแบบหลายกระบวนการและการขัดจังหวะฮาร์ดแวร์เป็นเพียงแค่จุดเริ่มต้นหรือจุดสิ้นสุดอื่น ๆ ใน Directed (เพราะเป็นจุดเริ่มต้นหรือจุดสิ้นสุด), Acyclic (ไม่มีลูปไม่สิ้นสุด) กราฟ (ชุด จำกัด ของคู่ลำดับที่สั่ง) . การติดตามคำถามของ Ricky ที่น่าสนใจอาจมี "มีรหัสที่ถูกต้องและใช้งานได้ซึ่งไม่ใช่ DAG" ฉันคิดว่าคำตอบคือ "ไม่" แต่ยินดีที่มีคนพิสูจน์ฉันผิด
GlenPeterson

12

คำตอบคือมันไม่มีอะไรเกี่ยวข้องกับการเขียนโปรแกรมมากนัก มันเกี่ยวกับการแก้ปัญหา

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

หากคุณยังต้องการความสัมพันธ์กับการเขียนโปรแกรมกรุณาพิจารณาประเด็นต่อไปนี้:

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

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

6

คนอื่น ๆ ได้ใช้ DAG กับข้อมูล แต่ฉันคิดว่าอย่างน้อยก็ใช้ได้ (ถ้าไม่มาก) กับรหัส Mahbubur R Aaman กล่าวถึงสิ่งนี้ดังนั้นนี่เป็นภาคผนวกของคำตอบของเขามากกว่าคำตอบทั้งหมดด้วยตัวเอง

มันเกิดขึ้นกับฉันมากกว่าโปรแกรมคอมพิวเตอร์ที่จำเป็นที่ไม่มีลูปไม่สิ้นสุด (ขอบคุณ @AndresF.) คือ Directed Acyclic Graph (DAG) หมายความว่าเส้นทางที่เป็นไปได้ของการดำเนินการของรหัสถูกชี้นำ พวกเขาเป็นกราฟเพราะเส้นทางผ่านรหัสที่สำคัญใด ๆ นั้นไม่ง่ายเหมือนรายการหรือต้นไม้

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

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

ตอนแรกฉันคิดว่าการเขียนโปรแกรมที่ใช้งานได้อาจไม่เป็น DAG เพราะบางครั้งคำสั่งการดำเนินการไม่ชัดเจนหรือแม้แต่ผู้ที่คิดเกี่ยวกับโปรแกรมเมอร์ แต่โปรแกรมการทำงานจะกำหนดการพึ่งพา ในความเป็นจริงลักษณะการประกาศของการเขียนโปรแกรมฟังก์ชั่นอาจจะคิดว่าเป็นการกำหนดเพียงการอ้างอิง (a ^ 2 = b ^ 2 + c ^ 2) โดยไม่ต้องระบุคำสั่งดำเนินการ (มันไม่สำคัญว่า 'b' หรือ 'c' กำลังสองก่อน ตราบใดที่ทั้งคู่กำลังสองก่อนที่จะถูกรวมเข้าด้วยกัน)

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

คำถามที่ดี - ขอบคุณสำหรับการโพสต์!


1
โปรแกรมที่จำเป็นนี้เป็น DAG ในความคิดของคุณwhile (true) { print("hi"); }หรือไม่? บางทีคุณต้องการที่จะยกเว้นโปรแกรมที่ไม่สิ้นสุด?
Andres F.

5

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


2

ฉันสงสัยว่าประโยชน์ของพลาสม่าใน Ecto คืออะไร ...

DAG สามารถใช้ในการสร้างแบบจำลองการรวบรวมงานในลำดับที่มีข้อ จำกัด ว่างานบางอย่างต้องทำก่อนงานอื่น Ectoเป็นกรอบการประมวลผลและใช้ DAG ในการสร้างแบบจำลองกราฟการประมวลผลเพื่อให้กราฟสั่งดำเนินการซิงโครนัส Plasm in Ectoคือ DAG และSchedulerทำงานอยู่

ในสถานการณ์อื่นใดที่เราสามารถใช้ประโยชน์จากแนวคิดของ DAG ได้?

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

แม้ว่ามันจะเป็นเวลานาน ... แต่ฉันคิดว่าคำตอบนี้จะช่วยให้ฉันเข้าใจวิญญาณของ ecto จริงๆ ต้องชี้ให้เห็น ขอบคุณ!
Po-Jen Lai

0

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


-1

อีกตัวอย่างหนึ่งคือกฎการจัดการหน่วยความจำในแอพ Cocoa นั้นถูกสร้างขึ้นเพื่อให้การอ้างอิงที่แข็งแกร่งทั้งหมดสร้างกราฟ acyclic โดยตรงเพื่อรับประกันว่าไม่มีรอยรั่ว


-2

การเพิ่มคำตอบอื่นที่ไม่ได้เห็นการอ้างอิงเพื่อสร้างระบบmakeที่ใช้ DAG เพื่อค้นหาการขึ้นต่อกันของการสร้าง

รายละเอียดเพิ่มเติมที่นี่


ฉันพูดอะไรผิดหรือ
เปล่า

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

ตกลงให้ฉันทำอย่างละเอียดในภายหลัง
dlmeetei

ตกลงแทนการทำซ้ำเพียงอัปเดตด้วยลิงก์ที่ให้รายละเอียดว่ามีการใช้งานอย่างไรในเครื่องมือเช่นmake
dlmeetei

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