Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2010, 11:47   #1
Katya3636
 
Аватар для Katya3636
 
Регистрация: 23.05.2010
Сообщений: 9
Вопрос Trie-деревья. Удаление из дерева слов.

Условие: Из Trie-дерева удалить все слова, которые содержат заданную букву

Все вспомогательные процедуры (создание, очистка, печать) я написала.
Процедуру удаления слов, удовлетворяющих условию, я тоже написала. Внутри этой процедуры вызывается функция типа boolean, которая собственно и проверяет: содержит ли дерево заданную букву . Вот с этой функцией у меня и возникла проблема . Прошу помощи в её написании. Пожалуйста!
Вот существующий код, лишь без одной функции:

Код:
unit UTrieTrees;

interface

type
   TIndex= 'a'..'z';
   TTrie= ^TNode;
   TNode= record
       ok: boolean;
       nexts  array [TIndex] of TTrie;
   end;


function NewNode : TTrie;  // создание нового узла
procedure Add (var t : TTrie; wrd : string);  // добавление элемента
function IsEmptyNode (t : TTrie) : boolean; // проверка на пустоту
procedure ClearTrie (var t : TTrie); // очистка дерева
procedure PrintTrie(t : TTrie; wrd : string); // печать дерева
function CorrectWord (wrd : string) : boolean;
procedure mainAdd (var Root : TTrie; wrd : string);
procedure deletWords (var t:ttrie; wrd:string); //удаление слов,удовл-х условию
function chekWord(wrd:string: boolean; //содержит ли дерево заданную букву

implementation

function NewNode : TTrie;  // создание нового узла
  var i : TIndex;
begin
   new(result);
   result^.ok:= false;
   for i:= 'a' to 'z' do
     result^.nexts[i]:=nil;
end;

procedure Add (var t : TTrie; wrd : string);  // добавление элемента
begin
  if t = nil then
    t:=NewNode;
  if wrd = '' then
    t^.ok:=true
  else
    Add (t^.nexts[wrd[1]], Copy(wrd, 2, length(wrd)-1));
end;

function IsEmptyNode (t : TTrie) : boolean; // проверка на пустоту
  var ch : TIndex;
begin
  ch:='a';
  result:= (not t^.ok) and (t^.nexts[ch] = nil);
  if result then
    repeat
      ch:=succ(ch);
      result:=t^.nexts[ch] = nil;
    until (ch = 'z') or not Result;
end;

procedure ClearTrie (var t : TTrie); // очистка дерева
  var ch : TIndex;
begin
  if t <> nil then
    begin
      for ch:= 'a' to 'z' do
        ClearTrie(t^.nexts[ch]);
      dispose(t);
      t:=nil;
    end;
end;

procedure PrintTrie(t : TTrie; wrd : string); // печать дерева
  var ch : TIndex;
begin
  if t <> nil then
    begin
      if t^.ok then
         writeln(wrd);
      for ch:= 'a' to 'z'do
         PrintTrie(t^.nexts[ch], wrd+ch);
    end;
end;

function CorrectWord (wrd : string) : boolean;
begin
  result:= (wrd <> '');
end;

procedure mainAdd (var Root : TTrie; wrd : string);
begin
  if CorrectWord(wrd) then
    Add(Root, wrd);
end;

procedure deletWords; //  удаление слов,удовлетворяющих условию
vAR ch:TIndex;
begin
  if t<>nil then
    begin
      if t^.ok and chekWord(wrd) then
      t^.ok:=false;
    for ch:='a'to 'z' do
    deleteWords(t^.nexts[ch],wrd+ch);
      if IsEmptyNode(t) then
        begin
          dispose(t);
          t:=nil
        end;
    end;
end;

function chekWord; //содержит ли слово заданную букву

{Помогите пожалуйста написать эту функцию}

end.

Последний раз редактировалось Katya3636; 23.05.2010 в 18:57. Причина: point исправлен
Katya3636 вне форума Ответить с цитированием
Старый 23.05.2010, 18:20   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

В тексте есть опечатки из-за которых компиляция происходит с ошибками.
Или, например.
Код:
procedure PrintTrie(t : TTrie; wrd : string); 
  var ch : TIndex;
begin
  if t <> nil then begin
    if t^.point then
       writeln(wrd);
    for ch:= 'a' to 'z'do
       PrintTrie(t^.nexts[ch], wrd+ch);
    end;
end;
Структура TNode не содержит поля point. Тем не менее к нему есть обращение в этой функции, т.е. обращение к несуществующему полю.
Определитесь вначале со структурой узла.
Скандербег вне форума Ответить с цитированием
Старый 23.05.2010, 18:56   #3
Katya3636
 
Аватар для Katya3636
 
Регистрация: 23.05.2010
Сообщений: 9
По умолчанию

point заменен на ok, забыла исправить. будет сделано. А вы не могли бы помочь с функцией chekWord пожалуйста?
Katya3636 вне форума Ответить с цитированием
Старый 23.05.2010, 19:46   #4
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Не понятен смысл конструкции дерева.
Допустим, создается дерево с корневого элемента и словом "word".
И получается следующее:
Код:
Root^.nexts['w']^.nexts['o']^.nexts['r']^.nexts['d']^
Каждый из элементов nexts содержит 26 пустых, кроме одного, элементов TNode. Например третий в цепочке (Root^.nexts['w']^.nexts['o']^.nexts['r']^) имеет такие элементы:

(False, (nil, nil, nil, $953D6C, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil))

А для чего эти пустые элементы нужны?
А если не понятен замысел такой конструкции, то чем тут поможешь.

Последний раз редактировалось Скандербег; 23.05.2010 в 19:57.
Скандербег вне форума Ответить с цитированием
Старый 23.05.2010, 19:59   #5
Katya3636
 
Аватар для Katya3636
 
Регистрация: 23.05.2010
Сообщений: 9
По умолчанию

Остальные процедуры в этой задаче были одобрены моим преподавателем. Мне необходимо просто написать функцию chekWord типа boolean, которая проверяет: содержит ли Trie-дерево заданную букву? Вы не могли бы помочь конкретно с этой процедурой пожалуйста, не обращая особого внимания на остальное, т.к. сами понимаете, что цель для меня- сдать задачу, и если преподавателя всё устроило на 100%- смысла что-либо менять нет
Katya3636 вне форума Ответить с цитированием
Старый 23.05.2010, 21:14   #6
sabbathist
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Katya3636 Посмотреть сообщение
Остальные процедуры в этой задаче были одобрены моим преподавателем. Мне необходимо просто написать функцию chekWord типа boolean, которая проверяет: содержит ли Trie-дерево заданную букву? Вы не могли бы помочь конкретно с этой процедурой пожалуйста, не обращая особого внимания на остальное, т.к. сами понимаете, что цель для меня- сдать задачу, и если преподавателя всё устроило на 100%- смысла что-либо менять нет
Подход странный, ну да ладно. Для поиска буквы используйте симметрический обход дерева, либо обход в ширину.
O(n)
sabbathist вне форума Ответить с цитированием
Старый 23.05.2010, 21:53   #7
Katya3636
 
Аватар для Katya3636
 
Регистрация: 23.05.2010
Сообщений: 9
По умолчанию

sabbathist не мог бы помочь с написанеим этой функции пожалуйста? у меня вызывает затруднения..
Katya3636 вне форума Ответить с цитированием
Старый 24.05.2010, 23:00   #8
Katya3636
 
Аватар для Katya3636
 
Регистрация: 23.05.2010
Сообщений: 9
По умолчанию

помогите пожалуйста
Katya3636 вне форума Ответить с цитированием
Старый 25.05.2010, 23:59   #9
Katya3636
 
Аватар для Katya3636
 
Регистрация: 23.05.2010
Сообщений: 9
По умолчанию

Завтра зачёт...срочно нужна помощь!!(((((((((
Katya3636 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление повторяющихся слов C vivo89 Помощь студентам 2 24.12.2009 09:18
Удаление слов из строки. grave123 Общие вопросы C/C++ 2 20.12.2009 15:01
Удаление слов из строки С vivo89 Помощь студентам 4 13.11.2009 22:13
удаление одинаковых слов (С/С++) jewel Помощь студентам 1 12.12.2008 15:14