GotAI.NET

Форум: Проблемы искусственного интеллекта

 

Регистрация | Вход

 Все темы | Новая тема Стр.4 (7)<< < Пред. | След. > >>   Поиск:  
 Автор Тема: На: Задачка на сообразительность
Дмитрий Пагода
Сообщений: 123
На: Задачка на сообразительность
Добавлено: 17 янв 19 9:44
Цитата:
Автор: гость

Да, всётаки Ваш код лучше, за счет утилизации временной переменной которая равна i он немного быстрее. Спасибо! Вы выйграли! В итоге буду юзать:


vector<int> mix(int N)
{
mt19937 mersenne(time(0));

int *a = new int[N];
for (int i = 0; i < N; i++) a[i] = i;
for (int i = 0; i < N; i++)
{
int p = mersenne() % (N);
a[i] = a[p];
a[p] = i;
}

vector<int> res(a, a + N);
delete[] a;
return res;
}
Это работающий код, но неправильный, небезопасный, в С++ в отличии от голого(naked) С придумали БЕЗОПАСНЫЕ конструкции, вектора, списки, смарт-указатели и ими и нужно пользоваться, не желательно а НУЖНО, это закон. Правильный, безопасный код для данного алгоритма следующий:


vector<int> mixsequence(int count)
{
vector<int> src, res;

for (int i = 0; i < count; ++i)
src.push_back(i);

for (int i = 0; i < count; ++i)
{
int n = rand() % src.size();
int v = src[n];
res.push_back(v);
src.erase(src.begin() + n);
}

return res;
}


Он не такой шустрый, но ПРАВИЛЬНЫЙ.
[Ответ][Цитата]
Вольфрамовый клaпaн
Сообщений: 13070
На: Задачка на сообразительность
+1
Добавлено: 17 янв 19 9:50
Цитата:
Автор: Дмитрий Пагода
Он не такой шустрый, но ПРАВИЛЬНЫЙ.

Мне кажется, что можно разделять managed C++ и С++, ровно как ANSI С и С++.
Managed C++ по сути от шарпа уже не отличается совсем.
[Ответ][Цитата]
dr2chek
Сообщений: 871
На: Задачка на сообразительность
Добавлено: 17 янв 19 13:46
Изменено: 17 янв 19 13:55
Цитата:
Автор: Михайло

new помимо выделения памяти производит инициализацию её, а это скорее всего избыточная операция, лошара. Хо-хо!

Инициализация будет только при явном указании такого оператора. А так - просто линейка байт с мусором из кучи.
[Ответ][Цитата]
гость
185.104.120.*
На: Задачка на сообразительность
Добавлено: 17 янв 19 16:21
Цитата:
Автор: Дмитрий Пагода

Это работающий код, но неправильный, небезопасный, в С++ в отличии от голого(naked) С придумали БЕЗОПАСНЫЕ конструкции, вектора, списки, смарт-указатели и ими и нужно пользоваться, не желательно а НУЖНО, это закон. Правильный, безопасный код для данного алгоритма следующий:


vector<int> mixsequence(int count)
{
vector<int> src, res;

for (int i = 0; i < count; ++i)
src.push_back(i);

for (int i = 0; i < count; ++i)
{
int n = rand() % src.size();
int v = src[n];
res.push_back(v);
src.erase(src.begin() + n);
}

return res;
}


Он не такой шустрый, но ПРАВИЛЬНЫЙ.
Одобряю код, 21 век на дворе, какие нах malloc и адресная арифметика...
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Задачка на сообразительность
Добавлено: 18 янв 19 0:37
Изменено: 18 янв 19 0:40
Цитата:
Автор: Дмитрий Пагода
Он не такой шустрый, но ПРАВИЛЬНЫЙ.

Вечная битва между удобством и безопасностью.
По-моему, "дольше в 130 раз" - это не удобно. Насчёт правильности: вряд ли Вы посмотрите, что там Радж Вуховамнсцалл напорол в якобы стандартной открытой библиотеке.
Вот, например, инициализация ГСЧ на числах Мерсенна в виде, который я привёл, работает не всегда.
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Задачка на сообразительность
Добавлено: 18 янв 19 0:45
Цитата:
Автор: mss

пардонте... а так?


vector<int> mix(int N)
{
mt19937 mersenne(time(0));

int *a = new int[N]; // здесь должны быть нули я пологаю

int next = 0;
for (int i=0; i < N; ){
int p = mersenne() % (N);
a[i] = a[p];
a[p] = ++next;
for(; i<N && a[i]!=0; i++);
}

vector<int> res(a, a + N);
delete[] a;
return res;
}

Подумайте ещё.
Кстати, миллион инкрементов - это ни о чём, а вот что-то тяжёлое на каждой итерации - это фууууу.
[Ответ][Цитата]
гость
77.247.181.*
На: Задачка на сообразительность
Добавлено: 18 янв 19 5:52
Цитата:
Автор: mss

пардонте... а так?


vector<int> mix(int N)
{
mt19937 mersenne(time(0));

int *a = new int[N]; // здесь должны быть нули я пологаю

int next = 0;
for (int i=0; i < N; ){
int p = mersenne() % (N);
a = a[p];
a[p] = ++next;
for(; i<N && a[i]!=0; i++);
}

vector<int> res(a, a + N);
delete[] a;
return res;
}
да, работает, только нужно инициализировать массив нулями(new int[N]()) скобочками, но выйграша нет, даже небольшой минус(~5-7%) как верно рассудил Кондрат
Цитата:
[i]Автор: kondrat
Кстати, миллион инкрементов - это ни о чём, а вот что-то тяжёлое на каждой итерации - это фууууу.
[Ответ][Цитата]
гость
77.247.181.*
На: Задачка на сообразительность
Добавлено: 18 янв 19 5:55
Цитата:
Автор: Дмитрий Пагода

