Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Оптимизация функции


Автор: vladko 14.4.2009, 11:18
Эта функция оформленная в виде длл считывает текстовый файл производит вычисления и выодит новый текстовый файл. Можно ли этот код оптимизировать по скорости? Например 150 мб считает минуту. Сократить бы это время в 2-3 раза...

Код

#include <stdio.h>
#include <map>
using namespace std;

typedef map<double, int> Map;

extern "C"
{

typedef int* MyInt;
typedef map<double,MyInt> Map2;

void _stdcall proc1(const char* fileName, long Date_start, long Time_start, long Date_end, long Time_end)
{
FILE* f = fopen(fileName, "r");
if(!f)
{
printf("file not found\n");
return;
}
Map2 m;

for(;;)
{
double c=0;
long a=0, b=0;
int d=0;
if(fscanf(f, "%ld %ld;%lf;%d",&a,&b,&c,&d)< 4)
break;
if(a>Date_end) break;
if(a<Date_start) continue;
if((a==Date_start)&&(b<Time_start)) continue;
if((a==Date_end)&&(b>Time_end)) break;

int *inf=(int*)malloc(2);// {0,0};
inf[0]=d;
inf[1]=1;

pair<Map2::iterator, bool> result =
m.insert(pair<double,MyInt>(c,inf));
if(!result.second)
{
(result.first)->second[0] += d;
(result.first)->second[1] += 1;
};
}
fclose(f);

char outFileName[264];
strcpy(outFileName, fileName);
strcat(outFileName, ".out");
f = fopen(outFileName, "w");
int i=1;
for(Map2::iterator it = m.begin(); it != m.end(); ++it)
{
fprintf(f,"%f %d %d\n", it->first, it->second[0], it->second[1]);
i++;
}
fclose(f);
}




Автор: azesmcar 14.4.2009, 11:37
vladko

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

Добавлено через 3 минуты и 26 секунд
vladko
и этот код работает?

Код

int *inf=(int*)malloc(2);// {0,0};

где free??? 
Код

inf[0]=d;
inf[1]=1;


ты освободил два байта, обращаешся к большему количеству...или я чего-то не пойму?

Автор: GoldFinch 14.4.2009, 11:41
жесть какая-то
этот код не оптимизировать нада, а удалить и написать новый

Автор: vladko 14.4.2009, 11:45
Блин, че так все плохо? На мелких файлах нормально работает... Код не я писал...

Автор: xvr 14.4.2009, 11:45
Вот это
Код

int *inf=(int*)malloc(2);// {0,0};
inf[0]=d;
inf[1]=1;
убрать и заменить на массив из 2х int непосредственно в map (malloc'и в цикле жрут много времени (и памяти  smile ))

Код

struct MyInt {
 int data[2];

 MyInt() {data[0]=data[1]=0;}
 
 void add(int d) {data[0]+=d; ++data[1];}
};

typedef map<double,MyInt> Map2;

...

/*
int *inf=(int*)malloc(2);// {0,0};
inf[0]=d;
inf[1]=1;
pair<Map2::iterator, bool> result =
m.insert(pair<double,MyInt>(c,inf));
if(!result.second)
{
(result.first)->second[0] += d;
(result.first)->second[1] += 1;
};
*/

m[c].add(d);


Автор: zim22 14.4.2009, 11:45
товарищ vladko уже эту тему подымал.
http://forum.vingrad.ru/forum/topic-253997/anchor-entry1831844/0.html

vladko, не лучше ли вам пойти в http://forum.vingrad.ru/forum/Vingrad-help-center.html?

Автор: vladko 14.4.2009, 11:46
ага, только там не помогли... вот я и выложил результат помощи с другого форума...

Автор: GoldFinch 14.4.2009, 11:49
Цитата(vladko @  14.4.2009,  12:46 Найти цитируемый пост)
выложил результат помощи с другого форума... 

ололо помогли так помогли)

Автор: vladko 14.4.2009, 12:07
да, помогли, а не флудили... прога рабочая... 
спасибо за исправления xvr!!!

Автор: 0xDX 14.4.2009, 12:09
Читать файл нужно побольше буфером.
Выделять память  нужно залпом, и не когда не использовать malloc(new ) в цикле.

Автор: azesmcar 14.4.2009, 12:14
vladko

Если она работает - то это видимо счастливая случаность smile

1. Читай из файла большими кусками - например по мегабайту за итерацию.
2. Не выделяй память в цикле и не обявляй переменных.
3. Не забывай освобождать память если она больше не нужна.

Попробуй все таки привести код в порядок..

Автор: GoldFinch 14.4.2009, 12:19
azesmcar, при завершении программы память освобождается сама, так что там ничего освобождать не надо

Автор: azesmcar 14.4.2009, 12:25
GoldFinch

на каждый вызов malloc и new должен быть free и delete соответственно до завершения программы. И не важно что операционная система подотрет за вами то что не сделали вы сами.

Автор: zim22 14.4.2009, 12:28
Цитата(azesmcar @  14.4.2009,  12:14 Найти цитируемый пост)
Попробуй все таки привести код в порядок..

не получится. smile
vladko писал: http://forum.vingrad.ru/index.php?showtopic=253997&view=findpost&p=1831824


Автор: vladko 14.4.2009, 12:29
azesmcar, а как читать блоками если файл разбит на строки (и они разной длины)?


p.s. что зим, проще поржать, чем что-то посоветовать?

Автор: azesmcar 14.4.2009, 12:40
vladko
Скажи подробнее какой формат файла? Он у тебя вроде не текстовый. Что там запиасно и в какой очередности.
Если я не ошибаюсь это long, long, double, int?
сделай структуру с этими типами и читай через fread сразу в структуру, можно читать не по одному а блоками - по 20 структур к примеру, попытно пишешь в выходной файл.

Автор: GoldFinch 14.4.2009, 12:43
Цитата(azesmcar @  14.4.2009,  13:25 Найти цитируемый пост)
на каждый вызов malloc и new должен быть free и delete соответственно до завершения программы. И не важно что операционная система подотрет за вами то что не сделали вы сами. 

а почему они должны быть вы объяснить можете? или тупо заучили правило и теперь его повторяете?

Автор: vladko 14.4.2009, 12:45
azesmcar, файл как раз текстовый, пример:
20090318 010017;1.4045;7
20090318 010150;1.405;1
20090318 010150;1.405;1
20090318 010151;1.405;1
20090318 010307;1.4049;1
20090318 010308;1.4044;1
20090318 010308;1.4041;1
20090318 010802;1.4049;1
20090318 011056;1.4046;1
20090318 011406;1.4047;1
20090318 011416;1.4047;1
20090318 011903;1.4049;2
20090318 011903;1.405;2
20090318 011912;1.4054;1
20090318 011912;1.4054;2
20090318 011912;1.4054;1
20090318 011926;1.4053;1
20090318 012141;1.4057;5
20090318 012159;1.4056;1

Автор: azesmcar 14.4.2009, 12:53
GoldFinch
Если есть правило - оно обосновано! Очень интересует - создайте топик поговорим об этом. Тут другой вопрос обсуждается:
Кратко
для delte - чтобы вызывался деструктор
для malloc - ос не обязана за вас это делать, нет стандарта ос который ее к этому обязывает, сегодня это виндоуз - завтра не дай и бог АбабОС - гарантий нет + это может быть только один модуль программы и по завершению функции - не факт что программа заканчивается.

Добавлено через 3 минуты и 14 секунд
GoldFinch

это вам в голову не приходило или просто тупо думаете что виндоуз единственная операционная система и все программы состоят из одной единственной функции?

Добавлено через 6 минут и 5 секунд
vladko

значит файл текстовый.
Просто берем и читаем конкретный размер - к примеру 1мегабайт данных из файла в буфер выделенный malloc (выделяем один раз).
Потом читаем из файла в этот буфер один мегабайт данных, смотрим сколько на самом деле прочитали (запоминаем).
Обрабатываем данные в цикле, если нашли строку которая прочиталась наполовину, запоминаем ее начало - читаем продолжение из файла. Пока все данные не прочтем (т.е. сколько прочли - меньше чем сколько попросили прочесть)

Примерно так

Автор: vladko 14.4.2009, 13:32
azesmcar, да, спасибо, я понял что делать, а вот как... может быть в личке обсудим вариант взаимовыгодного сотрудничества?

Автор: azesmcar 14.4.2009, 13:38
vladko

напиши в аську минут через 10. Номер аськи в профайле

Автор: xvr 14.4.2009, 13:40
Файл лучше даже не читать (пусть одним куском), а целиком замэпить в память (см. CreateFile/CreateFileMapping/MapViewOfFile), не забудьте затерминэйтить его нулем после мэпа. Для чтения данных из файла лучше применить не sscanf(fscanf) а прямой разбор через stroul/strtod (может быть быстрее)

Автор: GoldFinch 14.4.2009, 14:05
Цитата(azesmcar @  14.4.2009,  13:53 Найти цитируемый пост)
думаете что виндоуз единственная операционная система и все программы состоят из одной единственной функции?

эта конкретная задача пишется под windows и состоит из одной единственной функции
так зачем лепить код который в контексте этой конкретной задачи не нужен?

Автор: azesmcar 14.4.2009, 14:17
GoldFinch

затем что завтра - если программа станет делать что-то еще, разработчик забудет про malloc в функции proc1. Или это может быть другой разработчик который даже не знает что в функции proc1 есть malloc без free и разработчик надеялся на систему, в задаче нигде не указано что разработка идет под операционную систему виндоуз, это С++, и раздел называется С++ а не программирование под виндоуз, код надо писать так чтобы при портировании делалось минимум изменений (если можно вообще не делалось), т.е. писать в соответствии со стандартами. Я после института не писал ни одной программы которая бы отработала один раз и завершилась, в работе такие программы встречаются редко и освобождение памяти должно войти в привычку.

Автор: GoldFinch 14.4.2009, 14:21
Цитата(azesmcar @  14.4.2009,  15:17 Найти цитируемый пост)
в задаче нигде не указано что разработка идет под операционную систему виндоуз

в задаче сказано что это dll, значит windows. читайте задачу внимательнее

Автор: azesmcar 14.4.2009, 14:30
GoldFinch

хотите длл под линукс покажу smile просто расширение другое..
ладно, проехали...не хотите освобождать память - не надо.

Автор: GoldFinch 14.4.2009, 14:40
azesmcar, судя по предыдущим постам длл пишется для использования в VBA, VBA под линукс покажете?

Автор: azesmcar 14.4.2009, 14:43
GoldFinch

предыдущий пост - это в другом топике? не смотрел. Какая разница какая операционка? я вам полно других примеров привел.
Это вопрос из темы "не надо передавать std::string по константной ссылке, все равно в линуксе он 4 байта занимает".

Автор: mes 14.4.2009, 16:08
GoldFinch, я Вас правильно понял, Вы утверждаете, что если пишите короткую прогу и знаете что под Виндоус, то предпочтительней или даже необходимо не возвращать выделенную память ?!

Автор: J0ker 14.4.2009, 16:22
GoldFinch,
вы строите из себя панка от программирования?
у вас, должен заметить, это получается
правда в нехорошем смысле слова "панк"  smile 

Автор: zim22 14.4.2009, 16:54
Цитата(J0ker @  14.4.2009,  16:22 Найти цитируемый пост)
правда в нехорошем смысле слова "панк"

почитал словарь Collins. У панка одни положительные значения за исключением двух:

1) obsolete a young male homosexual; catamite 
2) obsolete a prostitute


