2012-03-12 3 views
1

У меня есть назначение, где у меня есть дерево, где все родительские узлы содержат ответы «да» или «нет», а листовые узлы содержат ответ. На родительский узел есть двое детей, узел да и узел. Это дерево необходимо сериализовать и сохранить в файле через RandomAccessFile, чтобы все дерево не записывалось в файл каждый раз. Если листовой узел не содержит ответа, который пользователь ищет, пользователь отправляет новый ответ и вопрос, чтобы различать ответ листа и ответ, о котором он думал. Затем этот лист становится родителем с собственным вопросом и двумя дочерними узлами «да» и узлом «нет» (эти два узла являются новыми листьями). Этот процесс вызывает у меня проблемы, потому что если лист уже записан в файл, как я могу перезаписать лист, не проливая его на данные другого узла (поскольку размер байта листового узла изменяется, когда он становится родителем). Обратите внимание, что программа может быть убита в любое время, и ее древовидная структура все равно останется неповрежденной. БлагодаряСериализовать дерево и сохранить в RandomAccessFile

ответ

3

имея процесс записи в файл, имея в виду, что этот процесс может быть убит в любое время ... -> ведения журналов

размер в байтах узла изменяется, когда он становится родителем? давайте посмотрим ...

родительский узел имеет вопрос (ссылка на строку)
родительский узел имеет узел да (ссылка на узел)
родительский узел имеет не узел (ссылка на узел)

узел лист имеет ответ (ссылка на строку)
узел листа может иметь 2 неиспользуемые ссылки на другие узлы ...

поэтому узел имеет ссылку строки и 2 ссылки на узлы .. .

, если оба узла refs являются NULL, это листовой узел, а строка ref является ответом ... else это родительский узел, а строка ref - вопрос ...

, когда вы сериализуете это в файл:

вы знаете, узел имеет фиксированную длину: 3 указатели (ссылки)
так что ваша новая эталонная строка будет текущая позиция + 3 указателя длины
написать этот адрес в качестве строки реф ...
написать 2 нулевые ссылки на теперь ... (мы пока не знаем, где будут записываться эти узлы)
написать строку

траверс свое дерево и иметь в виду, что вы должны обновить ссылки узла пропускаются 2, когда вы знаете положение узла в файле ...

при обновлении узла (лист становится родителем):

напишите новую строку вопроса в файл и сохраните ее адрес
сохраните адрес текущей строки ответа ...
замените ссылку на строку в старом узле на новый адрес строки вопросов
напишите новый узел для старого ответа (строка ref - это сохраненный адрес для текущего ответа) и обновите один из старых узлов-ссылок (да или нет, соответственно)
написать новый узел для другого ответа (ссылка строка может храниться 3 указателей позже, поэтому адрес известен)
записать новое ответить
снабжать струной, тетивой и т.п. обновление ссылок на старые узлы другого узла

Смежные вопросы