powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Мера неупорядоченности линейного массива и некоторые вопросы
25 сообщений из 53, страница 2 из 3
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079388
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

я вот читал-читал, а вы сделать-то что пытаетесь?
функциональный аналог массива делается на весо-сбалансированных бинарных деревьях, вставка-удаление O(log(N)), поиск элемента по номеру тоже на них легко делается - O(log(N))

если нужно по-быстрому, то на декартовых с поддержкой агрегации

но тот же массив на малых объёмах проигрывает обычному - за исключенеим случаев массовых операций
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079437
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tдля data[8] можно сразу взять cnt_tree[2][0], но у меня посчитается cnt_tree[0][3]+cnt_tree[0][2]+cnt_tree[1][0]
data[9] будет cnt_tree[0][4]+cnt_tree[1][1]+cnt_tree[1][0] хотя можно было cnt_tree[0][4]+cnt_tree[2][0]
Небольшой задел для оптимизации есть :)
Поправил. Не зря расписывал, сам лучше понял как работает. Теперь 8 млн. за 1.59 сек. (было 1.84 сек.)
Версия 2.1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
#include <vector>
#include <algorithm>
bool compare_int_ptr(int* i,int* j) { return (*i < *j); }
// С сортировкой и деревом счетчиков
void with_counter_tree(int* data, int* res)
{
	timer t;
	// Подготовка индекса с порядком обхода
	std::vector<int*> idx(TEST_SIZE);
	for(int i = 0; i < TEST_SIZE; i++) idx[i] = &data[i];
	std::sort(idx.begin(), idx.end(), compare_int_ptr);
	// Инициализация дерева счетчиков
	std::vector<std::vector<int>> cnt_tree;
	for(int i = 2; i < TEST_SIZE; i <<= 1) {
		cnt_tree.resize(cnt_tree.size() + 1);
		cnt_tree.back().resize(TEST_SIZE / i + 1);
	}
	int cnt_levels = cnt_tree.size();
	// Расчет
	for(int i = 0; i < TEST_SIZE; i++) {
		int pos = idx[i] - data; // индекс минимального элемента в data
		res[pos] = pos;
		// подсчет кол-ва меньших data[pos]
		for(int l = 0, j = pos - 1; l < cnt_levels && j >= 0; l++) {
			j >>= 1;
			if((j & 1) == 0) {
				res[pos] -= cnt_tree[l][j];
				j--;
			};
		}
		// увеличение счетчиков заполненных
		for(int l = 0, j = pos; l < cnt_levels; l++) {
			j >>= 1;
			cnt_tree[l][j]++;
		}
	}
	printf("Counters tree %s\n", t.value());
}

...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079462
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)SashaMercury,

я вот читал-читал, а вы сделать-то что пытаетесь?
Тут Саша человеческим языком писал 18265745 Наиболее точно ТЗ описывает этот пост
SashaMercuryЕсли упростить задачу, то у нас есть неупорядоченный массив с уникальными элементами. Для каждого элемента мне нужно определить сколько элементов до него(слева от него) больше него
Есть уточнения.
SashaMercuryникакие элементы в список не добавляются. Один раз добавятся и всё. Дальше будут только удаляться. В цикле. На каждой итерации цикла мне нужно искать минимальный элемент и мне необходимо узнать сколько элементов от него слева. Удаляю этот элемент и проделываю аналогичные действия. Итерации продолжаются пока есть элементы
kealon(Ruslan)функциональный аналог массива делается на весо-сбалансированных бинарных деревьях, вставка-удаление O(log(N)), поиск элемента по номеру тоже на них легко делается - O(log(N))
Про деревья в том топике предлагали. Я не большой знаток деревьев, точнее теорию знаю, реально ни разу не использовал. Все пытаюсь понять как решать деревом эту задачу. Даже если мы в каждом узле будем хранить сколько в его окончаниях листьев, то все равно потребуется обход достаточно большого количества узлов чтобы посчитать сколько листьев перед свеже вставленным. Заметно больше чем log2(n)
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079487
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это дерево отрезков, классическя олимпиадная задачка,
в кажом узле дерева хранится min, max и количество элементов в дереве
SashaMercuryЗдравствуйте.
Подскажите пожалуйста, существует ли структура данных(организована линейно) со следующими характеристиками:
1. Поиск индекса минимального/максимального элемента