J0ker, вы какое имели ввиду? smile

Автор: vinter 14.4.2009, 17:11
zim22, Punk - падонок(в современном мире так называют людей, которые пытаются выделится среди других своим идиотизмом)

Автор: J0ker 14.4.2009, 17:12
Цитата(zim22 @  14.4.2009,  16:54 Найти цитируемый пост)
J0ker, вы какое имели ввиду?

http://www.urbandictionary.com/define.php?term=punk
http://www.merriam-webster.com/dictionary/punk
 a usually petty gangster, hoodlum, or ruffian 

Автор: zim22 14.4.2009, 17:25
Цитата(J0ker @  14.4.2009,  17:12 Найти цитируемый пост)
http://www.urbandictionary.com/define.php?term=punk

улыбнуло.
Цитата

A guy walks up to me and asks 'What's Punk?'. 
So I kick over a garbage can and say 'That's punk!'. 
So he kicks over the garbage can and says 'That's Punk?', and I say 'No that's trendy!

Автор: GoldFinch 14.4.2009, 17:51
mes
предпочтительней или даже необходимо не писать код который производит ненужные действия, 

(особенно не приносящие пользы, увеличивающие время написания программы, увеличивающие объем бинарника программы, снижающие быстродействие программы)

Автор: mes 14.4.2009, 18:15
Цитата(GoldFinch @  14.4.2009,  16:51 Найти цитируемый пост)
mes, 
предпочтительней или даже необходимо не писать код который производит ненужные действия, 

