Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

ДАЁШЬ АЛГОРИТМ !!!!!

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Yello



Зарегистрирован: 09.03.2006
Сообщения: 107

СообщениеДобавлено: Пн Июл 16 2007 06:51    Заголовок сообщения: ДАЁШЬ АЛГОРИТМ !!!!! Ответить с цитатой

Здравствуйте.
У меня такой вопрос: нужен алгоритм для объединения двух множеств, заданных массивами. Множества (массивы) упорядочены по возрастанию, и результат должен быть - тоже. (Имеется ввиду упорядоченность по целым номерам элемента). Новый элемент "+INFINITY" в конец массива "приделывать" нежелательно.
Какой алгоритм (из известных вам) быстрее всего?
Понимаю, что это вопрос не совсем корректный (типа "какая сортировка самая быстрая"), но уточнить область применения нельзя. Поэтому сам мучаюсь. Вдруг кто-нибудь поумнее что подскажет?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
vir



Зарегистрирован: 17.05.2007
Сообщения: 24

СообщениеДобавлено: Пт Июл 20 2007 11:58    Заголовок сообщения: Ответить с цитатой

Код:
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys)
  | x == y  = x : merge xs ys
  | x > y    = merge (x:xs) ys
  | x < y    = merge xs (y:ys)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Yello



Зарегистрирован: 09.03.2006
Сообщения: 107

СообщениеДобавлено: Ср Авг 08 2007 12:04    Заголовок сообщения: Ответить с цитатой

Код:
Цитата:
merge [] ys = ys
merge xs [] = xs
merge (xMads) (y:ys)
| x == y = x : merge xs ys
| x > y = merge (xMads) ys
| x < y = merge xs (y:ys)

А на С++ ?
Mr. Green
То есть, я сам виноват, надо было сразу уточнить:
1. все массивы - только в динамической памяти.
2. Длина, т.е. к-во элементов, может быть разная.
3. При реализации этой программы, на уровень языков выше, чем C, подниматься нельзя (вообще, представьте, что надо написать максимально быстрый код, решающий задачу, на asm86)!
Вот теперь, когда задача уточнена - милости прошу!
В КНУТЕ - НЕТ !!! (вообще - и сам могу, несколько разных вариантов, но по поводу их оптимальности - большой вопрос. Ну ведь честно, какие сортировки например может сам придумать любой нормальный человек, и какие при этом есть... Rolling Eyes вот именно. Поэтому и спрашиваю.)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
vir



Зарегистрирован: 17.05.2007
Сообщения: 24

СообщениеДобавлено: Чт Авг 30 2007 11:22    Заголовок сообщения: Ответить с цитатой

C, массивы:
Код:

// слияние 2х отсортированных массивов в 3й
// xs, ys --- исходные массивы
// nxs, nys --- соответствующие размеры (кол-во элементов)
// rs --- массив, куда записывается результат
// nrs --- максимально допустимый размер результата
// возвращаемое значение --- кол-во элементов в результате.
int merge (int nxs, int *xs, int nys, int *ys, int nrs, int*rs)
{
    int nrs1 = nrs;
    while (nrs > 0 && nxs > 0 && nys > 0) {
        if (*xs == *ys) {
            *rs++ = *xs++;
            nrs--;
            nxs--;
            ys++;
            nys--;
        }
        if (*xs < *ys) {
            *rs++ = *xs++;
            nrs--;
            nxs--;
        }
        if (*xs > *ys) {
            *rs++ = *ys++;
            nrs--;
            nys--;
        }
    }
    while (nxs > 0 && nrs > 0) {
        *rs++ = *xs++;
        nxs--;
        nrs--;
    }
    while (nys > 0 && nrs > 0) {
        *rs++ = *xy++;
        nys--;
        nrs--;
    }
    return nrs1 - nrs; // сколько элементов добавили в массив
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Yello



Зарегистрирован: 09.03.2006
Сообщения: 107

СообщениеДобавлено: Ср Сен 26 2007 12:42    Заголовок сообщения: Ответить с цитатой

Да, спасибо.
У меня было всё также, за исключением 2-х моментов:
1. обработка "хвостов" была в главном цикле.
2. хождение по массиву - с операцией [] вместо инкрементации самого указателя.
Т.е., Ваша прога сильнее оптимизирована по скорости (и ведь это были очевидные вещи, жаль что сам не догадался).
Хотя, не знаю, как это для современных компиляторов (MS, gnu) - может, вообще без разницы, они и сами оптимизируют...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...