เมื่อใดที่คำ adjacency หรือ matrices เป็นตัวเลือกที่ดีกว่า


15

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

ขอบคุณล่วงหน้า!


1
ที่เกี่ยวข้อง: stackoverflow.com/a/2218331/5746050และstackoverflow.com/a/5419933/5746050
ryan

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

@ ราฟาเอลคุณสามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับข้อควรพิจารณาอื่น ๆ ได้ไหม?
user21312

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

เพื่อจุดประสงค์ของคุณเราอาจไม่สนใจคำจำกัดความของ 'เบาบาง' และ 'หนาแน่น' เพียงวางโมเดลความซับซ้อนของเวลาของการดำเนินการกับเมทริกซ์ที่คุณต้องการใช้สำหรับโครงสร้างข้อมูลแต่ละประเภทและดูว่า 'จุดพักของความหนาแน่น' อยู่ที่ไหน ฉันคิดว่าลิงค์ที่สองโดย @ryan กำลังพยายามทำสิ่งที่คล้ายกัน
อภิวัฒน์จันทวิบูลย์

คำตอบ:


17

ก่อนอื่นให้ทราบว่ากระจัดกระจายหมายความว่าคุณมีขอบน้อยมากและหนาแน่นหมายถึงขอบจำนวนมากหรือกราฟเกือบสมบูรณ์ ในกราฟที่สมบูรณ์คุณมีขอบโดยที่คือจำนวนโหนดn(n1)/2n

ตอนนี้เมื่อเราใช้การแทนเมทริกซ์เราจะจัดสรร matrix เพื่อเก็บข้อมูลการเชื่อมต่อโหนดเช่นหากมีขอบระหว่างโหนดและมิฉะนั้น0 แต่ถ้าเราใช้รายการ adjacency เราจะมีอาร์เรย์ของโหนดและแต่ละโหนดจะชี้ไปที่รายการ adjacency ที่มีเฉพาะโหนดที่อยู่ใกล้เคียงเท่านั้นn×nM[i][j]=1ijM[i][j]=0

ทีนี้ถ้ากราฟกระจัดกระจายและเราใช้การแทนเมทริกซ์แล้วเมทริกซ์เซลล์ส่วนใหญ่ยังไม่ได้ใช้ซึ่งนำไปสู่การสูญเสียความทรงจำ ดังนั้นเรามักจะไม่ใช้การแทนเมทริกซ์สำหรับกราฟกระจาย เราชอบรายการคำคุณศัพท์

แต่ถ้ากราฟมีความหนาแน่นจำนวนของขอบจะใกล้เคียงกับ (สมบูรณ์)หรือถึงหากกราฟกำกับด้วยลูป ดังนั้นจึงไม่มีความได้เปรียบในการใช้รายการ adjacency มากกว่า matrixn(n1)/2n2

ในแง่ของความซับซ้อนของพื้นที่
เมทริกซ์ Adjacency: รายการ Adjacency: โดยที่คือจำนวนโหนดโหนดคือจำนวนขอบO(n2)
O(n+m)
nm

เมื่อกราฟเป็นต้นไม้ที่ไม่ได้บอกทิศทางดังนั้น
Adjacency matrix: รายการ Adjacency:คือ (ดีกว่า )O ( n + n ) O ( n ) n 2O(n2)
O(n+n)O(n)n2

เมื่อกราฟถูกชี้นำให้สมบูรณ์โดยมีการวนรอบตัวเองแล้ว
Adjacency matrix: รายการ Adjacency:คือ (ไม่แตกต่างกัน)O ( n + n 2 ) O ( n 2 )O(n2)
O(n+n2)O(n2)

และในที่สุดเมื่อคุณใช้เมทริกซ์โดยใช้การตรวจสอบหากมีขอบระหว่างสองโหนดใช้เวลาครั้งในขณะที่มีรายชื่อถ้อยคำมันอาจจะใช้เวลาในการเชิงเส้นnnO(1)n


"ในขณะที่มีรายการ adjacency อาจใช้เวลาเชิงเส้น" - เนื่องจากรายการ adjacency ของคุณ (อาจ) ไม่มีลำดับตามธรรมชาติทำไมมันถึงเป็นรายการแทนที่จะเป็นชุดแฮช
Kevin

