Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Можно ли так

284
27 июля 2006 года
michael_is_98
587 / / 25.02.2005
как найти медиану одномерного массива вещ. чисел, не сортируя его. И можно ли вообще это сделать? Сортировка - дорогоая операция.
P.S. Медиана одномерного массива - это число, меньше которого в одномерном массиве столько же элементов, сколько элементов больше медианы.
6.9K
27 июля 2006 года
RZ_RZ
53 / / 09.06.2005
Код:
int cnt = 10;
int med_ind = 0;
int founded = 0;

int gr_cnt = 0;
int sm_cnt = 0;

for ( int i = 0 ; i = cnt ; i++ )
{
    for ( int j = 0 ; j = cnt ; j++ )
    {
        if ( mass[j] > mass ) gr_cnt++;
        if ( mass[j] < mass ) sm_cnt++;
    }
   
    if ( gr_cnt == sm_cnt )
    {
        founded = 1;
        med_ind = i;
        break;
    }
}
3
27 июля 2006 года
Green
4.8K / / 20.01.2000
RZ_RZ, сортировка в общем случае это N*log(N) у тебя же алгоритм N^2. Т.е. сортировку использовать предпочтительнее.
Автору топика нужен алгоритм оптимальнее N*log(N). Я предполагаю, что это будет сложность N.
284
27 июля 2006 года
michael_is_98
587 / / 25.02.2005
Спасибо за простоту!
P.S. Хотя наверное есть более эффективные аналоги...
284
27 июля 2006 года
michael_is_98
587 / / 25.02.2005
[QUOTE=Green]RZ_RZ, сортировка в общем случае это N*log(N) у тебя же алгоритм N^2. Т.е. сортировку использовать предпочтительнее.
Автору топика нужен алгоритм оптимальнее N*log(N). Я предполагаю, что это будет сложность N.[/QUOTE]
Сортировка эффективнее конечно. Но у меня исходный массив должен остаться неизменным, т.е. чтобы его отсортировать, нужно сначала создать что-то вроде vector, записать в него содержимое double * (попутно вопрос-это вообще возможно одной операцией), а затем отсортировать vector. Т.е. операций порядочно.
А пользоваться CRT и qsort еще более неэффективнее...
Хотя можно конечно у Кнута посмотреть более эффективную процедуру.
398
27 июля 2006 года
Alexandoros
630 / / 21.10.2005
Создаем еще 2 масива

1 проход - находим среденее арифметическое исходного масива
2 проход - раскидываем элементы(или индексы) по созданым двум масивам - в один большие среднего, в другой - меншие, и заодно подсчитываем длины наших масивов. Теперь по разности длин масивов можно будет определить индекс медианы.

Может то, что я написал, даже будет давать правильные результаты :)
3
27 июля 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=Alexandoros]Создаем еще 2 масива

1 проход - находим среденее арифметическое исходного масива
2 проход - раскидываем элементы(или индексы) по созданым двум масивам - в один большие среднего, в другой - меншие, и заодно подсчитываем длины наших масивов. Теперь по разности длин масивов можно будет определить индекс медианы.

Может то, что я написал, даже будет давать правильные результаты :)[/QUOTE]
К сожалению, этот алгоритм не рабочий. :)
Для поиска медианы среднее арифметическое вообще не имеет смысла.
Пример:
6, 7, 8, 5, 104
среднее арифметическое = 26
разность длин массивов = 4 - 1 = 3
ничего нам не дает, т.к. медиана равна 7 (второму элементу).
3
27 июля 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=michael_is_98]Сортировка эффективнее конечно. Но у меня исходный массив должен остаться неизменным,
[/QUOTE]
Должен остаться неизменным - сделай копию.

[QUOTE=michael_is_98] т.е. чтобы его отсортировать, нужно сначала создать что-то вроде vector, записать в него содержимое double * (попутно вопрос-это вообще возможно одной операцией),
[/QUOTE]
Можно
vector<double> v(p, p+size);
где p - указатель на первый элемент массива,
size - размер массива.
[QUOTE=michael_is_98]а затем отсортировать vector. Т.е. операций порядочно.
А пользоваться CRT и qsort еще более неэффективнее...
[/QUOTE]
Что значит операций порядочно?
Что значит использовать qsort неэффективно?
Как я уже сказал в общем случае количество операций будет пропорционально N*log(N) (это для qsort), а не N^2, как в приведенном выше примере. Т.е. уже эффективнее.

