ตามหารูปแบบข้อมูลที่ขาดหายไป
- กราฟคือชุดของโหนดที่เชื่อมต่อกันด้วยลูกศร (เส้นเชื่อม)
- โหนดและเส้นเชื่อมสามารถเก็บข้อมูลได้
- ในวิศวกรรมซอฟต์แวร์ กราฟปรากฏอยู่ในหลายรูปแบบ เช่น การพึ่งพากันของแพ็กเกจ ลิงก์บนอินเทอร์เน็ต พื้นที่สถานะของซอฟต์แวร์ ฐานข้อมูลเชิงสัมพันธ์ linked list, binary tree, hash table เป็นต้น
- ในตรรกะทางธุรกิจก็ใช้กราฟกับสิ่งต่าง ๆ เช่น การอ้างอิงคำพูด เครือข่ายการจราจร และโซเชียลเน็ตเวิร์ก
- หากทำงานพัฒนาซอฟต์แวร์มานานพอ มีโอกาสสูงที่จะเจอกราฟได้ทุกที่
ข้อกังวลเกี่ยวกับการใช้กราฟ
- กราฟมีประโยชน์ แต่การใช้กราฟในโค้ดจริงนั้นเป็นภาระไม่น้อย
- ภาษากระแสหลักส่วนใหญ่ไม่ได้รองรับกราฟเป็นชนิดข้อมูลในตัว และแม้แต่ใน standard library ก็พบได้ไม่บ่อย รวมถึงไลบรารี third-party ที่แข็งแรงก็มีไม่มาก
- หลายครั้งจึงต้องลงมือสร้างกราฟด้วยตัวเอง
- มีช่องว่างระหว่างความถี่ที่วิศวกรซอฟต์แวร์ต้องใช้กราฟ กับระดับการรองรับในระบบนิเวศการเขียนโปรแกรม
ทำไมจึงไม่มี graph type
ตัวเลือกด้านการออกแบบมีมากเกินไป
- มีกราฟหลายประเภท เช่น กราฟมีทิศทางและไม่มีทิศทาง simple graph, multigraph, hypergraph, ubergraph เป็นต้น
- สำหรับแต่ละประเภท ยังต้องตัดสินใจอีกว่าจะกำหนด ID ให้โหนดและเส้นเชื่อมหรือไม่ รวมถึงจะเก็บข้อมูลแบบใด
- การสร้างไลบรารีกราฟที่สมบูรณ์แบบและรองรับทุกความเป็นไปได้ต้องใช้เวลามหาศาล
- ประสิทธิภาพของอัลกอริทึมกราฟมีความสำคัญมาก และกรณีเฉพาะทางก็สำคัญเช่นกัน
- อัลกอริทึมกราฟเป็นสิ่งที่สร้างให้ถูกต้องได้ยาก
ตัวเลือกด้านการสร้างมีมากเกินไป
- ต่อให้สมมติว่ารองรับเฉพาะกราฟมีทิศทางแบบง่าย ก็ยังมีหลายวิธีในการแทนกราฟภายในระบบ
- มีวิธีเก็บข้อมูลหลากหลาย เช่น edge list, adjacency list, adjacency matrix, ชุดของ struct เป็นต้น
- การดำเนินการกับกราฟแต่ละแบบให้คุณลักษณะด้านประสิทธิภาพต่างกันไปตามวิธีแทนข้อมูล
- ความโปร่งบางหรือความหนาแน่นของกราฟก็ทำให้วิธีแทนกราฟภายในที่เหมาะสมแตกต่างกัน
- การรองรับข้อมูลของโหนด ข้อมูลของเส้นเชื่อม รวมถึงโหนดและเส้นเชื่อมหลายประเภท ยิ่งทำให้ซับซ้อนขึ้น
ประสิทธิภาพสำคัญเกินไป
- อัลกอริทึมกราฟจำนวนมากเป็นปัญหาแบบ NP-complete หรือยากยิ่งกว่านั้น
- กราฟอาจกลายเป็นปัญหาขนาดใหญ่มาก และประสิทธิภาพจะแตกต่างกันมากตามรูปแบบการแทนข้อมูลและรายละเอียดการสร้างอัลกอริทึม
- จึงต้องการการควบคุมอย่างมากทั้งในด้านการแทนข้อมูลและตัวอัลกอริทึม
มุมมองที่เห็นพ้องกัน
- ความหลากหลายของประเภทกราฟ วิธีแทนข้อมูล อัลกอริทึม ความอ่อนไหวต่อประสิทธิภาพ และการรันอัลกอริทึมราคาแพงบนกราฟขนาดใหญ่ ล้วนเป็นเหตุผลที่การรองรับกราฟไม่แพร่หลาย
- สิ่งนี้อธิบายได้ว่าทำไมภาษาโปรแกรมจึงไม่รองรับกราฟใน standard library
- และอธิบายได้ว่าทำไมโปรแกรมเมอร์จึงหลีกเลี่ยงไลบรารีกราฟจาก third-party
- เพราะการใช้กราฟเป็นเรื่องยาก จึงอธิบายได้ว่าทำไมคนส่วนใหญ่ไม่อยากคิดแบบกราฟหากไม่ใช่กรณีสุดโต่งจริง ๆ
ความเห็นของ GN⁺
- บทความนี้ให้มุมมองว่าเหตุใดกราฟจึงยังไม่กลายเป็นชนิดข้อมูลพื้นฐานในภาษาโปรแกรมและไลบรารี
- graph theory เป็นสาขาสำคัญของวิทยาการคอมพิวเตอร์ และถูกประยุกต์ใช้ในหลายด้าน เช่น อัลกอริทึม การวิเคราะห์เครือข่าย และฐานข้อมูล
- หากต้องการใช้กราฟอย่างมีประสิทธิภาพ การปรับแต่งประสิทธิภาพและการเลือกโครงสร้างข้อมูลที่เหมาะสมเป็นสิ่งสำคัญ
- ไลบรารี third-party ที่ใช้ได้ เช่น NetworkX, Boost Graph Library และ Graph-tool ซึ่งช่วยแก้ปัญหากราฟได้หลากหลายรูปแบบ
- เมื่อใช้กราฟ การเลือกประเภทกราฟและอัลกอริทึมให้สอดคล้องกับลักษณะของปัญหาเป็นสิ่งสำคัญ และเชื่อมโยงโดยตรงกับประสิทธิภาพของระบบ
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
Graphviz มีไลบรารีกราฟของตัวเอง ซึ่งไม่ได้ถูกใช้งานในโปรเจ็กต์อื่น และไลบรารีนี้ก็มีทั้งข้อดีและข้อเสีย
หากคุณเขียนโค้ดบน .NET อยากแนะนำให้ลองใช้ไลบรารีกราฟ Arborescence ซึ่งมีขนาดเล็กและฟีเจอร์ไม่มากนัก
กราฟไม่ใช่ data structure หรือ data type แต่เป็น abstraction
มีคนถามบ่อยมากว่าทำไมจึงไม่มี data type สำหรับกราฟที่ฝังมากับภาษาโปรแกรมมิง
อุปสรรคหลักมีดังนี้:
บทความนี้ตอบคำถามได้เป็นส่วนใหญ่ว่าทำไมในภาษาโปรแกรมมิงจึงยังไม่รองรับ algorithm ของกราฟได้ดีกว่านี้
เครื่องมือสำหรับวาดกราฟก็น่าผิดหวังมากเช่นกัน
บทความนี้ยอดเยี่ยมจริงๆ
Electric Clojure ใช้ Clojure เอง (s-expression) เป็นไวยากรณ์สำหรับการสร้างกราฟ
ยังมี data type ที่มีประโยชน์อีกแบบหนึ่งคือ table (เช่น table ในฐานข้อมูล)