1
@ เควินจากนั้นจะเรียกว่า "แฮ็ adjacency" แทนที่จะเป็น "list" เป็นไปได้ทำไมไม่ แต่ถ้าคุณเพียงแค่ทำ DFS หรือ BFS หรือโพรซีเดอร์อื่นที่สแกนโหนดทั้งหมดอย่างเป็นระบบดังนั้นอะไรคือข้อดีของการใช้แฮชเหนือรายการ ไม่ว่าในกรณีใดคุณจะตรวจสอบโหนดที่อยู่ติดกันทั้งหมด
fade2black

3
ฉันจะเพิ่มว่าในกรณีที่ไม่ได้บอกทิศทางแบบไม่มีน้ำหนักสำหรับกราฟที่เกือบจะสมบูรณ์มันอาจเป็นไปได้มากกว่าที่จะเก็บส่วนประกอบของมันเช่นกราฟที่กระจัดกระจาย เมทริกซ์จึงมีประโยชน์เมื่อประมาณครึ่งหนึ่งของขอบมีอยู่
M. Winter

3

คำตอบโดยการเปรียบเทียบง่ายๆ .. ถ้าคุณต้องเก็บน้ำ 6 ออนซ์คุณ (พูดโดยทั่วไป) ทำกับภาชนะ 5 แกลลอนหรือถ้วย 8 ออนซ์หรือไม่

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

เหตุผลที่อยู่เบื้องหลัง list vs matrix นั้นง่ายมากในกรณีนี้

PS รายการเป็นแค่เมทริกซ์คอลัมน์เดียว !!! (พยายามแสดงให้คุณเห็นว่าการตัดสินใจ / สถานการณ์เป็นไปโดยพลการ)


2

พิจารณากราฟที่มี nodes และ edge ไม่สนใจคำสั่งต่ำสุดเมทริกซ์บิตสำหรับกราฟจะใช้บิตไม่ว่าจะมีขอบจำนวนเท่าใดE N 2NEN2

อย่างไรก็ตามคุณต้องการบิตจำนวนเท่าใด

สมมติว่าขอบมีความเป็นอิสระจำนวนกราฟกับโหนดและขอบเป็นE} จำนวนขั้นต่ำของบิตที่จำเป็นในการเก็บเซตนี้เป็นE}ENE(N2E)log2(N2E)

เราจะสมมติโดยไม่มีการสูญเสียความเห็นที่นั่นคือครึ่งหนึ่งหรือน้อยกว่านั้นมีอยู่ หากไม่เป็นเช่นนั้นเราสามารถจัดเก็บชุดของ "non-edge" แทนEN22

ถ้า ,ดังนั้นการแทนเมทริกซ์จึงเหมาะสมที่สุด หากใช้การประมาณของ Stirling และเลขคณิตเล็กน้อยเราจะพบ:E=N22log2(N2E)=N2+o(N2)EN2

log2(N2E)
=log2(N2)!E!(N2E)!
=2Elog2N+O(low order terms)

หากคุณพิจารณาว่าคือขนาดของจำนวนเต็มซึ่งสามารถแทนค่าดัชนีโหนดการแทนค่าที่ดีที่สุดคืออาร์เรย์ของรหัสโหนดนั่นคืออาร์เรย์ของดัชนีโหนดคู่log2N2E

ต้องบอกว่าการวัดที่ดีของ sparsity คือเอนโทรปีซึ่งเป็นจำนวนบิตต่อขอบของการแสดงที่ดีที่สุด ถ้าคือน่าจะเป็นที่ขอบเป็นปัจจุบันเอนโทรปีคือ(1-P)} สำหรับ , เอนโทรปีคือ 2 (เช่นสองบิตต่อขอบในการแสดงที่ดีที่สุด) และกราฟมีความหนาแน่น ถ้าเอนโทรปีมีค่ามากกว่า 2 อย่างมีนัยสำคัญและโดยเฉพาะอย่างยิ่งถ้ามันใกล้เคียงกับขนาดของตัวชี้กราฟจะกระจัดกระจายp=EN2log2p(1p)p12

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