Khi nào nên sử dụng DAG (Directed Acyclic Graph) trong lập trình?


37

Gần đây tôi đã tìm thấy một khung có tên ecto .

Trong khung này, một thành phần cơ bản có tên là "plasm" , đó là biểu đồ Acyclic Directed Acyclic. Trong ecto, plasm có thể được vận hành bởi bộ lập lịch ecto.

Tôi tự hỏi lợi thế của cơ chế này là gì, và trong những tình huống khác chúng ta có thể khai thác khái niệm DAG?


6
Hầu hết các Hệ thống quản lý kiểm soát nguồn thực hiện các sửa đổi dưới dạng DAG.
Oded

1
Lập kế hoạch là một nhánh của các vấn đề liên quan đến DAG rất nhiều .
TC1

1
Nhiều thứ được biểu diễn dưới dạng cây, thực sự nên được biểu diễn dưới dạng DAG khi ghi nhớ các trường hợp cạnh lạ nhưng vẫn còn hơi phổ biến.
Joachim Sauer

@JoachimSauer ví dụ: hệ thống tệp có liên kết cứng
jk.

Câu trả lời:


29

Câu hỏi hay.

  • Mã có thể được biểu thị bằng một DAG mô tả các đầu vào và đầu ra của từng hoạt động số học được thực hiện trong mã; biểu diễn này cho phép trình biên dịch thực hiện loại bỏ phổ biến phụ một cách hiệu quả.
  • Hầu hết các Hệ thống quản lý kiểm soát nguồn thực hiện các sửa đổi dưới dạng DAG.
  • Một số ngôn ngữ lập trình mô tả các hệ thống các giá trị có liên quan với nhau bằng biểu đồ chu kỳ có hướng. Khi một giá trị thay đổi, người kế thừa của nó được tính toán lại; mỗi giá trị được đánh giá là một hàm của các tiền thân của nó trong DAG.
  • DAG rất hữu ích trong việc phát hiện các bế tắc vì chúng minh họa các phụ thuộc giữa một tập hợp các quy trình và tài nguyên.
  • Trong nhiều thuật toán ngẫu nhiên trong hình học tính toán, thuật toán duy trì một DAG lịch sử đại diện cho các tính năng của một số cấu trúc hình học đã được thay thế bằng các tính năng tỷ lệ tốt hơn sau này; truy vấn vị trí điểm có thể được trả lời, như đối với hai cấu trúc dữ liệu ở trên, bằng cách theo các đường dẫn trong DAG này.
  • Khi chúng ta có DAG trong bộ nhớ, chúng ta có thể viết các thuật toán để tính thời gian thực hiện tối đa của toàn bộ tập hợp.
  • Trong khi lập trình hệ thống bảng tính, biểu đồ phụ thuộc kết nối một ô với ô khác nếu ô thứ nhất lưu trữ công thức sử dụng giá trị trong ô thứ hai phải là biểu đồ chu kỳ có hướng. Chu kỳ của các phụ thuộc không được phép vì chúng làm cho các ô tham gia vào chu trình không có giá trị được xác định rõ. Ngoài ra, việc yêu cầu các phụ thuộc phải theo chu kỳ cho phép sử dụng thứ tự tôpô để lên lịch tính toán lại các giá trị ô khi bảng tính được thay đổi.
  • Sử dụng DAG chúng ta có thể viết các thuật toán để đánh giá các tính toán theo đúng thứ tự.

CHỈNH SỬA :

  • Thứ tự đánh giá ô công thức khi tính toán lại các giá trị công thức trong bảng tính có thể được thực hiện bằng DAG
  • Git sử dụng DAG để lưu trữ nội dung, con trỏ tham chiếu cho các đầu, biểu diễn mô hình đối tượng và giao thức từ xa.
  • DAG được sử dụng trong lập kế hoạch theo dõi: cách tiếp cận thực tế đầu tiên để lập lịch toàn cầu, lập lịch theo dõi cố gắng tối ưu hóa đường dẫn luồng điều khiển được thực hiện thường xuyên nhất.
  • Ecto là một khung xử lý và nó sử dụng DAG để mô hình hóa các biểu đồ xử lý sao cho các biểu đồ thực hiện theo thứ tự thực hiện đồng bộ. Plasm trong Ecto là DAG và Trình lập lịch biểu hoạt động trên nó.
  • DAG được sử dụng tại đường ống phần mềm, đây là một kỹ thuật được sử dụng để tối ưu hóa các vòng lặp, theo cách tương đồng với đường ống phần cứng.