поиск O(Log(N))
SashaMercury2. Удаление элемента

вставка-удаление O(Log(N))

Dima TПро деревья в том топике предлагали. Я не большой знаток деревьев, точнее теорию знаю, реально ни разу не использовал. Все пытаюсь понять как решать деревом эту задачу. Даже если мы в каждом узле будем хранить сколько в его окончаниях листьев, то все равно потребуется обход достаточно большого количества узлов чтобы посчитать сколько листьев перед свеже вставленным. Заметно больше чем log2(n)
не больше, завтра постараяюсь написать, к сожалению времени в последнее время особо нет
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079500
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне, вообще говоря, интересна 2 постановкаСаша вы молодец!
Очень интересно было бы посмотреть /поучаствовать/ в дискуссиях:

- виды деревьев, применимость их и способы представления в памяти и на диске;

- форматы данных и способы их представления в памяти и на диске.
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079502
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)не больше, завтра постараяюсь написать, к сожалению времени в последнее время особо нет
Не забудь. Интересно. Обещаю затестить в равных условиях со своими поделками.
Я тут заготовку для тестов давал 18274025
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079507
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМожет быть я не так перевожу, но в англоязычной литературе встречается термин superlinear function. Скорость роста данной функции выше чем у линейной функции, например, асимптотика quick sort принадлежит классу superlinear function, и составляет . Так и тут
Роберт Седжвик пишет об этой функции
N Log N - Время выполнения, пропорциональное N log N имеет место когда алгоритм
решает задачу разбивая ее на подзадачи меньших размеров, решая их независимо и затем
объединяя решения. Из за отсутствия подходящего прилагательного ("линерифмический" -
linerihmic ?) мы просто говорим что время выполнения такого алгоритма равно N log N.
Когда N равно 1000 000, N log N возрастает примерно до 20 млн. Когда N удваивается
то время N log N возрастает более чем вдвое (но не намного более).
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079593
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan) я вот читал-читал, а вы сделать-то что пытаетесь?

В первом посте этого топика отправил код. Продублирую
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
#include <stdio.h>
#include <stdlib.h>

struct node
{
	int value;//key
	int counter;//number of elements in the tree over then current at time of adding
	int counter_r;//number of elements right subtree
	node *left, *right;
	void print();
};

void node::print()
{
	printf("%i %i %i   \n", value, counter_r, counter);
}

class tree
{
	node* root;
	int measure;
	void insert(node*& n, int v, int c);
	void print(node* n);
	void measure_calculate(node* n);
public:
	tree();
	tree(int* a, size_t n);
	void print();
	void measure_calculate();
	int measure_get();
};

tree::tree()
{
	root = NULL;
	measure = 0;
}

tree::tree(int* a, size_t n)
{
	root = NULL;
	measure = 0;
	for (int i = 0; i < n; ++i){
		this->insert(root, a[i], 0);
	}
}

void tree::insert(node*& n, int v, int c)
{
	node* cur;
	if (n == NULL){
		cur = (node*)malloc(sizeof(node)* 1);
		cur->value = v;
		cur->left = NULL;
		cur->right = NULL;
		cur->counter_r = 0;
		cur->counter = c;
		n = cur;
	}
	else{
		if (n->value > v){
			this->insert(n->left, v, c + n->counter_r + 1);
		}
		else{
			n->counter_r += 1;
			this->insert(n->right, v, c);
		}
	}
}

void tree::print()
{
	print(root);
}

void tree::print(node* n)
{
	if (n){
		print(n->left);
		n->print();
		print(n->right);
	}
}


void tree::measure_calculate()
{
	measure_calculate(root);
}

