GotAI.NET

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

 

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

 Все темы | Новая тема Стр.2 (7)<< < Пред. | След. > >>   Поиск:  
 Автор Тема: На: Задачка на сообразительность
гость
77.247.181.*
На: Задачка на сообразительность
Добавлено: 16 янв 19 11:31
Цитата:
Автор: Михайло

Когда вы пишете код, указанный мною выше, вы по сути пишете на языке очень и очень близком к ассемблеру. Не удивлюсь, если Си-шарп сикнет.
На самом деле чаще не так, то что на C# делаетеся пару строчками, на С++ если использовать такого же типа высокоуровневые классы чаще получается намного медленнее, а если опускаться совсем на дно адресной арифметики то такой код практически невозможно сапортить.
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Задачка на сообразительность
Добавлено: 16 янв 19 11:34
Цитата:
Автор: Эгг

Правда? Ну тогда дополнительный вопрос: чем отличается * от **?

Двойная звездочка (**) - это указатель на указатель. Указатель это по сути адрес в памяти. Соответственно переменная, объявленная как указатель на указатель, содержит адрес. Если посмотреть содержимое того адреса, то там обнаружится другой адрес. По тому адресу уже лежит число объявленного типа.

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

При этом надо помнить, что для трехмерного массива нужно выделить память функцией malloc() уже во вложенном цикле двойной глубины. А для четырехмерного массива цикл уже тройной глубины... Разыменовывание с целью доступа к числу требует уже тройное и четверное разыменовывание...
[Ответ][Цитата]
Вольфрамовый клaпaн
Сообщений: 13070
На: Задачка на сообразительность
Добавлено: 16 янв 19 11:38
Цитата:
Автор: Михайло
Двойная звездочка (**) - это указатель на указатель.

Это было понятно. Как используется? И у тебя в цитате ошибка...

Цитата:
Автор: Михайло
При этом надо помнить, что для трехмерного массива нужно выделить память функцией malloc() уже во вложенном цикле двойной глубины.

То есть для задания трехмерной матрицы мы должны использовать ***?
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Задачка на сообразительность
Добавлено: 16 янв 19 11:42
Изменено: 16 янв 19 11:43
Цитата:
Автор: Эгг

Это было понятно. Как используется?

Ну я же написал: используется так seq[m][n] или путем разыменовывания указателя.

Цитата:
Автор: Эгг
То есть для задания трехмерной матрицы мы должны использовать ***?

Ага.
[Ответ][Цитата]
Вольфрамовый клaпaн
Сообщений: 13070
На: Задачка на сообразительность
Добавлено: 16 янв 19 11:50
Не понял ты смысл двух звездочек... Делаю вывод, что не писал на сях...
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Задачка на сообразительность
Добавлено: 16 янв 19 12:13
В смысле "не понял"? Я тебе покажу на ассемблере, что означает одна звездочка, две звездочки и три...
[Ответ][Цитата]
гость
188.170.198.*
На: Задачка на сообразительность
Добавлено: 16 янв 19 12:15
Цитата:
Автор: гость

спасибо конечно, но это элементарные занания, я имел в виду показать как решить поставленную задачу за 100мс на миллион элементов


ну, если комп не самый древний, то следующий код выполнится где-то за 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;
}
[Ответ][Цитата]
Вольфрамовый клaпaн
Сообщений: 13070
На: Задачка на сообразительность
Добавлено: 16 янв 19 12:16
Изменено: 16 янв 19 12:17
Цитата:
Автор: Михайло
В смысле "не понял"? Я тебе покажу на ассемблере, что означает одна звездочка, две звездочки и три...

1960 год, съезд КПСС, сидят председатель колхоза и знатная доярка.
- Мань, хочешь я тебе Келдыша покажу?
- Ой, Василь Степаныч, давайте в гостинице...