Tài nguyên tốt:


1
Không có vòng lặp? Tôi nghĩ rằng miễn là một vòng lặp chấm dứt, nó sẽ đủ điều kiện. Thay vì là A -> B -> C, nó có thể đi A -> B -> A1 -> B1 -> A2 -> B2 -> C. Chu kỳ theo một nghĩa, nhưng không theo nghĩa khác. Giống như một hình xoắn ốc hơn là một vòng tròn.
GlenPeterson

@GlenPeterson, Có bạn đúng. Tôi đã chỉnh sửa câu trả lời của tôi. Cảm ơn vì đã bình luận. :)
Md Mahbubur Rahman

Vẫn không nghĩ rằng "Đường thẳng" là cần thiết. 'G' trong DAG là viết tắt của đồ thị. Kiểm tra câu trả lời của tôi dưới đây. Xin lỗi tôi đã không đọc kỹ của bạn đủ trước khi trả lời, nhưng tôi đã +1 câu trả lời của bạn cho sự hoàn chỉnh và mức độ giác ngộ của bạn.
GlenPeterson

@GlenPeterson, Xin lỗi vì nhầm lẫn. Tôi đã cập nhật câu trả lời của tôi. Tôi cũng thích câu trả lời của bạn. Vì vậy, thực hiện +1 cho câu trả lời của bạn.
Md Mahbubur Rahman

3
Cảm ơn vì +1 của bạn. Tôi vẫn nghĩ rằng tất cả các mã là DAG, không giới hạn ở các biểu thức số học. I / O, ngoại lệ, tương tác nhiều quá trình và ngắt phần cứng đều chỉ là các nút bắt đầu hoặc kết thúc khác trong Chỉ thị (vì chúng là bắt đầu hoặc kết thúc), Acyclic (không có vòng lặp vô hạn) Biểu đồ (tập hợp hữu hạn của các cặp nút theo thứ tự) . Một câu hỏi tiếp theo thú vị cho câu hỏi của Ricky có thể là "Có mã chính xác và hoạt động không phải là DAG không." Tôi nghĩ câu trả lời là "Không", nhưng sẽ rất vui khi có ai đó chứng minh tôi sai.
GlenPeterson

12

Câu trả lời là nó không liên quan gì đến lập trình. Nó phải làm với việc giải quyết vấn đề.

Giống như danh sách liên kết là các cấu trúc dữ liệu được sử dụng cho một số loại vấn đề nhất định, biểu đồ rất hữu ích để thể hiện các mối quan hệ nhất định. Danh sách được liên kết, cây, biểu đồ và các cấu trúc trừu tượng khác chỉ có kết nối với lập trình để bạn có thể triển khai chúng theo mã. Chúng tồn tại ở mức độ trừu tượng cao hơn. Đó không phải là về lập trình, mà là về việc áp dụng các cấu trúc dữ liệu trong giải pháp cho các vấn đề.

Nếu bạn vẫn muốn có một số mối quan hệ với lập trình thì hãy xem xét các điểm sau:

  • DAG (được gọi là Wait-For-Graphs - chi tiết kỹ thuật hơn ) rất hữu ích trong việc phát hiện các bế tắc vì chúng minh họa các phụ thuộc giữa một tập hợp các quy trình và tài nguyên (cả hai đều là các nút trong DAG). Bế tắc sẽ xảy ra khi một chu kỳ được phát hiện.
  • Khi bạn có DAG trong bộ nhớ, bạn có thể viết thuật toán vào:
    • đảm bảo các tính toán được đánh giá theo đúng thứ tự ( sắp xếp theo cấu trúc liên kết )
    • nếu việc tính toán có thể được thực hiện song song nhưng mỗi lần tính toán có thời gian thực hiện tối đa, bạn có thể tính thời gian thực hiện tối đa của toàn bộ tập hợp

1
Để một lần nữa cho thấy cách vượt ra ngoài phạm vi lập trình một mình, hãy nghĩ về cách bạn quét bảng trong cơ sở dữ liệu quan hệ để phân tích một cách tinh thần độ dài của đường dẫn từ bảng này sang bảng khác, điều này tương đương với việc sử dụng DAG về mặt tinh thần để xác định hiệu suất của mô hình dữ liệu của bạn
Jimmy Hoffa