в принципе согласен..но способ достижения я выбрал бы другой, 
В грубом изложении я согласен отказаться от delete  (речь веду о С++ ),
но не в пользу брошенного без присмотра объекта, а в передачи прав на его удаление умному указателю. 
В общем всегда стараюсь придерживаться правила:  функция не знает o том, в каком контексте она работает.
Вы же, насколько я смог представить по Вашим постам, стараетесь нагрузить свою память лишними деталями.
В частности применительно к последним высказываниям, заставляете себя постоянно помнить в какой из функций хватает, а в какой не поставили освобождение памяти.
Хотя  гораздо легче просто писать симметрично.  smile 

Автор: J0ker 14.4.2009, 18:37
Цитата(GoldFinch @  14.4.2009,  17:51 Найти цитируемый пост)
предпочтительней или даже необходимо не писать код который производит ненужные действия

безусловно
т.е. теперь вы согласны, что уничтожать объекты и освобождать память необходимо?  smile 

Автор: azesmcar 14.4.2009, 18:38
Цитата

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


Предпочтительней и даже необходимо писать код который будет читабельным и понятным. Преждевременная оптимизация - зло!
Программу можно оптимизировать сменив алгоритм, перейдя с С++ на С, в крайнем случае можно еще поизвращатся если нужно очень быстро - и это основные методы оптимизации. А не освобождать память это не то что преждевременная оптимизация, это почти доходит до маразма. Насколько вы повысите произодительность программы убрав delete или free? Просто посчитайте и вы поймете что оно того не стоит.

