|
| |
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 2:03
|
Автор: kondrat Без умения писать строки, - точно не появится. |
|
Совершенно точно, как и без умения говорить, пить, смотреть, читать, просыпаться утром, засыпать вечером и т.д. и т.п. Вы на редкость проницательны!
|
|
|
| |
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 5:06
|
Автор: гость
ну, если комп не самый древний, то следующий код выполнится где-то за 100-200 мс:
//C++ Builder
int a=1000000; //количество элементов в массиве int i=0; //счетчик цикла int s=0; //переменная, содержащая случайный номер элемента массива int prom=0; //вспомогательная переменная
//массив со значениями и инициализация его (от 1 до а) int * data = new int [a]; for (i=0; i<a; i++) {data[i]=i;}
//проходим весь массив по порядку и для каждого элемента подбираем //случайную пару, далее меняем их местами for (i=0; i<a; i++) { s= random(a); //меняем местами порядковый элемент и случайно выбранный prom = data[s]; data[s]= data[i]; data[i]= prom; } |
|
О!!! Сразу видно руку мастера! Спасибо! То что доктор прописал! Всё как Вы сказали 100-200мс Не зря советовали мне этот форум, как хотя и бесноватый, но с присутствием реальных профи.
|
|
|
| |
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 7:07
Изменено: 17 янв 19 7:10
|
Дело не в кодинге.
Во первых моська бросила вызов.
Во вторых - голову нельзя заставить не работать. Верно и обратное.
77.247 - вам понадобилось 2млн итераций.
А слабо за 1млн?!
Или фантазии не хватает...
PS И перестаньте комментировать каждую строчку кода. Уж лет так 10 это плохой стиль. Комментарий - признак тухлятины (code smell)
|
|
|
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 8:13
|
Автор: kondrat
Присоединяюсь и одобряю код mss. Вот, ваще летает, и каждый раз по-новому, с хорошим качеством:
const long N = 999999; long *a, p, i; mt19937 mersenne(static_cast<unsigned int>(time(0)));
a = new long[N+1]; for (i=0; i<N+1; i++) a[i]=i; cout << "a[N] = " << a[N] << endl; for (i=0; i<N+1; i++) { p = mersenne()%(N+1); a[i] = a[p]; a[p] = i; } cout << "a[N] = " << a[N] << endl; delete a;
|
|
Да, всётаки Ваш код лучше, за счет утилизации временной переменной которая равна 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; }
|
|
|
| |
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 8:38
|
Автор: гость
for (int i = 0; i < N; i++) a[i] = i+1; for (int i = 0; i < N; i++){***}
|
|
Итого - 2млн итераций Для тех кто на бронепоезде повторяю - за 1млн int next = 0; for (int i=0; i < N; ){ int p = mersenne() % (N); a[i] = a[p]; a[p] = ++next; for(; i<N && n[i]!=0; i++); }
|
|
|
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 8:43
|
Хе-хе. Если вам нужно ускорить какой-то код, смотрите в сторону malloc/free, которые хоть и кодонебезопасны, но более низкоуровневые и гибкие.
|
|
|
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 8:55
|
Автор: Михайло
Хе-хе. Если вам нужно ускорить какой-то код, смотрите в сторону malloc/free, которые хоть и кодонебезопасны, но более низкоуровневые и гибкие. |
|
в цпп new/delete тоже самое, только короче, 1 в 1, нет ни % издержек, учите матчасть салага
|
|
|
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 9:02
|
new помимо выделения памяти производит инициализацию её, а это скорее всего избыточная операция, лошара. Хо-хо!
|
|
|
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 9:10
|
Автор: mss
Итого - 2млн итераций
Для тех кто на бронепоезде повторяю - за 1млн
int next = 0; for (int i=0; i < N; ){ int p = mersenne() % (N); a[i] = a[p]; a[p] = ++next; for(; i<N && n[i]!=0; i++); }
|
|
что за n[i]? напишите полный код плиз, у меня не вышло чтото разумное с ним пока получить
|
|
|
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 9:34
Изменено: 17 янв 19 9:37
|
int data[1000000]; int buf[1000000]; // инициализация массива for int (i=0; i<1000000;i++) { data[i]=i; buf[i]=irand()%999000000; } // Дальше применяем алгоритм быстрой сортировки, в связке data и buf // Быстрая сортировка - вики
|
|
|
|
На: Задачка на сообразительность
Добавлено: 17 янв 19 9:39
Изменено: 17 янв 19 9:41
|
Автор: гость что за n[i]? напишите полный код плиз, у меня не вышло чтото разумное с ним пока получить |
|
пардонте... а так? 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; }
|
|
|
|