#python #recursion #data-structures #binary-tree
#python #рекурсия #структуры данных #двоичное дерево
Вопрос:
У меня есть набор данных, сгенерированный из
import numpy as np
dataset = np.random.normal(50,10,100)
Запишите минимальное и максимальное значение для этого набора данных.
Пусть [min, max] будет корневым узлом. Тогда он имеет 100 точек. Пусть [min, min d) и [max — d, max] (где d=(max-min)/2) будут левым и правым дочерними элементами соответственно. Продолжайте делать это. Остановитесь, когда узел имеет меньше или равно 5 точкам (которые находятся в наборе данных). Как найти количество точек каждого узла?
Я построил исходное дерево с узлом (1,2,3….Сверху вниз и слева направо), теперь я хочу вставить данные для каждого узла. Я также написал функцию для разделения каждого интервала. Для завершения ему просто нужен рекурсивный алгоритм. Но как собрать их вместе?
import numpy as np
dataset = np.random.normal(50,10,100)
Для левого дочернего элемента (функции)
def split_L(l):
d = (max(l)-min(l)) / 2
print('max=', max(l))
print('min=', min(l))
print('d=', d)
j = 0
m = []
for i in dataset:
if i in l:
j=j 1
print('Number of points=',j)
for k in l:
if k < min(l) d:
m.append(k)
while j > 5:
return m
Для правильного дочернего элемента (функции)
def split_R(l):
d = (max(l)-min(l)) / 2
print('max=', max(l))
print('min=', min(l))
print('d=', d)
j = 0
m = []
for i in dataset:
if i in l:
j=j 1
print('Number of points=',j)
for k in l:
if k >= max(l)-d:
m.append(k)
while j > 5:
return m
Для дерева
class Node:
def __init__(self,data):
self.data = data
self.left = None
self.right = None
class Tree:
def __init__(self):
self.list = [self.root_node()]
def root_node(self):
root_node = Node(1)
return root_node
def add_node(self, data):
new_node = Node(data)
self.list.append(new_node)
if len(self.list) % 2==0:
self.list[len(self.list) // 2].left = new_node
else:
self.list[len(self.list) // 2].right = new_node
def output_tree(self):
for i in range(len(self.list)):
print(self.list[i].data)
if __name__ == '__main__':
tree = Tree()
for i in range(2,100):
tree.add_node(i)
tree.output_tree()
Ответ №1:
несколько советов.
- у вас должен быть класс manger, потому что диапазон набора данных определяет корневой узел, а плотность точек определяет глубину. дерево может полностью измениться при добавлении новой точки в dataset.
- если вы не хотите добавлять новую точку в dataset, ваша «вставка данных» просто означает этап построения, вам не нужно разрешать каждый уровень дерева, вы можете просто иметь дело с конечными узлами и определять свойство для их предка.
- вам не нужно создавать исходное дерево таким образом, вы можете вычислить минимальную длину каждых пяти смежных точек в отсортированном наборе данных, тогда вы можете получить глубину напрямую