[QUOTE=michael_is_98]Хотя можно конечно у Кнута посмотреть более эффективную процедуру.[/QUOTE]
Более эффективную, чем быстрая сортировка не найдешь.
Но есть один момент, который позволяет съоптимизировать быструю сортировку и привести сложность от N*log(N) к 2N.
Это достигается тем, что в рекурсии не нужно сортировать обе партиции, а лишь одну.

P.S. Кстати, для этого не надо читать три тома Кнута, а можно прочесть книгу всего 250 страниц - "Жемчужины программирования", Бентли.
284
27 июля 2006 года
michael_is_98
587 / / 25.02.2005
Понятно, если у тебя есть эта книга в эл. виде - отправь ее мне.
А насчет qsort я хотел сказать, что STL vector более эффективен, чем в qsort CRT. Хотя алгоритм может быть один и тот же. Или я не прав?
3
27 июля 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=michael_is_98]Понятно, если у тебя есть эта книга в эл. виде - отправь ее мне.
[/QUOTE]
К сожалению, нет. :(
[QUOTE=michael_is_98]
А насчет qsort я хотел сказать, что STL vector более эффективен, чем в qsort CRT. Хотя алгоритм может быть один и тот же. Или я не прав?[/QUOTE]
vector - это контейнер, а qsort - это функция (реализация алгоритма), поэтому их сравнивать никак нельзя. Это все равно что сравнивать объем и скорость.
Сравнить можно qsort и std::sort. Действительно, std::sort несколько быстрее в общем случае, хотя обе функции имеют общий принцим (алгоритм Хоара).

Общий принцип такой (http://algolist.manual.ru/sort/mqs/fast_strings2.php):
1) берем любое число из массива;
2) числа меньше выбранного помещаем в одну партицию, а больше либо равно в другую;
3) повторяем рекурсивно с п.1 для получившихся партиций.
Алгоритм можно по-разному оптимизировать, но базовый принцип тот же.

Для твоей задачи можно отбрасывать сортировку ненужных партиций.
Известно, что после сортировки медиана будет иметь интекс n/2, где n - размер массива.
Т.о. выполняя быструю сортировку можно сразу отбрасывать (точнее, дальше не обрабатывать) ту партицию, которая не не содержит индекс n/2.

Например:
3, 6, 7, 8, 5, 11, 104
размер массива 7, n/2 = 3.

1) выбираем случайно (настоящий алгоритм выбора - это одна из оптимизаций) к примеру число 8;
2) определяем партиции (a<8 | a>=8):
3, 6, 7, 5 | 8, 11, 104
3) первая партиция теперь занимает у нас ячейки массива от 0 до 3, т.к. медиана будет в ячейке n/2 = 3, то оставляем эту партицию, вторую отбрасываем.
3, 6, 7, 5, х, х, х

4) повторяем с п.1, выбираем к примеру 6;
5) формируем партиции (a<6 | a>=6):
3, 5 | 6, 7, х, х, х
6) теперь третий элемент принадлежит второй партиции поэтому первую отбрасываем
х, х, 6, 7, x, x, x

7) производим сортировку в последней оставшейся партиции (у нас и так получилось отсортировано)
и берем значение по третему индексу, т.е. 7
это и есть наша медиана.
284
27 июля 2006 года
michael_is_98
587 / / 25.02.2005
именно это и хотел сказать. чем объяснить разницу в скорости между qsort и std::sort?
3
27 июля 2006 года
Green
4.8K / / 20.01.2000
std::sort имеет ряд оптимизаций, хотя все зависит от конкретной реализации STL.
Более конкретно надо искать в интернете.
284
27 июля 2006 года
michael_is_98
587 / / 25.02.2005
[QUOTE=Green]std::sort имеет ряд оптимизаций, хотя все зависит от конкретной реализации STL.
Более конкретно надо искать в интернете.[/QUOTE]
Ну в общем я так понял, что для этой задачи все-таки лучше сначала отсортировать массив.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог