Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помоги с упрощением алгоритма, Довольно сложный алгоритм )) 
:(
    Опции темы
Mayk
Дата 5.9.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(ДобренькийПапаша @  5.9.2006,  21:54 Найти цитируемый пост)
которые пишутся вручную за две минуты... 

То что пишется за две минуты иногда отлаживается за пол часа и даже более. 
Гораздо более серьезной проблемой qsort а является то, что он вызывает ф-цию каждый раз для сравнения [std::sort может заinlineить компаратор, а вот qsort очень навряд ли].
Однако в любом случае - не стоит что-либо оптимизировать и переписывать, пока profiler показывает что в этом нет особой нужды.

Это сообщение отредактировал(а) Mayk - 5.9.2006, 18:00


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Greeen
Дата 5.9.2006, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 7
Всего: 18



Цитата(Mayk @  5.9.2006,  17:58 Найти цитируемый пост)
компаратор
  smile 



--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Mayk
Дата 5.9.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Greeen @  5.9.2006,  23:05 Найти цитируемый пост)
компаратор

Вообще это англ Comparator. "Сравниватель". 

В частности
Цитата(qsort(3))

       The comparison function must return an integer less than, equal to,  or
       greater  than  zero  if  the first argument is considered to be respec‐
       tively less than, equal to, or greater than the second.  If two members
       compare as equal, their order in the sorted array is undefined.





--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
ReGeDiT
  Дата 5.9.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



кхм, ладно, с сортировкой покончили... вот ещё пару вопросов на повестке дня smile

"Тогда, может лучше отсортировать 2 массива, и вычёркивать из второго проверенные элементы?.. т.е. сокращать массив... я просто незнаю как это реализовать. (можете помочь то...)

ТАКЖЕ! допустим имеется 1 массив, как проверить его на повторяющиеся элементы, т.е. допустим есть ли в нём одинаковые... они могут быть совершенно в разных местах? в голову ничего не лезет... (помогите тоже.....)" алгоритм мой в самом первом посте...

и как всё-таки таймингом пользоватся то?? можно примерчик то smile)) я же всё-таки начинающий кодер...

Это сообщение отредактировал(а) ReGeDiT - 5.9.2006, 20:58
PM MAIL WWW ICQ   Вверх
Earnest
Дата 6.9.2006, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(ReGeDiT @  5.9.2006,  21:55 Найти цитируемый пост)
допустим имеется 1 массив, как проверить его на повторяющиеся элементы

Опять отсортировать, тогда одинаковые элементы будут рядом.
В STL есть алгоритм unique, который убирает дубликаты.



--------------------
...
PM   Вверх
ReGeDiT
Дата 6.9.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



Earnest, а если элементов 200? =)

Может всё-таки кто-нибудь поможет мне..........................?

1) Помогите усовершенствовать мой код выше! У меня такая идея, может лучше отсортировать 2 массива, и вычёркивать из второго проверенные элементы?.. т.е. сокращать второй массив... я просто незнаю как это реализовать.

2) Имеется 1 массив, как проверить его на повторяющиеся элементы, т.е. допустим есть ли в нём одинаковые... они могут быть совершенно в разных местах, и их может быть много?

3) Как пользоватся таймингом? можно примерчик то smile)) я же всё-таки начинающий кодер

-.-
PM MAIL WWW ICQ   Вверх
Earnest
Дата 7.9.2006, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



А что 200 - это по-твоему много? Много - это 200 000. А на 200 почти нет разницы - что линейный поиск, что бинарный.
Что именно тебе не понятно? В отсортированном массиве одинаковые элементы стоят рядом: бери и проверяй, за один проход.
Если речь идет о сравнении 2 отсортированных массивов, то там тоже просто: инкрементируй индекс первого, пока его элементы меньше второго. И наоборот. Если элементы совпадают, инкрементируй оба индекса. 
По-моему, кто-то такой код тебе уже писал.

Что значит "не знаю как реализовать"? Пока не попробуешь, не узнаешь.




--------------------
...
PM   Вверх
zkv
Дата 7.9.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Earnest @  7.9.2006,  07:52 Найти цитируемый пост)
Что значит "не знаю как реализовать"? Пока не попробуешь, не узнаешь.

ИМХО тебе могут подсказать, написать прогу за тебя, но пока сам не напишешь, лучше разбираться в языке не станешь!
PM MAIL   Вверх
ReGeDiT
Дата 8.9.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



я имею в виду то что, вдруг будут 200 одинаковых рядом. Массив состоит примерно из 50 000 элементов ;). откуда я знаю сколько раз проверять массив?
PM MAIL WWW ICQ   Вверх
Rockie
Дата 9.9.2006, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