6

Những người khác đã áp dụng DAG cho dữ liệu, nhưng tôi nghĩ rằng nó ít nhất là có thể áp dụng (nếu không muốn nói là như vậy) cho mã. Mahbubur R Aaman đề cập đến điều này, vì vậy thực sự đây là phần phụ lục cho câu trả lời của anh ta hơn là một câu trả lời hoàn chỉnh.

Nó xảy ra với tôi hơn bất kỳ chương trình máy tính bắt buộc nào không có vòng lặp vô hạn (cảm ơn @AndresF.) Là một đồ thị theo chu kỳ có hướng (DAG). Có nghĩa là các đường dẫn thực thi mã có thể được định hướng (đầu tiên là sau đó) và theo chu kỳ (không tạo thành các vòng lặp vô hạn). Chúng là một biểu đồ vì đường dẫn qua bất kỳ mã quan trọng nào hiếm khi đơn giản như một danh sách hoặc một cây.

Tôi đã làm việc trong XSLT được khoảng 4 năm. Tôi đã có một thời gian khủng khiếp khi cố gắng giải thích tại sao nó không phải là một ngôn ngữ lập trình mục đích chung tốt, nhưng DAG là lý do. Cụ thể, XSLT là ngôn ngữ điều khiển dữ liệu. Bạn xác định các hàm (có, theo nghĩa lập trình hàm) nhưng bạn không nhất thiết phải gọi các hàm này từ mã của mình. Thay vào đó, XSLT thiết lập một sự kết hợp của lựa chọn và lặp qua các nút của một tài liệu XML đầu vào. Điều này cho phép cấu trúc của dữ liệu đầu vào xác định chức năng nào được gọi và theo thứ tự nào.

Điều này rất thú vị và rất tuyệt vời cho đến khi chương trình của bạn gặp phải tình trạng dữ liệu mà bạn không kiểm tra vào lúc 2:30 sáng và bạn phải thức dậy và sửa nó. Khi bạn để dữ liệu xác định DAG, thì định nghĩa của DAG sẽ trở thành tất cả các điều kiện đầu vào có thể - điều mà đối với bất kỳ ứng dụng kinh doanh không tầm thường nào là vượt quá; họ không thể tưởng tượng được.

Lúc đầu, tôi nghĩ rằng lập trình chức năng có thể không phải là DAG vì thứ tự thực thi đôi khi không rõ ràng hoặc thậm chí là do người lập trình nghĩ. Nhưng một chương trình chức năng không xác định phụ thuộc. Trong thực tế, bản chất khai báo của lập trình chức năng có thể được coi là chỉ xác định các phụ thuộc (a ^ 2 = b ^ 2 + c ^ 2) mà không chỉ định thứ tự thực hiện (không quan trọng là 'b' hay 'c' được bình phương trước , miễn là cả hai đều bình phương trước khi được thêm vào với nhau).

Nhưng trong khi lập trình Chức năng có thể mơ hồ về thứ tự các hoạt động ở mức chi tiết, thì rõ ràng là rất rõ ràng về các phụ thuộc. Đây là những tính năng rất phù hợp với sự đồng nhất. Trong mọi trường hợp, vẫn còn một biểu đồ đường dẫn thông qua mã và biểu đồ đó vẫn được định hướng (phải phụ thuộc vào các nhiệm vụ phụ thuộc), vì vậy tôi nghĩ DAG cũng áp dụng ở đó.

Câu hỏi hay - cảm ơn bạn đã đăng bài!


1
Theo bạn, chương trình bắt buộc này có phải là một DAG while (true) { print("hi"); }không? Có lẽ bạn muốn loại trừ các chương trình không kết thúc?
Andres F.

5

Hiện tại DAG bị đánh giá thấp trong lập trình. Trong lịch sử, nhiều thứ liên quan đến sự phát triển được tạo ra bằng cây và hệ thống phân cấp vì việc di chuyển thứ gì đó trong hộp thuận tiện cho não của chúng ta để làm cho những thứ phức tạp dễ quản lý hơn. Nhưng nếu bạn nhìn vào các sự kiện và cách chúng phụ thuộc vào các sự kiện và trạng thái khác thì bạn sẽ nhận được DAG bởi vì mọi thứ trong cuộc sống của chúng ta và trong chương trình có thể phụ thuộc vào bất cứ điều gì trong quá khứ nhưng không phải trong tương lai, vì vậy bạn sẽ hoàn toàn "chu đáo" quan hệ được áp dụng cho khái niệm DAG. Mặc dù điều này hiếm khi được sử dụng rõ ràng trong phát triển, nhưng có ý nghĩ này sẽ giúp hiểu rõ hơn về mọi thứ


