Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2009, 06:57   #1
Daedro
Новичок
Джуниор
 
Регистрация: 23.04.2009
Сообщений: 2
По умолчанию Время работы функции с массивом.

У нас есть ассоциативный массив map<int, int > m из n элементов. Как оценить время работы функции m.find(5) и find(m.begin(), m.end(), 5)??

Буду признателен за помощь! Заранее спасибо!
Daedro вне форума Ответить с цитированием
Старый 13.07.2009, 07:27   #2
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Вообще, это зависит от реализации. Полагаю, что не хуже, чем O(log n). Особой разницы между m.find(5) и find(m.begin(), m.end(), 5) не вижу, т.к. они всё равно хранятся как дерево.
megachuhancer вне форума Ответить с цитированием
Старый 13.07.2009, 08:30   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Можно провести эксперимент - зарегистрировать время старта и время окончания работы данных функций при сравнительно больших m и n. Для этого нужно сформировать различные варианты map и зарегистрировать время для каждой функции. Думаю 10-ти вариантов массива юудет достаточно чтобы выявить среднее время работы для каждой функции (это необходимо, поскольку современные ОС являются многозадачными и есть вероятность, что Ос в этот момент будет выполнять ресурсоемкую работу).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 14.07.2009, 05:35   #4
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Кстати, прототип map::find такой:
Код:
iterator find(const Key& key);
const_iterator find(const Key& key) const;
То есть никаких границ, как в find(m.begin(), m.end(), 5) не предусмотрено (оно и не удивительно, т.к. узнать что где хранится в map'е можно только из отладчика(или используя map::find, хотя с помощью этой функции можно узнать где, но не что; можно пробежатся циклом по всем элементам, но это O(n)) - в map'е всё хранится в отсортированном виде). Да и необязательные параметры в C++ указываются в конце, если что.
Время поиска O(log n), т.к. там используются структуры данных типа АВЛ-деревьев, благодаря чему реально поддерживается древовидная структура.

Последний раз редактировалось megachuhancer; 14.07.2009 в 05:37.
megachuhancer вне форума Ответить с цитированием
Старый 14.07.2009, 07:29   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Мой способ лучше - поскольку математические выкладки не всегда соответствуют действительности по одной простой причине. Математические модели предпологают атомарность операций - каждая операция должна выполняться строго определенный квант времени. Но так ли это на самом деле? Вы не забывайте про внутренние обслуживающие операции внутри программы (отвлеченный пример - выделение динамической памяти, а память фрагментирована. Программе пофигу, поскольку будет запущена подпрограмма для оптимизации памяти, которая будет запущена кстати без вашего участия, но самое главное время будет потеряно).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 14.07.2009, 10:25   #6
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Utkin, полностью согласен, что наиболее объективным способом оценки времени работы программы является измерение этого самого времени. Но я не вижу программы, а вижу только вызов функции, который мало о чём говорит. Поэтому оценить время в этом случае можно опираясь только на метематическую оценку и детали реализации STL. Это во-первых. Во-вторых только математическая оценка может дать общее представление о времени работы программы. Вот сейчас в map'е есть 10 элементов. А в следующий раз 60000. Измерение времени позволяет оценить время выполнения только на одном классе входных данных. Тем более, что мы, в процессе написания программы не можем точно знать все детали будущей среды её выполнения: что и где будет расположено в памяти, чем будет загружен процессор и т.д. и т.п.

Я клоню к тому, что профилировка подвержена непостоянству. Профилируйте программу, потом ещё раз. Время работы может отличатся в несколько раз! А теперь запустите-ка штук 50 WinAmp'ов и профилируйте ещё раз. Конечно никому не придёт в голову(мне пришло ) профилировать программу с 50 запущенными WinAmp'ами, но всё таки. Математическая оценка обладает желательным свойством - некоторой универсальностью. Если в программе реализованы медленные алгоритмы, время её работы будет отличатся на порядки, и это будет видно без всякой профилировки. Интересно, дождётесь ли вы конца профилировки программы, сортирующей 100 000 000(или даже меньшее количество) элементов методом пузырька

Последний раз редактировалось megachuhancer; 14.07.2009 в 13:50.
megachuhancer вне форума Ответить с цитированием
Старый 14.07.2009, 13:58   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Но я как раз о "чистом" варианте эксперимента, без учета многозадачности. Представьте что мы работаем в голом ДОСе и драйвера у нас только на клаву с мышой. Программа в некотором смысле "вещь в себе", черный ящик если хотите. И время будет действительно зависить от алгоритма, но это будет другая формула, возможно не выражаемая в математическом смысле.
Все тот же пример про динамическую память. Возьмите операции над массивом обычным и массивом динамическим. Вы будете приятно удивлены разницей во времени и она будет далеко не линейного характера. Это объясняется тем, что современные технологии осуществляют ряд вспомогательных процессов в программе без непосредственного участия программиста - это например, сборка мусора, дефрагментация кучи и прочее. И такие процессы занимают далеко не один такт процессора.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 14.07.2009, 14:04   #8
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Ну раз речь идёт о "чистом" варианте эксперимента, то ладно. Просто у каждого подхода своя область применимости. В программировании очень важен обоснованный выбор средств. Пусть Daedro решает(если вообще ещё заглянет сюда), что для него лучше(хотя одно другому не мешает). Просто мне показалось, исходя из формулировки вопроса, что необходима именно математическая оценка, хотя я, конечно же, могу ошибаться.
megachuhancer вне форума Ответить с цитированием
Старый 14.07.2009, 15:40   #9
Daedro
Новичок
Джуниор
 
Регистрация: 23.04.2009
Сообщений: 2
По умолчанию Пасибо !!!))))

Я ы общем понял ваши точки зрения,пожалуй попробую и то и то,и на основании статистики получу итоговую оценку.

Пасибо большое!!!)) Ещё есть в интернете знающие прогеры)
Daedro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод вычисляемой функции во время работы программы DAV88 Помощь студентам 4 25.04.2009 15:41
Создание функции для работы с динамическим массивом papoose Помощь студентам 2 19.01.2009 16:55
Время работы WINDOWS В_И_К_Т_О_Р Помощь студентам 8 30.01.2008 12:42
dll для работы с массивом alex23xandr Общие вопросы Delphi 3 25.05.2007 20:00
Время работы сортировок Боня Помощь студентам 1 10.02.2007 17:53