void tree::measure_calculate(node* n)
{
	if (n){
		measure_calculate(n->left);
		measure += n->counter;
		measure_calculate(n->right);
	}
}

int tree::measure_get()
{
	return measure;
}


int main()
{
	int b[11] = { 17, 5, 18, 1, 3, 4, 7, 11, 85, 8, 9 };
	tree t(b, 11);
	t.measure_calculate();
	printf("%i\n", t.measure_get());
	return 0;
}
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079598
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_Tберем pos-1 находим для него счетчик нулевого уровня, если начало счетчика не совпадает с началом счетчика следующего уровня, то берем предыдущий счетчик, начала уровней совпало - переходим на уровень выше и берем там предыдущий и т.д.
Например для подсчета сколько перед data[7] складываем cnt_tree[0][3]+cnt_tree[0][2]+cnt_tree[1][0]
для data[8] можно сразу взять cnt_tree[2][0], но у меня посчитается cnt_tree[0][3]+cnt_tree[0][2]+cnt_tree[1][0]
data[9] будет cnt_tree[0][4]+cnt_tree[1][1]+cnt_tree[1][0] хотя можно было cnt_tree[0][4]+cnt_tree[2][0]
Небольшой задел для оптимизации есть :)

Принцип понятен?
Мне кажется что данный алгоритм аналогичен алгоритму выше. Только у меня дерево фигурирует явно, а у тебя нет. Если я всё правильно понял
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079632
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне кажется что данный алгоритм аналогичен алгоритму выше. Только у меня дерево фигурирует явно, а у тебя нет. Если я всё правильно понял
Потестил твой код на скорость.
ЭлементовДерево (сек.)Версия 2.1 (сек.)100 тыс.0.070.02200 тыс.0.270.04400 тыс.0.390.07800 тыс.4.230.141600 тыс.3.730.31
Смотрим не на время, а на скорость прироста в разах. Твой растет быстрее и как-то неравномерно.
Вот еще замер, от количества элементов зависит как они перемешаются.
ЭлементовДерево (сек.)Версия 2.1 (сек.)8000004.230.148000011.950.148000021.420.148000031.850.14
Деревья могут вырождаться, тогда производительность от их использования резко падает. Похоже это твой это случай. Не могу точно сказать, как выше писал не силен в деревьях.

Как минимум у тебя в коде надо оптимизировать выделение памяти. malloc() для каждого элемента - это не быстро. Сколько элементов будет в итоге примерно известно. Выдели сразу кусок памяти и выдавай оттуда по одному элементу, кончится - еще кусок.
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079638
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил C:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
#include <stdio.h>
#include <stdlib.h>

struct node
{
	int value;//key
	int counter;//number of elements in the tree over then current at time of adding
	int counter_r;//number of elements right subtree
	node *left, *right;
	void print();
};

void node::print()
{
	printf("%i %i %i   \n", value, counter_r, counter);
}

class tree
{
	node* root;
	int measure;
	node* buf;
	void insert(node*& n, int v, int c, size_t num_buf);
	void print(node* n);
	void measure_calculate(node* n);
public:
	tree();
	tree(int* a, size_t n);
	void print();
	void measure_calculate();
	int measure_get();
};

tree::tree()
{
	root = NULL;
	measure = 0;
	buf = NULL;
}

tree::tree(int* a, size_t n)
{
	root = NULL;
	measure = 0;
	buf = (node*)malloc(sizeof(node)*n);
	for (int i = 0; i < n; ++i){
		this->insert(root, a[i], 0, i);
	}
}

void tree::insert(node*& n, int v, int c, size_t num_buf)
{
	node* cur=buf+num_buf;
	if (n == NULL){
		cur->value = v;
		cur->left = NULL;
		cur->right = NULL;
		cur->counter_r = 0;
		cur->counter = c;
		n = cur;
	}
	else{
		if (n->value > v){
			this->insert(n->left, v, c + n->counter_r + 1, num_buf);
		}
		else{
			n->counter_r += 1;
			this->insert(n->right, v, c, num_buf);
		}
	}
}

