Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2018, 01:37   #1
shonzie
Пользователь
 
Регистрация: 29.07.2016
Сообщений: 13
По умолчанию Нахождение момента временни, при котором radixSort начинает быстрее сортировать чем quickSort

Код:
Цитата:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;

const unsigned int ARRSIZE = 1000000;
const int DIGITRANGE = 10;
const int MIN = 0;
const int MAX = 10;

void swap(int &fnum, int &snum) {
int tmp = fnum;
fnum = snum;
snum = tmp;
}
int randRange(int min, int max) {
return rand() % (max + 1 - min) + min;
}
int maxDigits(int arr[]) {
int max = 0;
for (int i = 1; i < ARRSIZE; i++) {
if (arr[i] > arr[max])
max = i;
}
int num = arr[max];
int cnt = 0;
while (num > 0) {
cnt++;
num = num / 10;
}
return cnt;
}
void countingSortExp(int arr[], int exp) {
int *counters_arr = new int[DIGITRANGE];
int *sorted_arr = new int[ARRSIZE];
for (int key = 0; key < DIGITRANGE; key++)
counters_arr[key] = 0;
for (int i = 0; i < ARRSIZE; i++)
counters_arr[(arr[i] / exp) % 10]++;
for (int key = 1; key < DIGITRANGE; key++)
counters_arr[key] += counters_arr[key - 1];
for (int i = ARRSIZE - 1; i >= 0; i--) {
counters_arr[(arr[i] / exp) % 10]--;
sorted_arr[counters_arr[(arr[i] / exp) % 10]] = arr[i];
}
for (int i = 0; i < ARRSIZE; i++)
arr[i] = sorted_arr[i];
delete [] counters_arr;
delete [] sorted_arr;
}
void radixSort(int arr[]) {
int exp = 1;
int digits = maxDigits(arr);
while (exp <= pow(10, digits)) {
countingSortExp(arr, exp);
exp *= 10;
}
}
int partition(int arr[], int left, int right) {
int split_point = left - 1;
for (int j = left; j < right; j++) {
if (arr[j] <= arr[right]) {
split_point++;
swap(arr[split_point], arr[j]);
}
}
swap(arr[split_point + 1], arr[right]);
return split_point + 1;
}
int randomizedPartition(int arr[], int left, int right) {
int rand = randRange(left, right);
swap(arr[rand], arr[right]);
return partition(arr, left, right);
}
void quickSortHoare(int arr[], int left, int right) {
if (left < right) {
int split_point = randomizedPartition(arr, left, right);
quickSortHoare(arr, left, split_point - 1);
quickSortHoare(arr, split_point + 1, right);
}
}

int main () {
srand(time(NULL));
int *arr1 = new int[ARRSIZE];
int *arr2 = new int[ARRSIZE];
clock_t start;
double duration;

for (int i = 0; i < ARRSIZE; i++) {
arr1[i] = randRange(MIN, MAX);
arr2[i] = arr1[i];
}

start = clock();
radixSort(arr1);
duration = ( clock() - start ) / (double) CLOCKS_PER_SEC;
cout << duration << " (Radix)" << endl;
delete [] arr1;

start = clock();
quickSortHoare(arr2, 0, ARRSIZE - 1);
duration = ( clock() - start ) / (double) CLOCKS_PER_SEC;
cout << duration << " (Quick)" << endl;

delete [] arr2;
/*
for (int i = 0; i < ARRSIZE; i++)
cout << arr1[i] << " ";
cout << endl;
for (int i = 0; i < ARRSIZE; i++)
cout << arr2[i] << " ";
cout << endl;
*/

return 0;
}
Проблема:
Нужно найти некоторое время n0, при котором происходит смена темпа роста функций radixSort и quickSort. Известно, что quickSort имеет асимптотическйи прирост, а radixSort линейный, так как это соответственно О(logn * n) и О(n) функции. Сначала кривая QS
исгибается, т.е. лежит ниже линейной, а после некоторого n0 - линейная ниже. Каким образом возможно найти это n0, например для цифр ?
shonzie вне форума Ответить с цитированием
Старый 19.03.2018, 15:55   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Ну, это довольно нечёткая граница.

В одном измерении может быть один результат, в другом совсем другой.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 19.03.2018, 16:21   #3
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

А вообще, вот тебе идея.
Мы знаем асимптотику каждого алгоритма.
Ну, значит, можем найти константу C для него, просто запуская на больших n.

T1 = С1*n
T2 = C2*n*log(n)

Мы можем приравнять:
C1*n = C2*n*logn <=> C1/C2 = log n
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 20.03.2018, 01:46   #4
shonzie
Пользователь
 
Регистрация: 29.07.2016
Сообщений: 13
По умолчанию

Благодраю!
shonzie вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На чем проще и быстрее написать небольшое Web-приложение? Pavel2017 JavaScript, Ajax 1 05.01.2018 01:04
0.5 быстрее работает чем /2 ts-alan C# (си шарп) 10 02.09.2015 10:33
Sin быстрее чем из math.h Medved.tolik Помощь студентам 5 05.02.2012 18:40
Бейсик. Вычисление момента инерции,момента сопротивления площади поперечного сечения для кольца kostia-92 Помощь студентам 0 26.06.2011 09:58
Помогите пожалуйста с лабами по делфи(чем быстрее, тем лучше) Vera_Valera Помощь студентам 1 06.06.2009 10:08