2) оцените сложность каждого решения в нотации О-большое
3) сделайте вывод, какое решение эффективнее и почему
ОТВЕТ:
По уровням сложности, третий вариант - самый предпочтительный.
Там есть, конечно, нюанс того, что он зависит от количества возвращаемых компаний,
но это все-равно - линейная зависимость от размерности словаря.
Несмотря на равные уровни сложности первого и второго вариантов, первое решение выглядит более элегантно.
По сути, это идентичные решения, использующие встроенную функцию сортировки.
Примечание:
Без выполнения пунктов 2 и 3 задание считается нерешенным. Пункты 2 и 3 можно выполнить
через строки документации в самом коде.
@@ -21,3 +28,72 @@
Реализуйте поиск трех компаний с наибольшей годовой прибылью.
Выведите результат.
"""

#############################################################################################
def get_company_with_max_profit_1(dict, amount):
    """Функция возвращает список компаний с максимальной прибылю.
    входные параметры:
    - словарь с наименованием компании и суммой прибыли
    - количество компаний, которое необходимо вернуть
    Сложность: !!!. Сложность: !!!. O(n LOG n) - линейно-логарифмическая.
    """
    my_list = sorted(dict.items(),  key=lambda x: x[1], reverse=1)  # !!! O(n LOG n)
    return my_list[0:amount]                                        # !!! O(n)

#############################################################################################

def get_company_with_max_profit_2(dict, amount):
    """Функция возвращает список компаний с максимальной прибылю.
    входные параметры:
    - словарь с наименованием компании и суммой прибыли
    - количество компаний, которое необходимо вернуть
    Сложность: !!!. O(n LOG n) - линейно-логарифмическая.
    """
    my_list = []                        # !!! O(1)
    for key, value in dict.items():     # !!! O(n)
        my_list.append((value, key))    # !!! O(1)
    my_list.sort(reverse=1)             # !!! O(n LOG n)
    return my_list[0:amount]            # !!! O(n)

#############################################################################################

def get_company_with_max_profit_3(dict, amount):
    """Функция возвращает список компаний с максимальной прибылю.
    входные параметры:
    - словарь с наименованием компании и суммой прибыли
    - количество компаний, которое необходимо вернуть
    Сложность: !!!. O(n) - линейная.
    """
    my_list = []                            # !!! O(1)
    for i in range(amount):                 # !!! O(1)
        max_company = ''                    # !!! O(1)
        max_value = 0                       # !!! O(1)
        for key, value in dict.items():     # !!! O(n)
            if max_value < value:           # !!! O(1)
                max_value = value           # !!! O(1)
                max_company = key           # !!! O(1)
        my_list.append((max_company, max_value))    # !!! O(1)
        dict[max_company] = 0               # !!! O(1)
    return my_list                          # !!! O(1)

#############################################################################################

company_profit_dic = {
    'Saudi Aramco' : 329800,
    'Toyota' : 280500,
    'State Grid' : 387000,
    'Walmart' : 524000,
    'Sinopec Group' : 369200,
    'China National Petroleum' : 364100,
    'Royal Dutch Shell' : 311600,
    'Exxon Mobil' : 265700,
    'BP' : 278400,
    'Volkswagen' : 275200
}

print(get_company_with_max_profit_1(company_profit_dic, 3))
print(get_company_with_max_profit_2(company_profit_dic, 3))
print(get_company_with_max_profit_3(company_profit_dic, 3))