2014-07-25 3 views
2

몇백 만 단어를 저장하기 위해 Trie을 만들었습니다.트라이 직렬화

typedef struct trie 
{ 
    struct trie* c[38]; 
    unsigned int occ; 
} trie_t; 

여기서는 occurence의 수를 저장하는 숫자입니다. 0 인 경우 : 노드가 단어가 아닙니다. c [38]은 (는) 26 자 + 10 자 + '_'+ '입니다.

매번 빌드 할 필요없이 메모리에 다시 매핑 할 수 있도록 직렬화하려고합니다. 문제는 mrieoc을 사용하여 Trie를 생성하므로 모든 메모리가 연속적이지 않습니다.

Trie가 연속으로 생성 된 메모리를 강제로 적용하여 포인터를 오프셋으로 대체하고 전체 구조를 serialize 할 수 있습니다.

이것이 올바른 방법인가요? malloc을 사용하여이 작업을 수행 할 수 있습니까? 아니면이 작업을 수행하기 위해 자체 메모리 할당자를 작성해야합니까?

+0

일단이 빌드는 일단 빌드되면 정적입니다 - 업데이트하지 마십시오? –

+0

예. 업데이트가 없습니다. 트라이는 절대 바뀌지 않을 단어 목록에서 만들어집니다. – IggY

+0

다음 빌드하십시오. C 규칙을 "구부릴"가능성이 높고 주소 지정을 수행하는 데 "문서화되지 않은 행위"에 의존해야한다는 것을 이해해야합니다. –

답변

2

구조체의 단일 배열을 할당하고 순서대로 사용하십시오. 당신이 필요로 할 구조체의 총 크기를 모른다면, 배열을 다시 할당하십시오.

마지막 결과는 전체를 가리키는 trie 구조체의 연속 배열입니다.

+0

Hmmm ... 나는 방금 큰 배열을 할당하고,이 배열에있는 정적 int "offset"을 가지고있는 "my_malloc (size)"을 만들고 다음과 같이합니다 : return array [offset]; offset + = size; (+ realloc 항목), 맞습니까? – IggY

+0

기능을 사용하기로 결정한 것과 같습니다. total_size와 current_position의 두 개의 값을 가지며 total_size에 도달하면 realloc합니다. 구조체 배열이 있으므로 크기가 아니라 1 씩 증가합니다. – this

+0

"구조체 배열을 가지고 있기 때문에 크기가 1 씩 증가합니다."나는 항상이 실수를 저질렀습니다. :) – IggY

관련 문제