Добавлено через 2 минуты и 16 секунд
А насчет лишних действий - любая вызванная вами функция в той или иной степени выполняет что либо что возможно на первый взгляд вам и не нужно. Если хотите чтобы код делала только то что вы от него требуете и ничего более - единственный выход писать на ассемблере.

Автор: GoldFinch 14.4.2009, 20:07
Цитата(azesmcar @  14.4.2009,  19:38 Найти цитируемый пост)
Если хотите чтобы код делала только то что вы от него требуете и ничего более - единственный выход писать на ассемблере. 

такой же код пишется и на С++ и на дельфи, я хз что вы так уперлись в ассемблер

Автор: Lazin 14.4.2009, 20:33
а что этот код должен делать?

Автор: J0ker 14.4.2009, 21:13
Цитата(GoldFinch @  14.4.2009,  20:07 Найти цитируемый пост)
я хз что вы так уперлись в ассемблер 

не прикидывайтесь неджедаем  smile 

Автор: sdukshis 14.4.2009, 22:00
Если я правильно понял программу, то в ней важно, чтобы данные переписались в новый файл уже в отсортированном виде. Для этого Вы организуете считывание в map, который являясь упорядоченным деревом производит сортировку.

Или возможно Вам нужно исключить или обработать повторяющиеся данные

В первом случае лучше считывать данные в структуру типа vector (с заранее выделенной памятью) или list(хотя если можно заранее оценить размер данных, то лучше vector), а сортировку производить стандартными алгоритмами.

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

Вообще очень советую разбить программу на подпрограммы и произвести профилирование кода. Там сразу выплывет, какая часть кода занимает основное время.



Автор: zim22 15.4.2009, 07:03
Цитата(sdukshis @  14.4.2009,  22:00 Найти цитируемый пост)
В первом случае лучше считывать данные в структуру типа vector (с заранее выделенной памятью) 

зачем память заранее выделять? вектор умный - сам выделит и зарезервирует в придачу.

Цитата(sdukshis @  14.4.2009,  22:00 Найти цитируемый пост)
 или list...а сортировку производить стандартными алгоритмами.

если под сортировкой вы подразумеваете алгоритм sort из <algorithm>, то list в пролёте. у него BiDirrectional Iterators, а не RandomAccess. 
Хотя у list и есть встроенная функция-член sort, но мне кажется она работает медленнее, чем sort из <algorithm>

Автор: vinter 15.4.2009, 08:02
Цитата(zim22 @  15.4.2009,  08:03 Найти цитируемый пост)
зачем память заранее выделять? вектор умный - сам выделит и зарезервирует в придачу.

если не выделить самостоятельно будут overheads

Цитата(zim22 @  15.4.2009,  08:03 Найти цитируемый пост)
Хотя у list и есть встроенная функция-член sort, но мне кажется она работает медленнее, чем sort из <algorithm>

у них одинаковая сложность

Автор: GoldFinch 15.4.2009, 08:17
Цитата(vinter @  15.4.2009,  09:02 Найти цитируемый пост)
одинаковая сложность