void tree::print()
{
	print(root);
}

void tree::print(node* n)
{
	if (n){
		print(n->left);
		n->print();
		print(n->right);
	}
}


void tree::measure_calculate()
{
	measure_calculate(root);
}

void tree::measure_calculate(node* n)
{
	if (n){
		measure_calculate(n->left);
		measure += n->counter;
		measure_calculate(n->right);
	}
}

int tree::measure_get()
{
	return measure;
}


int main()
{
	int b[11] = { 17, 5, 18, 1, 3, 4, 7, 11, 85, 8, 9 };
	tree t(b, 11);
	t.measure_calculate();
	printf("%i\n", t.measure_get());
	return 0;
}

...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079651
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стало быстрее
ЭлементовДерево 1.0 (сек.)Дерево 1.1 (сек.)8000004.232.998000011.951.328000021.420.908000031.851.25
Но неравномерность не исчезла. Надо алгоритм допиливать.
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079739
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне кажется что данный алгоритм аналогичен алгоритму выше. Только у меня дерево фигурирует явно, а у тебя нет. Если я всё правильно понял
Почитал немного про деревья. Думаю разница именно в сбаллансированности дерева. Классическое дерево при наполнении вырождается, поэтому есть более продвинутые алгоритмы чтобы этого избегать: АВЛ-дерево , Красно-чёрное дерево

Там упоминают
... контейнеры set и map в большинстве реализаций библиотеки STL языка C++[2], класс TreeMap языка Java[3], так же, как и многие другие реализации ассоциативного массива в различных библиотеках, основаны на красно-чёрных деревьях.


Думаю отсюда можно предположить что заполнение std::set будет примерно таким же по времени как и при решении твоей задачи. Т.е. считаем что std::set это идеально реализованное дерево.
Затестил такой код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <set>
void with_set(int* data, int* res)
{
	timer t;
	std::set<int> tree;
	tree.get_allocator().allocate(TEST_SIZE);
	for(int i = 0; i < TEST_SIZE; i++) {
		// добавляем элемент
		tree.insert(data[i]);
	}
	printf("Fill tree %s\n", t.value());
	timer t2;
	tree.clear();
	printf("Clear tree %s\n", t2.value());
}


Результаты
ЭлементовДерево 1.0 (сек.)Дерево 1.1 (сек.)Fill setClear set8000004.232.990.437.48000011.951.320.433.678000021.420.900.420.428000031.851.250.433.13
Скорость заполнения стабильная, но все тормоза почему-то перешли на очистку. Причем общее время пропорционально твоему. Интересно. Похоже MS коряво очистку реализовал. Надо в линуксе потестить.

PS Ты в своем коде освобождение памяти забыл добавить.
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079747
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДеревья могут вырождаться, тогда производительность от их использования резко падает. Похоже это твой это случай. Не могу точно сказать, как выше писал не силен в деревьях. Могут, если не балансировать. Пока не сделаешь сбалансированное дерево проводить измерения времени нет смысла. Результат будет сильно зависеть от исходных данных.
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39079774
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T Похоже MS коряво очистку реализовал. Надо в линуксе потестить.
Разобрался. Из-за отладчика у МС тормоза даже при запуске в релизе. Позапускал просто exe. Нет тормозов.
Заполнение стабильно 0.13 сек. Очистка 0.07 сек. Мой код в обоих вариантах 0.14 сек.

Потестил в линуксе. Железо тоже самое. Компилятор g++ 4.7.2
Заполнение 800 тыс. в std::set стабильно 0.07 сек, очистка 0.02 сек. Мой код даже чуть дольше виндового варианта 0.17 сек.
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39080021
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Попробую поправить
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39080598
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет всем
понял теперь вашу задачку

Index любого элемента так просто не найдёшь, это да

