Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.02;
Скачать: CL | DM;

Вниз

помогите составить алгоритм сравнения элементов бинарного дерева   Найти похожие ветки 

 
@!!ex ©   (2008-09-23 19:50) [0]

есть бинарное дерево.
ветка либо содержит ссылку на две другие ветки, либо значение.
значение - это строка. может принимать "wildcard" или любое другие значение(список заранее не известен, количество тоже).
у ветки должна быть функция, которая возвращает true, если количество уникальных значений("wildcard" не считается) 2 и больше, и соответственно false, если значение только одно.

Тоесть прдеположим дерево вида:
*
|        \
*             *
|        \    |   \
wildcard  a   a    b
должно вернуть true
*
|        \
*             *
|        \    |   \
wildcard  a   a    a
false
и так далее..
Я видимо совсем устал, вообще не могу придумать, как это сделать...


 
@!!ex ©   (2008-09-23 20:06) [1]

Столкнулся с идиотской проблемой.
есть 4 переменных
p1_1,p1_2,p2_1,p2_2

нужно переменным r1,r2 присовить две из этих переменных, так чтобы по возможности они были разными и среди них не было wildcard.


 
@!!ex ©   (2008-09-23 20:33) [2]

сделал вот так:
function Node:getItems()
if self[_p].mElement then
 return self[_p].mElement,self[_p].mElement
else
 local p1_1,p1_2 = self[_p].mChildren[1]:getItems()
 local p2_1,p2_2 = self[_p].mChildren[2]:getItems()
 if p1_1 == "wildcard" then
  return  p2_1,p2_2  
 end
 if p2_1 == "wildcard" then
  return  p1_1,p1_2  
 end
 
 if p1_1 ~= p1_2 then
  return p1_1,p1_2
 end
 if p1_1 ~= p2_1 then
  return p1_1,p2_1
 end
 return p1_1,p2_2
end
end
-----
function Node:haveMoves()
assert(not self[_p].mElement,"haveMoves for root node")
local p1_1,p1_2 = self:getItems()
return p1_1~=p1_2 and p1_1~="wildcard" and p1_2~="wildcard"
end

не работает...


 
Zeqfreed ©   (2008-09-23 22:03) [3]

Я так понимаю, что функция достаточно часто вызывается? Есть, наверное, смысл хранить список всех значений из дерева и при добавлении узла в дерево выполнять проверку по сортированному списку.


 
tesseract ©   (2008-09-23 22:59) [4]


> есть бинарное дерево.


Сделай его самоупорядочиваемым. Красно-чёрные деревтя теб  в помощь.

ЗЫ: Практическое применение несамоупорядочивающихся бинарных деревьев для меня загадка.


 
tesseract ©   (2008-09-23 23:00) [5]


> при добавлении узла в дерево выполнять проверку по сортированному
> списку.


Само дерево должно иметь подобную функциональность. И упорядичивание имеено на запись. Написано в любой книжке по алгоритмике.


 
Zeqfreed ©   (2008-09-23 23:20) [6]

> tesseract ©   (23.09.08 23:00) [5]

Ну вообще да, в упорядоченном двоичном дереве же и так можно выполнить бинарный поиск. Возможно только у автора оно не упорядоченное.


 
@!!ex ©   (2008-09-23 23:23) [7]

Оно не то что не уопрядоченное... его в принципе нельзя упорядычевать...


 
Zeqfreed ©   (2008-09-23 23:25) [8]

> @!!ex ©   (23.09.08 23:23) [7]

Тогда оно является практически бессмысленным.
Мои варианты — либо дополнительный список, либо упорядоченная копия дерева.


 
@!!ex ©   (2008-09-23 23:26) [9]

вот так - работает(вроде):
function Node:getItems()
if self[_p].mElement then
 return self[_p].mElement,self[_p].mElement
else
 local p1_1,p1_2 = self[_p].mChildren[1]:getItems()
 local p2_1,p2_2 = self[_p].mChildren[2]:getItems()
 if p1_1 == "wildcard" then
  return  p2_1,p2_2  
 end
 if p2_1 == "wildcard" then
  return  p1_1,p1_2  
 end
 
 if p1_1 ~= p1_2 then
  return p1_1,p1_2
 end
 if p1_1 ~= p2_1 then
  return p1_1,p2_1
 end
 return p1_1,p2_2
end
end
--
function Node:haveMoves()
assert(not self[_p].mElement,"haveMoves for root node")
if self[_p].mChildren[1]:isLeaf() and self[_p].mChildren[2]:isLeaf() then
 return true
end
local p1_1,p1_2 = self:getItems()
return p1_1~=p1_2 and p1_1~="wildcard" and p1_2~="wildcard"
end

То, что тут используется бинарное дерево - не самоцель, просто так получилось, что структура в итоге оказалась бинарным деревом. больше суток это курочил, только несколько часов назад понял что это за структура...

P.S.
Вообще очень увлекательное занятие - править lua скрипты зашитые в exe файл. хорошо еще, что они не в байткоде...


 
KilkennyCat ©   (2008-09-23 23:43) [10]

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


 
MBo ©   (2008-09-24 05:05) [11]

Возможно, для этой цели лучше использовать дерево, в котором только уникальные ключи. А если нужно несколько элементов с одним ключом, то держать их в одном узле (в списке, например)


 
@!!ex ©   (2008-09-24 09:30) [12]

Да не мой код. :)
поэтому структуру данных менять не реально, да и дерево со своей задачей прекрасно справляется.


 
MBo ©   (2008-09-24 10:04) [13]

Ну тогда обход ветки с занесением данных в какую-либо структуру типа множества  - бинарное дерево поиска, хэш-таблица, при небольших размерах  - (сортированный) массив


 
AndreyV ©   (2008-09-24 10:41) [14]

> [13] MBo ©   (24.09.08 10:04)
> Ну тогда обход ветки с занесением данных в какую-либо структуру
> типа множества  - бинарное дерево поиска, хэш-таблица, при
> небольших размерах  - (сортированный) массив

Зачем заносить?
Достаточно сохранить первый елемент и сравнивать текущий с ним.


 
MBo ©   (2008-09-24 11:09) [15]

>AndreyV
Да, действительно


 
@!!ex ©   (2008-09-24 11:26) [16]

> [14] AndreyV ©   (24.09.08 10:41)
> Зачем заносить?
> Достаточно сохранить первый елемент и сравнивать текущий
> с ним.

недостаточно. первый элемент может быть wildcard


 
AndreyV ©   (2008-09-24 11:35) [17]

> [16] @!!ex ©   (24.09.08 11:26)
> > [14] AndreyV ©   (24.09.08 10:41)
> > Зачем заносить?
> > Достаточно сохранить первый елемент и сравнивать текущий
>
> > с ним.
>
> недостаточно. первый элемент может быть wildcard

Первый, который не wildcard.


 
@!!ex ©   (2008-09-24 11:41) [18]

Примерно это и делается в [9]



Страницы: 1 вся ветка

Текущий архив: 2008.11.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
15-1220620461
Плохиш
2008-09-05 17:14
2008.11.02
Поздравляю всех с началом нового учебного года!


2-1222325480
Zheksonz
2008-09-25 10:51
2008.11.02
FloatToStr(n) . и ,


2-1221981870
DmT
2008-09-21 11:24
2008.11.02
Как вкомпилить dll в exe


15-1221227421
Vlad Oshin
2008-09-12 17:50
2008.11.02
Прикольно..


15-1221108426
Cyrax
2008-09-11 08:47
2008.11.02
Терминатор 2 3D - Битва сквозь время: фрагмент с T1000000