2

Tôi đang tự hỏi lợi thế của Plasm trong Ecto là gì ...

DAG có thể được sử dụng để mô hình hóa một tập hợp các nhiệm vụ theo trình tự với ràng buộc là các nhiệm vụ nhất định phải được thực hiện trước các nhiệm vụ khác. Ecto là một khung xử lý và nó sử dụng DAG để mô hình hóa các biểu đồ xử lý sao cho các biểu đồ thực hiện theo thứ tự thực hiện đồng bộ. Tiếng rào rào trong Ecto là DAG và Scheduler hoạt động trên đó.

trong những tình huống khác chúng ta có thể khai thác khái niệm về DAG?

  • DAWG là một cấu trúc dữ liệu đại diện cho một chuỗi các chuỗi và cho phép một hoạt động truy vấn kiểm tra xem một chuỗi đã cho có thuộc về bộ theo thời gian tỷ lệ thuận với độ dài của nó hay không.
  • Git sử dụng DAG để lưu trữ nội dung, con trỏ tham chiếu cho các đầu, biểu diễn mô hình đối tượng và giao thức từ xa.

Mặc dù đã lâu rồi ... nhưng tôi nghĩ câu trả lời này thực sự giúp tôi hiểu được tinh thần của ecto. Phải chỉ ra điều đó. Cảm ơn!
Po-Jen Lai

0

Như một ví dụ trong thế giới thực, phần mềm của chúng tôi tương tự như IDE nơi người dùng cuối có thể xác định một loạt các thao tác sẽ được thực hiện trên một hình ảnh (kiểm tra thị giác máy). Những cuộc kiểm tra này có thể có sự phụ thuộc vào những cuộc kiểm tra khác hoặc có thể có những cuộc kiểm tra phụ thuộc vào họ. Vì đây là tất cả cấu hình của người dùng cuối, chúng tôi không thể tối ưu hóa để xử lý song song tại thời điểm thiết kế. Bằng cách thể hiện các kiểm tra và phụ thuộc này dưới dạng DAG, chúng ta có thể tối ưu hóa tính song song của kiểm tra tổng thể để đạt hiệu suất tối đa trong thời gian chạy.


-1

Chỉ cho một ví dụ khác, các quy tắc quản lý bộ nhớ trong ứng dụng Cacao được tạo ra sao cho tất cả các tham chiếu mạnh tạo thành một biểu đồ chu kỳ có hướng, được thực hiện để đảm bảo không có rò rỉ.


-2

Thêm một câu trả lời khác vì chưa thấy một tài liệu tham khảo để xây dựng các hệ thống makesử dụng DAG để tìm ra các phụ thuộc để xây dựng.

Thêm chi tiết tại đây


Tôi có nói gì sai không, Tại sao nó bị hạ cấp
dlmeetei 2/2/2016

Bạn đã trả lời một câu hỏi khá cũ với một câu trả lời khá kém. Nếu bạn muốn viết một câu trả lời là "thêm câu này vì không ai khác đề cập đến nó ..." và chỉ có một câu duy nhất, thì đó không phải là một câu trả lời hay. Vui lòng cố gắng trả lời đầy đủ câu hỏi và giải thích cách ứng dụng sử dụng DAG và cách thiết kế này hoạt động và lý do tại sao điều đó được chọn so với các tùy chọn khác. Lý tưởng nhất, một số đoạn có giá trị nội dung.

Ok, hãy để tôi giải thích nó sau
dlmeetei 2/2/2016

Ok, thay vì lặp lại, Chỉ cần cập nhật với một liên kết chi tiết cách sử dụng nó trong các công cụ nhưmake
dlmeetei

Liên kết có một thói quen khó chịu đi lạc hoặc thất bại. Nếu điều đó xảy ra, bạn quay lại ngay nơi bạn bắt đầu - một câu trả lời ngắn gọn không giúp ích nhiều. Bạn có thể tóm tắt nội dung của liên kết để câu trả lời này có thể tự đứng vững không? (Giữ liên kết, chỉ cần đảm bảo câu trả lời là tốt ngay cả khi không có liên kết).
Dan Pichelman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.