если написано что сложность O(N*log(N))
это может значить что в одном случае N*log(N) а в другом 100*N*log(N)

Автор: zim22 15.4.2009, 08:33
Цитата(GoldFinch @  15.4.2009,  08:17 Найти цитируемый пост)
это может значить что в одном случае N*log(N) а в другом 100*N*log(N)

насколько я знаю в O-нотации указывается верхняя граница сложности алгоритма. Т.е. гарантированно алгоритм выполниться за масимумум N*log(N) шагов

Автор: vinter 15.4.2009, 09:27
Цитата(GoldFinch @  15.4.2009,  09:17 Найти цитируемый пост)
это может значить что в одном случае N*log(N) а в другом 100*N*log(N)

с чего бы это?

Автор: Lazin 15.4.2009, 09:41
Цитата(vinter @  15.4.2009,  09:27 Найти цитируемый пост)
с чего бы это?

ну а почему мы обычно используем quik sort вместо merge sort? smile 

Автор: vinter 15.4.2009, 09:57
Lazin,  я тебя не понял, у алгоритма есть заявленная сложность. С чего бы ей увеличиваться?

Автор: Lazin 15.4.2009, 10:09
О оценка, это еще не все, что можно сказать о сложности алгоритма
к примеру, quick sort имеет сложность O(N*log N) в большинстве случаев, а в худшем случае O(N*N), а у bucket sort сложность - O(N), но константа перед этим N и большее использование памяти приводят к тому, что он работает медленнее чем обычный quick sort в большинстве случаев smile 

Автор: sdukshis 15.4.2009, 13:30
Цитата(zim22 @ 15.4.2009,  07:03)
Цитата(sdukshis @  14.4.2009,  22:00 Найти цитируемый пост)
В первом случае лучше считывать данные в структуру типа vector (с заранее выделенной памятью) 

зачем память заранее выделять? вектор умный - сам выделит и зарезервирует в придачу.

Цитата(sdukshis @  14.4.2009,  22:00 Найти цитируемый пост)
 или list...а сортировку производить стандартными алгоритмами.

если под сортировкой вы подразумеваете алгоритм sort из <algorithm>, то list в пролёте. у него BiDirrectional Iterators, а не RandomAccess. 
Хотя у list и есть встроенная функция-член sort, но мне кажется она работает медленнее, чем sort из <algorithm>

Проблему выбора между vector и list я вижу в следующем:

Оба эти контейнера умеют динамически увеличиваться в размере, но делают это по разному.

размер Vector растет как степень двойки, но при этом ему нужно осуществлять копирование элементов в новый участок памяти.
Поэтому если можно как-то оценить (я не говорю о точном кол-ве) размер входных данных, то можно pапросить выделение памяти всего 1 раз.

контейнер list запрашивает новую память при добавлении каждого элемента.

Отсюда и моё предложение, что лучше использовать vector если можно представить размер входных данных(например размер файла/среднюю длину строки).

Кроме того сортировка для vector может быть выполнена быстрее чем для list (может алгоритмическая сложность у них и одинакова, но просто попробуйте замерить на достаточно большом объёме данных, разница должна хорошо просматриваться).

Поиск повторений для обоих контейнеров примерно одинаковый, так что я за использование vector

Автор: zim22 15.4.2009, 13:36
Цитата(sdukshis @  15.4.2009,  13:30 Найти цитируемый пост)
лучше использовать vector если можно представить размер входных данных(например размер файла/среднюю длину строки).

полностью с вами соглашусь.

Автор: GoldFinch 15.4.2009, 18:25
zim22vinter, вы перед тем как пользоваться умным математическим понятием порядка сложности, O[f(N)] узнали бы что это означает. Конечно труъ программистам математика наверное не нужна, но бездумно пользоваться терминами тоже не хорошо.

какбэ фраза "сложность алгоритма имеет порядок O[g(N)]" означает что для функции сложности f(N) существует такая окрестность точки n при которой при N->n отношение f(x)/g(x) ограничено 
в других определениях можно найти варианты "предел f(x)/g(x) при N->n существует и не равен нулю" или "... при N стремящемся к бесконечности ..."

так вот это значит что 10*N = O[100*N]
а также значит что может существовать m, такое что при N<m O[N*N]<O[N], что вобщем-то очевидно, если представить график параболы y=x*x и прямой y=x для x<1 

