2010-03-02 3 views
1

Ive는 데이터를 가지고 있습니다 (데이터를 실제로 풀 때까지 존재하지는 않습니다 ...). 내 프로그램 내에서 조작 할 수 있어야합니다. 그러나 이것을 저장하기에 적합한 구조를 찾을 수 없습니다.이 "트리"데이터를 나타내는 방법은 무엇입니까?

데이터는 경로와 노드 집합을 나타냅니다. 하나의 입력 (경우에 따라서는 존재하지 않을 수 있음)이 있고 출력으로 끝나는 노드 사이에 여러 경로가 있습니다 (끝에는 출력이 없지만 출력은 항상 끝에 있음). 각 입력, 노드 및 출력에는 위치가 있으며 전체적으로 데이터를 그래픽으로 조작 할 수 있으므로 사용하는 구조가 무엇이든간에 예측할 수없는 방식으로 런타임시 내용을 쉽게 변경할 수 있어야합니다 (예 : 입력을 출력으로 변경하는 등). 다른 출력을 입력으로 만든다).

내가 각 항목 (루트 제외) 부모가 있었다 트리 구조와 자녀의 수, 예를 들면 등을 이용하여 고려

: 나는 경우 등이 등으로 문제의 수를 볼 수 있습니다 그러나

Input 
| 
node--- 
| | | 
| | Output 
| | 
| Node---Output 
| |---Output 
| 
Node----Node 
|  | 
Node  Output  

가 입력이 없거나 제거/변경됨/etc ...

이것은 시각적 인 예입니다. >는 입력 O 노드 및 [] 출력입니다. 나무는 사실에 적합한 경우 이미

을 언급 같은 트리 구조를 사용하여 제안
http://unisonmodules.co.uk/wjnewbery/data.png

@Everyone, 내가 문제를 극복 어떻게 주어진 데이터 세트도/입력을하지 않는 경우 뿌리가 아래처럼 말하라. 그러면 어떻게됩니까? 입력 노드/포인트/변경 사항 (제거 후 추가)을 사용하면 트리를 완전히 재구성해야합니까? 어떻게해야합니까?

http://unisonmodules.co.uk/wjnewbery/data2.png

나는 그래프를 살펴 보겠습니다.

+0

왜 나무가 아닌가요? –

+0

'tree'가 충분히 유연하지 않다고 생각하면'graph'를 시도해 볼 수 있습니다 : http://en.wikipedia.org/wiki/Graph_%28data_structure%29 –

답변

2

나무보다 더 많은 자유형 구조가 필요합니다. 각 노드에는 여러 개의 노드가 연결될 수 있습니다. 각 연결에는 방향이 있습니다. 모든 노드에는 입력 또는 출력이 첨부 될 수 있습니다. 순환 연결을 수행하지 않고 하나의 입력 만 트리 만들기 및 업데이트시에 따라 달라질 수 있습니다.

구조는 다중 연결리스트와 같이 갈 수 있습니다 :

  struct Node { 
       NodeContentType type; //Input, Output, None. 
       InOutNode* content; //pointer to input or output 
       Link* links;   //pointer to first connection (if any), NULL if none. 
      } 

      struct Link { 
       Node* node; //node this connection links to. 
       Link* next; //pointer to next connection 
      } 

예 나무 :

INPUT 
| 
root 
| 
branch1---leaf2---output2 
| 
leaf1 
| 
output1 

이 같이 갈 수 : (순서는 분명히 잘못된 것입니다 ...)

  Node root = { Input, &input_function, &link1 }; 
      Link link1 = { &branch1, NULL }; 
      Node branch1 = { None, NULL, &link2 }; 
      Link link2 = { &leaf1, &link3 }; 
      Link link3 = { &leaf2, NULL }; 
      Node leaf1 = { Output, &output_function1, NULL }; 
      Node leaf2 = { Output, &output_function2, NULL }; 
0

는이 같은 클래스를 만들 수 있습니다

enum NodeType 
{ Node, Output }; 

class TreeElement 
{ 
    NodeType myType; 
    union 
    { 
    Node myNode; 
    Output myOutput; 
    } NodeVariant; 
}; 

NodeOutput 클래스 업체에서 가져옵니다. 차이점은 Node 클래스에 TreeElement 인스턴스 목록을 포함 할 수 있다는 것입니다. 이 목록은 요소의 자식을 나타냅니다.

0

Composite pattern은 여기에서 매우 유용 할 수 있습니다. 출력 또는 노드 오브젝트를 다시 보유하는 일종의 컨테이너로 노드를 구현할 수 있습니다. 링크에서 구현 힌트로 더 많은 코드 스 니펫을 볼 수 있습니다.

0

값과 형제 배열이있는 노드 클래스를 만듭니다. 형제 배열은 값 노드 인 경우 비어있을 수 있습니다. 값은 null 일 수 있습니다.이 경우는 접합입니다.

관련 문제