Это работающий код, но неправильный, небезопасный, в С++ в отличии от голого(naked) С придумали БЕЗОПАСНЫЕ конструкции, вектора, списки, смарт-указатели и ими и нужно пользоваться, не желательно а НУЖНО, это закон. Правильный, безопасный код для данного алгоритма следующий:


vector<int> mixsequence(int count)
{
vector<int> src, res;

for (int i = 0; i < count; ++i)
src.push_back(i);

for (int i = 0; i < count; ++i)
{
int n = rand() % src.size();
int v = src[n];
res.push_back(v);
src.erase(src.begin() + n);
}

return res;
}


Он не такой шустрый, но ПРАВИЛЬНЫЙ.
юродивых на кислород, вместе с КВ, лечитесь гденибуть в другом месте
[Ответ][Цитата]
mss
Сообщений: 2659
На: Задачка на сообразительность
Добавлено: 18 янв 19 10:00
Цитата:
Автор: kondrat
Подумайте ещё.
Кстати, миллион инкрементов - это ни о чём, а вот что-то тяжёлое на каждой итерации - это фууууу.


И подумал и проверил.

Total 2 = 2.28 mls for N=100,000
Total 1 = 3.03 mls for N=100,000

Вы правы. И код с запашком и одно проходная схема на 30% медленнее - нету Mechanical Sympathy кто понимает.

[Ответ][Цитата]
Дмитрий Пагода
Сообщений: 123
На: Задачка на сообразительность
Добавлено: 18 янв 19 10:44
Цитата:
Автор: kondrat
Вечная битва между удобством и безопасностью.
По-моему, "дольше в 130 раз" - это не удобно. Насчёт правильности: вряд ли Вы посмотрите, что там Радж Вуховамнсцалл напорол в якобы стандартной открытой библиотеке.
Вот, например, инициализация ГСЧ на числах Мерсенна в виде, который я привёл, работает не всегда.
Это кто тут блять Радж Вуховамнсцалл??? Не умничайте мистер, не то мигом на место поставлю, сразу видно что вы в армии не служили и в большой софтверной компании не работали, если несёте такую чепуху. Это дома у себя можете писать что угодно, но не дай Бог показывать это кому то, или публиковать на гитхабе, яйца отнимут. Держите себя в руках.
[Ответ][Цитата]
гость
145.239.91.*
На: Задачка на сообразительность
Добавлено: 18 янв 19 12:22
Цитата:
Автор: Дмитрий Пагода
Это кто тут блять Радж Вуховамнсцалл???
Я думаю Кондратия не стоит позорить за неопытность, в каком то смысле лн даже "прав", если бы мир был идеален, политики честными а главная цель - всеобщее благо, но мир не таков, порой черное становится белым в реальности.
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Задачка на сообразительность
Добавлено: 18 янв 19 17:54
Цитата:
Автор: Дмитрий Пагода

Это кто тут блять Радж Вуховамнсцалл??? Не умничайте мистер, не то мигом на место поставлю, сразу видно что вы в армии не служили и в большой софтверной компании не работали, если несёте такую чепуху. Это дома у себя можете писать что угодно, но не дай Бог показывать это кому то, или публиковать на гитхабе, яйца отнимут. Держите себя в руках.

130 раз, Карл! Это страшно. Представьте себе эксперимент, который вместо суток идёт 4 месяца. Так в космос не полетим.
[Ответ][Цитата]
Дмитрий Пагода
Сообщений: 123
На: Задачка на сообразительность
Добавлено: 19 янв 19 9:18
Цитата:
Автор: kondrat


130 раз, Карл! Это страшно. Представьте себе эксперимент, который вместо суток идёт 4 месяца. Так в космос не полетим.
Да хоть в тысячу, не это важно, есть таски и правила, в некоторых конторах вообще за использование указателей и голых массивов сразу уволят, сейчас гребцы не как раньше универсалы, про космос мало думают, делают что прописано. Гребцы как салдафоны должны быть, вообще служба в армии полезно для современного конторского кодера, многие необходимые скилы воспитывает.
[Ответ][Цитата]
гость
188.170.192.*
На: Задачка на сообразительность
Добавлено: 19 янв 19 12:29
Небольшое улучшение. Предыдущий код выполнялся у меня 375 мс. Этот код выполняется 266 мс. Все осталось на местах, только добавилось одно условие

int a=1000000;
int i=0;
int s=0;
int prom=0;

int * data = new int [a]; for (i=0; i<a; i++) {data[i]=i;}

for (i=0; i<a; i++)
{
if (data[i]==i)//меняем местами только те элементы, которые еще не меняли.
{
s= random(a);
prom = data[s]; data[s]= data[i]; data[i]= prom;
}
}
[Ответ][Цитата]
Вольфрамовый клaпaн
Сообщений: 13070
На: Задачка на сообразительность
Добавлено: 19 янв 19 12:31
Изменено: 19 янв 19 12:34
Большая просьба к форумчанам - используйте тэги 'code' для оформления оного, чтобы было красиво, форматирование и не нужно было вглядываться в команды.
[Ответ][Цитата]
 Стр.4 (7)1  2  3  [4]  5  6  7<< < Пред. | След. > >>