Главная страница
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.016 c
15-1220853849
Slider007
2008-09-08 10:04
2008.11.02
С днем рождения ! 8 сентября 2008 понедельник


1-1202054224
dreamse
2008-02-03 18:57
2008.11.02
Как, зная имя EXE, определить Handle окна этой программы


3-1208522678
keymaster
2008-04-18 16:44
2008.11.02
PL/SQL и кирилица


15-1221023962
Slider007
2008-09-10 09:19
2008.11.02
С днем рождения ! 10 сентября 2008 среда


3-1208416193
Раиса
2008-04-17 11:09
2008.11.02
Выбрать записи ближайшие к определенному интервалу