Не нужно мне на ассемблере ничего показывать... мне твоего malloc'а на с++ хватило...
[Ответ][Цитата]
mss
Сообщений: 2659
На: Задачка на сообразительность
Добавлено: 16 янв 19 23:10
Изменено: 17 янв 19 7:00
Давненько я не брал в руки С++, но уверен что будет быстрее чем на джаве, а на джаве эта задачка решается за 32 млс и за 4 строчки - Intel{R} Core(TM) i7-3630QM CPU @ 2.40GHz, Java 1.8.045

import java.util.Arrays;
import java.util.Random;

public static void main(String[] args) {
long total = -System.currentTimeMillis();

int N=1000000;
int[] n = null;

Random rand = new Random();
for(int t=0; t<1000; t++){

// Однопроходный алгоритм перемешивания целых от 1 до N
n = new int[N];
for(int i=0,next=0,r; i<N; ){

r=rand.nextInt(N);
n[i] = n[r];
n[r] = ++next;
for(; i<N && n[i]!=0; i++);
}
// Конец алгоритма

}
total += System.currentTimeMillis();

// Total=31.81 mls for N=1'000'000
System.out.printf("Total=%.2f mls", total/1000.0);

// [10, 9, 7, 1, 6, 2, 5, 3, 8, 4] for N=10
// System.out.println(Arrays.toString(n));
}
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Задачка на сообразительность
Добавлено: 16 янв 19 23:41
Цитата:
Автор: КВ

А кто сказал, что у меня с головой всё в порядке… Есть решения простые и долгие, а есть сложные но быстрые…

Нужно соблюдать баланс… У вас тоже проблемы, но не с головой а с программированием…. УЧИТЕСЬ !!!

Плюс в теории вероятностей - вы дилетант…
Пожалуй, соглашусь с КВ, хоть и не знаю Сишарпа.
[Ответ][Цитата]
mss
Сообщений: 2659
На: Задачка на сообразительность
Добавлено: 17 янв 19 0:32
Присоединяюсь к Кондрату!

Браво КВ!
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Задачка на сообразительность
Добавлено: 17 янв 19 1:11
Изменено: 17 янв 19 1:45
Цитата:
Автор: mss

Присоединяюсь к Кондрату!

Браво КВ!

Присоединяюсь и одобряю код 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;


[Ответ][Цитата]
rrr3
Сообщений: 11857
На: Задачка на сообразительность
Добавлено: 17 янв 19 1:14
Изменено: 17 янв 19 1:15

И почему люди не занимаются тем, что им интересно и тем, что они умеют, а лезут в далекие от них какие-то СИИ!
Хорошая ветка для кодеров! Вот и форум для них есть хороший - http://www.cyberforum.ru
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Задачка на сообразительность
Добавлено: 17 янв 19 1:27
Цитата:
Автор: rrr3


И почему люди не занимаются тем, что им интересно и тем, что они умеют, а лезут в далекие от них какие-то СИИ!
Хорошая ветка для кодеров! Вот и форум для них есть хороший - http://www.cyberforum.ru

Патамушта СИИ не появится, если не писать, например, вот такие строки:

#define MAIN_CPP

#include <random>
#include <ctime>
//#include <sstream>

#ifndef RFX_HPP
#include <rfx.hpp>
#endif

int main()
{
const long N = 999999;
long *a, i, p;
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;
Tournament t;
t.set();
return 0;
}


[Ответ][Цитата]
rrr3
Сообщений: 11857
На: Задачка на сообразительность
Добавлено: 17 янв 19 1:45
Цитата:
Автор: kondrat
Патамушта СИИ не появится, если не писать, например, вот такие строки:

Судя по всему, Вы хотели сказать, что он появится обязательно, если написать, например, "вот такие строки"... Что же, это вполне в рамках типично Вашей логики! Будет мед будут и пчелы...
[Ответ][Цитата]
 Стр.2 (7)1  [2]  3  4  5  6  7<< < Пред. | След. > >>