Автор: vinter 15.4.2009, 18:57
Цитата(Lazin @  15.4.2009,  11:09 Найти цитируемый пост)
но константа перед этим N и большее использование памяти приводят к тому, что он работает медленнее чем обычный quick sort в большинстве случаев

отлично, но у нас нет никаких констант. Есть четкая верхняя граница.

Цитата(GoldFinch @  15.4.2009,  19:25 Найти цитируемый пост)
какбэ фраза "сложность алгоритма имеет порядок O[g(N)]" означает что для функции сложности f(N) существует такая окрестность точки n при которой при N->n отношение f(x)/g(x) ограничено в других определениях можно найти варианты "предел f(x)/g(x) при N->n существует и не равен нулю" или "... при N стремящемся к бесконечности ..."так вот это значит что 10*N = O[100*N]а также значит что может существовать m, такое что при N<m O[N*N]<O[N], что вобщем-то очевидно, если представить график параболы y=x*x и прямой y=x для x<1 

интересный экскурс, только причем он тут? O() это верхняя граница числа операций, которые могут быть пороизведены в данном алгоритме. И не надо никаких констант дописывать, туда, где их нет.

Автор: Lazin 15.4.2009, 19:08
lol

Автор: zim22 15.4.2009, 19:24
http://en.wikipedia.org/wiki/Big_O_notation
Цитата

A description of a function in terms of big O notation usually only provides an upper bound on the growth rate of the function

Автор: GoldFinch 15.4.2009, 19:37
Цитата(vinter @  15.4.2009,  19:57 Найти цитируемый пост)
O() это верхняя граница числа операций, которые могут быть пороизведены в данном алгоритме.

а O(1) это наверное 1 операция? на самом деле, это k операций, при этом k не зависит от N

zim22, "on the growth rate", вы понимаете разницу между самой функцией и ее производными?
скорость возрастания, это функция полученная из функции сложности, и в выражении O[g(N)] - g(N) это ее верхняя асимптотическая граница

Автор: vinter 15.4.2009, 19:43
GoldFinch, OMG ты читай, что тебе пишут, а не то что ты хочешь читать. Я тебе еще раз повтаряю  сложность это ВЕРХНЯЯ ГРАНИЦА.
Цитата(GoldFinch @  15.4.2009,  20:37 Найти цитируемый пост)
это ее верхняя асимптотическая граница

где разночтение с моими словами или zim22?

Автор: GoldFinch 15.4.2009, 19:50
vinter, верхняя граница чего? 
если алгоритм содержит 100*N операций, то его сложность O(N), а если он содержит 10*N операций, то его сложность тоже O(N)

и если алгоритм содержит 100000+N операций, его сложность тоже O(N), потому что предел отношения (100000+N)/N при N стремящемся к бесконечности конечен и не равен нулю, тоже самое и с пределом (10*N)/(100*N)

Автор: vinter 15.4.2009, 20:04
GoldFinch, дык, константа не зависит от N, естественно. Но в конкретном прмере не было никаких констант. Была конкретная сложность. Прямым текстом:
Цитата(standard)

Complexity: Approximately N log(N) (where N == last - first) comparisons on the average

Вот, все. После чего ты начал приплетать, какие то левые константы, которые вообще не имеют отношения к конкретной сложности...

Автор: GoldFinch 15.4.2009, 20:12
vinter, изначально разговор был о том, что у разных алгоритмов при одинаковой сложности O[g(N)] может быть разное время выполнения

Автор: vinter 15.4.2009, 20:22
GoldFinch, твоя правда. 

Автор: J0ker 15.4.2009, 22:09
сложность алгоритма сортировки показвает изенение времени выполнения при изменении n
прямого отношения к сравнению алгоритмов между собой это не имеет

Автор: vinter 16.4.2009, 05:26
Цитата(J0ker @  15.4.2009,  23:09 Найти цитируемый пост)
прямого отношения к сравнению алгоритмов между собой это не имеет

понятие сложнсти было придумано,как раз для сравнения алгоритмов. Так, что имеет.

Автор: J0ker 16.4.2009, 16:26
Цитата(vinter @ 16.4.2009,  05:26)
Цитата(J0ker @  15.4.2009,  23:09 Найти цитируемый пост)
прямого отношения к сравнению алгоритмов между собой это не имеет

понятие сложнсти было придумано,как раз для сравнения алгоритмов. Так, что имеет.

я сазал прямого отношения
big O между алгоритмами можно сравнивать исключительно после обсуждения сложности итерации
и понятие сложности было придумано в первую очередь для указания отношния времени выполнения к n

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)