ReGeDiT, если я правильно понял вопрос - уничтожаешь следующее число до тех пор, пока не конец массива, либо пока следующее число не станет отлично от данного. это только как один из многих вариантов


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Voldemar2004
Дата 9.9.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



На работе была такая же задача: нужно было выбрать из БД все номера ИНН и номера, которые попали на выделение, затем сравнить и получить список тех людей, которые не попали. Вкратце так:
Код
#include <iostream.h>
#include <conio.h>

int main(void)
{

const int k=10, l=6;

int a[k] = {1, 3, 76, 34, 654, 7653, 345, 3456, 75, 22};
int b[l] = {1, 34, 654, 3456, 75, 22};

       for(int i=0; i<k; i++)
       {

       bool flag = false;

        for(int j=0; j<l; j++)
        {

         if( a[i] == b[j] ) flag = true;

        }

         if (!flag) cout << a[i] << '\n' ;

       }

getch();

return 0;
}
Делал без сортировки, работает довольно быстро.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Voldemar2004
Дата 9.9.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Цитата(ReGeDiT @  6.9.2006,  20:46 Найти цитируемый пост)
 Имеется 1 массив, как проверить его на повторяющиеся элементы, т.е. допустим есть ли в нём одинаковые... они могут быть совершенно в разных местах, и их может быть много?

Код
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>  // qsort()

int intcmp(const void *, const void *);

int main(void)
{

const int k=20;

int a[k] = {1, 99, 9, 3, 0, 34, 654, 34, -345, 3456, 34, -1000, 321, 13244, 0, 654, -100, 1000, -1000, 9};

        qsort(&a[0], k, sizeof(int), intcmp); /* Сортировка. */

        for(int i=0; i<k-1; i++)
        if( a[i] == a[i+1] ) cout << a[i+1] << '\t';

getch();

return 0;
}

/* Функция сравнения. */
int intcmp(const void *a, const void *b)
{
 return *(int *)a - *(int*)b;
}
Можно было бы сделать код сортировки на ASM и вставить методом ассемблерной вставки (только метод сортировки должен быть быстрым, а то даже на ASM "пузырек" будет медленнеe qsort на C). Или другую функцию сортировки, используя inline-подстановку. Можно так же было сделать и без сортировки, но (профи сейчас начнут меня ругать smile ) это лишний - перебор + цикл в цикле + сравнения flag = true/false, особенно для 50000 элементов.



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
ReGeDiT
Дата 9.9.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



спасибо!

осталось 2 вопроса smile

---

посмотрел второй код получше... а там ведь сравнивается просто на 2 одинаковых максимум... а если их больше? сделать цикл по длине массива а внутрь его запихнуть это? тока мне кажется будет бред smile

Это сообщение отредактировал(а) ReGeDiT - 9.9.2006, 15:44
PM MAIL WWW ICQ   Вверх
Voldemar2004
Дата 9.9.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Цитата(ReGeDiT @  6.9.2006,  20:46 Найти цитируемый пост)
 Как пользоватся таймингом? можно примерчик то я же всё-таки начинающий кодер
Библиотека time.h. А вообще поконкретней объясни чего ты хочешь.


Цитата(ReGeDiT @  9.9.2006,  16:39 Найти цитируемый пост)
осталось 2 вопроса
Каких? 



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Voldemar2004
Дата 9.9.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Цитата(ReGeDiT @  9.9.2006,  15:39 Найти цитируемый пост)
 а там ведь сравнивается просто на 2 одинаковых максимум...
Нет.

{1, 99, 9, 3, 0, 34, 654, 34, -345, 3456, 34, -1000, 321, 13244, 0, 654, -100, 1000, -1000, 9};

34 - встречается 3 раза, выводим - два раза 34 - они "лишние".

Хотя, можно еще так: если число встречается > 2 раз, то выводим его столько раз сколько оно встречается в массиве:
Код
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>  // qsort()

int intcmp(const void *, const void *);

int main(void)
{
const int k=20;

int a[k] = {1, 99, 9, 3, 0, 34, 654, 34, -345, 3456, 34, -1000, 321, 34, 0, 654, -100, 1000, -1000, 9};

        qsort(&a[0], k, sizeof(int), intcmp); 

        for(int i=0; i<k-1; i++)
        {
         if (a[i] == a[i+1]) {
         cout << a[i] << '\n';

                do{
                i++;
                cout << a[i] << '\n';
                }
                while(a[i] == a[i+1]);
         }
        }

getch();

return 0;
}

int intcmp(const void *a, const void *b)
{
 return *(int *)a - *(int*)b;
}
Для наглядности я здесь поставил число 34 четыре раза.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.