Dima T, тут что-то хитрее надо
на постоянном массиве достаточно "пронумеровать" массив и отсортировать этот индекс по значению
быстрее чем дерево будет

SashaMercury, а элементы действительно нужно удалять и вставлять?
может саму задачу скажешь зачем тебе такая структура?
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39080610
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima T, тут что-то хитрее надо
ИМХУ Сашино дерево из первого поста взлетит если балансировку добавить.
kealon(Ruslan)на постоянном массиве достаточно "пронумеровать" массив и отсортировать этот индекс по значению
быстрее чем дерево будет
Разверни свою мысль поподробней. Как пронумеровать? Я тоже об этом думал. Ничего не придумал.

kealon(Ruslan)SashaMercury, а элементы действительно нужно удалять и вставлять?
может саму задачу скажешь зачем тебе такая структура?
На 99% уверен что задачка академическая из серии олимпиадных. Саша несколько задач отсюда уже выносил на местное обсуждение.
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39080748
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)на постоянном массиве достаточно "пронумеровать" массив и отсортировать этот индекс по значению
быстрее чем дерево будет
положим, у нас массив уже упорядочен. Что нам даст нумерация его элементов?

Номер элемента совпадает с индексом, значит слева нет "лишних" элементов.

Пусть в исходном массиве первый элемент не на своем месте. После сортировки он встанет на место n, а элементы от 2 до n сдвинутся. У этих элементов номер будет на 1 больше индекса. У переставленного элемента номер 1 на n меньше индекса n+1. Остальные элементы остались на своих местах.

Только сложность алгоритма быстрой сортировки может достигать О(N*N).
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39080764
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал статью Тадао Такаока(учёный не так давно решивший новым способом проблему Maimum subarray sum) о новых мерах энтропии неупорядоченного массива, захотел посмотреть алгоритмы работы со старыми. Информации особой по реализации не нашёл, потому решил самостоятельно этим заняться
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39080784
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabkealon(Ruslan)на постоянном массиве достаточно "пронумеровать" массив и отсортировать этот индекс по значению
быстрее чем дерево будет
положим, у нас массив уже упорядочен. Что нам даст нумерация его элементов?

Номер элемента совпадает с индексом, значит слева нет "лишних" элементов.

Пусть в исходном массиве первый элемент не на своем месте. После сортировки он встанет на место n, а элементы от 2 до n сдвинутся. У этих элементов номер будет на 1 больше индекса. У переставленного элемента номер 1 на n меньше индекса n+1. Остальные элементы остались на своих местах.

в индексе будут позиции элементов в исходном массиве
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
program test2;

const
  TEST_SIZE = 50000;

type
  TValue = integer;
  TIndexArray = array of integer;
var
  Arr: array of TValue;


  procedure Init;
  var
    i: integer;
    tmp: TValue;
    r: integer;
  begin
    for i := 0 to TEST_SIZE - 1 do
      arr[i] := i;
    // Перемешиваем
    r := 54323; // ГСЧ с постоянной последовательстью
    for i := 0 to TEST_SIZE - 1 do
    begin
      repeat
        r := (r * 12347 + 1) mod TEST_SIZE;
      until (r >= 0);

      tmp := arr[i];
      arr[i] := arr[r];
      arr[r] := tmp;
    end;
  end;

  procedure QuickSort(FList: PInteger; L, R: longint);

    function Compare(a, b: integer): integer;
    begin
      Result := Arr[a] - Arr[b];
    end;

  var
    I, J: longint;
    P, Q: integer;
  begin
    repeat
      I := L;
      J := R;
      P := FList[(L + R) div 2];
      repeat
        while Compare(P, FList[i]) > 0 do
          I := I + 1;
        while Compare(P, FList[J]) < 0 do
          J := J - 1;
        if I <= J then
        begin
          Q := FList[I];
          Flist[I] := FList[J];
          FList[J] := Q;
          I := I + 1;
          J := J - 1;
        end;
      until I > J;
      // sort the smaller range recursively
      // sort the bigger range via the loop
      // Reasons: memory usage is O(log(n)) instead of O(n) and loop is faster than recursion
      if J - L < R - I then
      begin
        if L < J then
          QuickSort(FList, L, J);
        L := I;
      end
      else
      begin
        if I < R then
          QuickSort(FList, I, R);
        R := J;
      end;
    until L >= R;
  end;

  procedure SearchIndexes(var m: TIndexArray);
  var
    i: integer;
  begin
    for i := 0 to TEST_SIZE - 1 do
      m[i] := i;
    QuickSort(@m[0], 0, TEST_SIZE - 1);

  end;

