2013-11-28 8 views
0

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

Если компания A владеет> 50% акций компании B, компания A 'управляющая компания B. , если компания B владеет> 50% акций компании C, затем B контролирует элементы управления C и A B и C , если компания A контролирует компанию B, C и D, а объединенные, B, C и D'd акции в компании E составляют до 50%, тогда компания A владеет компанией E.

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

Я понимаю, что этот вопрос может быть немного плохо сделан, но id ценят даже точную точку в правильном направлении.

+0

Покажите нам, что у вас есть. Мы не можем вам помочь, если не знаем, что вы сделали. – Jordonias

+2

Звучит как дерево. В каждом родительском узле сохраните% собственности и указатель на дочерний узел. Храните все узлы с> 50% прав собственности в одном списке, а остальные - в другом списке. Выполнение глубины первого поиска при смене списка> 50% должно выявить все переходные владельцы. – JustinDanielson

+0

Здесь есть реальная возможность для бесконечного цикла. Если компании A принадлежит 51% компании B, а компании B принадлежит 51% компании A. Определение собственности может стать беспорядочным. – Justin

ответ

0
from collections import defaultdict 

def find_controlled(company, shares): 
    # shares the company owns directly 
    controls = set([company])  # avoid the recursion problem pointed out by @Justin 
    owns  = defaultdict(float) 
    owns.update(shares[company]) 

    # first level of controlled companies to look at 
    add_control = set(k for k,v in owns.items() if v > 0.50) 

    while add_control: 
     # new level of controlled companies to look at next 
     _add_control = set() 

     for cpy in add_control: 
      controls.add(cpy) 
      for k,v in shares[cpy].items(): 
       owns[k] += v 
       if owns[k] > 0.5 and k not in controls: 
        _add_control.add(k) 
     add_control = _add_control 

    return sorted(controls - set([company])) 

def main(): 
    # Data structure: dict of dict of float 
    # shares['A']['B'] = 0.51  means A owns 51% of B's shares 
    shares = defaultdict(lambda: defaultdict(float)) 

    # Who owns what 
    shares['A']['B'] = 0.60 
    shares['A']['C'] = 0.55 
    shares['A']['D'] = 0.41 
    shares['C']['D'] = 0.10 
    shares['B']['E'] = 0.20 
    shares['C']['E'] = 0.20 
    shares['D']['E'] = 0.20 

    # See who A controls: 
    controlled = find_controlled('A', shares) 
    print('A controls {}'.format(','.join(controlled))) 

if __name__=="__main__": 
    main() 
Смежные вопросы