2013-05-06 2 views
10

에 가장 좋은 나무 같은 DAG을 정의?어떻게 <strong>하스켈</strong> 당신이 (하나 개의 루트로) (문자열)을 <strong>감독 비순환 그래프</strong> (DAG)를 정의하려면 어떻게 하스켈

나는 특히 가능한 한 빨리이 데이터 구조에 다음과 같은 두 가지 기능을 적용해야합니다

  1. 이 (부모 등의 부모 포함) 한 요소의 모든 (직접 및 간접) 조상을 찾아보십시오.
  2. 한 요소의 모든 (직접적인) 하위를 찾으십시오. 각각의 쌍은 그 이름 (String)이 요소 (직접) 부모의 이름을 포함하는 문자열리스트 ([String])으로 이루어진 그래프의 하나 개의 원소이고

[(String,[String])] 생각. 이 구현의 문제점은 두 번째 작업을 수행하는 것이 어렵다는 것입니다.

문자열 목록 ([String])에 (직접) 하위 항목의 이름이 포함되어있는 동안에도 [(String,[String])]을 다시 사용할 수 있습니다. 그러나 여기에서도 다시 첫 번째 작업을 수행하기가 어렵습니다.

어떻게해야합니까? 어떤 대안이 있습니까? 가장 효율적인 방법은 무엇입니까?

편집 : 또 하나의 발언 : 나도 쉽게 정의하고 싶습니다. 이 데이터 형식의 인스턴스를 직접 "손으로"정의해야하므로 불필요한 반복을 피하고 싶습니다.

+2

'data Family = Ego {parents, children :: [String]}; DAG = Map String Family'을 입력하십시오. 부모뿐만 아니라 어린이를 저장하는 경우 두 가지 작업 모두 합리적으로 빠릅니다. –

+1

두 개의지도가 있습니다. 하나는 부모에서 자녀에게, 다른 하나는 어린이에서 부모에게 두 번째입니다. 가장 적합한 방법을 선택하십시오. – Adrian

+0

나는 원래 질문에 덧붙여서 당신의 생각을 어렵게했다. –

답변

2

the tree implementtion in Martin Erwig's Functional Graph Library을 보았습니까? 각 노드는 자식 노드와 부모 노드가 모두 포함 된 컨텍스트로 다시 채워집니다. 이 방법에 액세스하려면 graph 유형 클래스를 참조하십시오. 요청한만큼 쉬운 것은 아니지만 잘 테스트되고 사용하기 쉽도록 이미 이미 있습니다. 나는 큰 프로젝트에서 10 년 이상 그것을 사용 해왔다.

+0

하스켈지도상의 속도에 대한 아이디어가 있습니까? 이 라이브러리를 사용하고 싶지만 그래프는 꽤 큽니다. – Dilawar

관련 문제