2011-10-14 3 views
1

Любая идея, как я могу начать работу по созданию дерева хирахии? Это дерево получает идентификатор employeeID и идентификатор менеджера. Связи между узлами подразумевают взаимосвязь: узел, расположенный выше в дереве, является менеджером узлов ниже. Однако мы хотим, чтобы операции над деревом были эффективными, например. поиск должен быть O (lg n). Есть идеи? Возможно ли это?Реализация дерева гериархия

EDIT:

Я в действительно нуждается в помощи. Могу ли я узнать, почему этот вопрос закрывается?

+0

Я думаю, вам нужно будет объяснить больше о том, чего вы хотите. По крайней мере, мне это не ясно. – ath88

+0

Вы должны, вероятно, уточнить утверждение _ «мы хотим, чтобы операции над деревом были эффективными» _ – PengOne

ответ

0

вы создаете объект, который содержит 2 свойства:

  • Manager (иерархические вверх)
  • сотрудников (иерархическая вниз) -> коллекция

Вот это

вы могли бы даже реализовать это без отношения к менеджеру, если вы всегда начинаете с «большого босса» и делаете сверху вниз поиск

+0

спасибо! но что, если мы добавим менеджера для этого менеджера? – OckhamsRazor

+0

не проблема: вы устанавливаете свойство менеджера «среднего менеджера» «топ-менеджеру» и добавляете «средний менеджер» в коллекцию сотрудников «топ-менеджера» – fixagon

+0

. но как же мы будем искать по ID? мы не можем выполнить поиск O (lg n). мы можем делать только BFS или DFS. – OckhamsRazor

0

Ну, с любым деревом, я чувствую, что вы должны рассматривать узлы как равные, поскольку любой узел может содержать подносы (включая подузлы). Имея это в виду, для большинства деревьев я, как правило, принимают родитель -> ребенок подход, например:

пользователя Таблица:

ID ParentID Name 
1  0   Joe 
2  0   Sally 
3  2   Jim 

Теперь, в этой таблице, Джо & Салли являются корневой уровень, в то время как Джим - ребенок (сотрудник в этом случае) Салли. Это может продолжаться, с другими пользователями, являющимися дочерними пользователями, которые являются самими собой, детьми других и т. Д. ...

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

Что касается фактической реализации, по крайней мере в ASP.NET, я бы предложил обратиться к использованию TreeView, HierarchicalDataSourceControl и HierarchicalDataSourceView. Вместе эти три объекта позволяют вам быстро создавать деревья данных, а используемые шаблоны довольно общие, поэтому вы можете адаптировать их для использования будущих объектов данных.

2

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

Обратите внимание, что я не применял методы найма, огня или продвижения. Они довольно просты и немного выходят за рамки основной структуры (они сами объясняют из приведенного ниже кода. Если они сразу не выпрыгивают на вас, вам нужно изучить, как это работает немного больше для вас самого!)

class OrgChart { 

    // Assume these are properly constructed, etc... 
    static class Employee { 
     String name; 
     EmployeeID id; 
     Employee manager; 
     Set<Employee> underlings; 
    } 

    static class EmployeeID { 
     // what is the id? id number? division + badge number? 
     // doesn't matter, as long as it has hashCode() and equals() 
    } 

    Map<EmployeeID, Employee> employeesById = new HashMap... 

    Employee ceo = new CEO.getTheCEO(); 

    public Employee getManagerfor(EmployeeID id) { 
     Employee dilbert = employeesById.get(id); 
     return dilbert.manager; 
    } 

    public Set<Employees> getEmployeesUnder(EmployeeID phbid) { 
     Employee phb = employeesbyId.get(phbid); 
     return phb.underlings; 
    } 

} 
+0

спасибо, свечение, но идентификаторы не указывают ранг сотрудника. id # 1 может быть дворником, а # 200 может быть основным. im в настоящее время смотрит на вложенный подход b-дерева. что вы думаете? – OckhamsRazor

+0

Умм, в моем примере ID не представляет ранг. У меня есть только внутреннее отображение идентификатора записи сотрудника. Что касается вашего подхода b-tree, мне нужно будет понять, что вы подразумеваете под этим. Вы говорите о своих отношениях между сотрудниками? Поскольку я думал, что у b-дерева было ограниченное число детей на узел, что вы не хотите навязывать. (Возможно, у вас есть менеджер-волонтер, у которого на его диаграмме есть сотни «служащих»). – corsiKa

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