var
  m: TIndexArray;
begin
  SetLength(Arr, TEST_SIZE);
  Init;
  SetLength(m, TEST_SIZE);
  SearchIndexes(m);
  for i:=0 to 6 do
  begin
    Writeln('Element:',Arr[m[i]], '  position:',m[i],
    '  smaller count:', i,'  greater count:', TEST_SIZE-i-1);
  end;    
end.


Код: plaintext
1.
2.
3.
4.
5.
6.
Element:0  position:5000  smaller count:0  greater count:49999
Element:1  position:5001  smaller count:1  greater count:49998
Element:2  position:9452  smaller count:2  greater count:49997
Element:3  position:8635  smaller count:3  greater count:49996
Element:4  position:5004  smaller count:4  greater count:49995
Element:5  position:11505  smaller count:5  greater count:49994
Element:6  position:9530  smaller count:6  greater count:49993
mcureenabТолько сложность алгоритма быстрой сортировки может достигать О(N*N).
вообще-то всегда O(N*Log(N))
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39080785
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПрочитал статью Тадао Такаока(учёный не так давно решивший новым способом проблему Maimum subarray sum) о новых мерах энтропии неупорядоченного массива, захотел посмотреть алгоритмы работы со старыми. Информации особой по реализации не нашёл, потому решил самостоятельно этим заняться
ох уж эти японцы, суровые ребята - чуть мозг не поломал пока весо-сбалансированное дерево делал (тоже японцы придумали)

только как к теме вопроса относится "Maximum subarray sum" ?
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39080801
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)в индексе будут позиции элементов в исходном массиве
Код: plaintext
1.
2.
3.
Element:0  position:5000  smaller count:0  greater count:49999
Element:1  position:5001  smaller count:1  greater count:49998
Element:2  position:9452  smaller count:2  greater count:49997
...

Ты не то посчитал. Надо не сколько всего элементов больше конкретного, а сколько больших элементов между началом и конкретным. Затем сложить полученное.

У меня первая мысль была что можно отсортировать, а затем как-то в один проход посчитать используя только 2 индекса элемента: в изначальном массиве и отсортированном. Но запнулся на такой последовательности 1,5,3,2,4. Результат у нее 0+0+1+2+1.

ЗЫ про С/С++ форум. Паскаль запустить негде. Тут заготовка теста с перебором 18274025
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39080803
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПрочитал статью Тадао Такаока(учёный не так давно решивший новым способом проблему Maimum subarray sum) о новых мерах энтропии неупорядоченного массива, захотел посмотреть алгоритмы работы со старыми. Информации особой по реализации не нашёл, потому решил самостоятельно этим заняться
Там критично именно так считать? Может взять за основу что-нибудь близкое, но легче считаемое? Например получить сумму смещений вперед после сортировки.
Например:
1,5,3,2,4 исходный
1,2,3,4,5 отсортированный
тут только 5 уехало на 3 вперед, т.е. итого 3.
Это быстрее считается.
...
Рейтинг: 0 / 0
Мера неупорядоченности линейного массива и некоторые вопросы
    #39080892
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В случае если многократного 'неудачного выбора' опорной точки асимптотика quicksort будет О(n^2).

Maximum subarray sum известная задача, в отличие от меры упорядоченности массива. Потому я думал по ней все поймут кто этот японец
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Мера неупорядоченности линейного массива и некоторые вопросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]