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

Поиск:

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


Шустрый
*


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

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



для некоторых целей, мною был создан сложный алгоритм для поиска значений одного массива в другом. Т.е. проверить содержутся ли во 2м массиве элементы первого. До сих пор у меня есть уверенность что сделать всё можно намного проще smile Помоги упростить это. Главный минус моего алгоритма - УЖАСНО МЕДЛЕННАЯ СКОРОСТЬ работы.

Вот мой алгоритм:
Код

i = 1; j = 1; cs = 0; // ставим в нужное значение
do {
    if ((lcm[i]!=ltm[j])&&(lcm[i]!=0)) { j++; printf("lcm[%d/%d]!=ltm[%d/%d] (%d!=%d)\n",i,ds1,j,wsc,lcm[i],ltm[j]); cs = 0;  } // сравниваем элементы 1го массива и 2го массива, также отсеиваем нулевые
    else                               { printf("Element %d Exists, All Ok!\n",lcm[i]); i++; j = 1; cs = 1; }; // если нашли то выводим сообшение что нашли
    if ((j==wsc)&&(cs!=1))             { printf("Element %d NOT Exists!\n",lcm[i]); // если пробежали весь массив и не нашли ничего то выводим сообщение что нету такого
                                         i++; // переходим на следующий элемент массива
                                         j = 1; // ставим второй массив на начало, т.е. на первый элемент
                                       };
   }
while (i!=ds1); // ds1 в данном случае количество элементов первого массива

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


Эксперт
****


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

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



Отсортировать оба. 
Если менять нельзя, отсортировать копии, и искать в них. 
Если порядок зачем-то нужно сохранить, заведи структуру {значение, исходный индекс}, отсортируй ее по значению (можно еще флаг добавить - "встречается\не встречается"), проверь, выведи все скопом.
Как искать совпадения в отсортированных массивах надо объяснять?

ЗЫ
И не пиши так ужасно код: чего строчки экономишь? Читать же невозможно...




--------------------
...
PM   Вверх
maxim1000
Дата 31.8.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну во-первых существующий алгоритм неплохо было быупростить для понимания человеком - два вложенных цикла смотрелись бы значительно проще, а работали бы так же
если рассматривать два произвольно заполненных массива, то сомневаюсь, что можно сделать быстрее
однако, можно работать с отсортированными массивами - тогда поиск будет значительно быстрее
можно также работать с hash-массивами, хотя мне кажется, что по сравнению с отсортированными разницы не будет
P.S.
о, не успел smile

Это сообщение отредактировал(а) maxim1000 - 31.8.2006, 17:40


--------------------
qqq
PM WWW   Вверх
bsa
Дата 31.8.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Про форматирование...
К сожалению, ни в школе, ни в институте не учат правильному форматированию программ. И вот каждый пытается изобрести велосипед... В конце концов, он приходит к одному из общепринятых стилей... Но не сразу.

ReGeDiTКак ты думаешь, код в таком виде читается лучше, чем тот, что дал ты?
Код
// ставим в нужное значение
i = 1;
j = 1;
cs = 0;
do {
    if ( (lcm[i] != ltm[j]) && (lcm[i] != 0) ) { // сравниваем элементы 1го массива и 2го массива, также отсеиваем нулевые
         ++j;
         printf("lcm[%d/%d]!=ltm[%d/%d] (%d!=%d)\n", i, ds1, j, wsc, lcm[i], ltm[j]);
         cs = 0;
    } else { // если нашли то выводим сообшение что нашли
         printf("Element %d Exists, All Ok!\n", lcm[i]);
         ++i;
         j = 1;
         cs = 1;
    };
    if ( (j == wsc) && (cs != 1) ) {
         printf("Element %d NOT Exists!\n", lcm[i]); // если пробежали весь массив и не нашли ничего то выводим сообщение что нету такого
         ++i; // переходим на следующий элемент массива
         j = 1; // ставим второй массив на начало, т.е. на первый элемент
    };
} while (i != ds1); // ds1 в данном случае количество элементов первого массива

Кстати, обрати внимание на использование оператора ++. Если тебе не нужно получать значение до выполнения инкремента, то лучше использовать ++i, так как гарантированно быстрее работает (а скорость работы i++ сильно зависит от качества и степени оптимизации). smile
PM   Вверх
zkv
Дата 31.8.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(bsa @ 31.8.2006,  17:45)
Про форматирование...
К сожалению, ни в школе, ни в институте не учат правильному форматированию программ. И вот каждый пытается изобрести велосипед... В конце концов, он приходит к одному из общепринятых стилей... Но не сразу.

у нас препод отказывался проверять прогу, пока она не будет отформатирована как он считал нужным. Можно было  возмущаться по-этому поводу, но прогу все равно приходилсь форматировать smile

Простите за оффтоп - не мог не вступиться за преподавателей smile

Это сообщение отредактировал(а) zkv - 31.8.2006, 18:09
PM MAIL   Вверх
Oleg_Ci
Дата 31.8.2006, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


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

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



Я нечто похожее делал:
Цитата
Задача 6.

Даны две целочисленных таблицы А [1:10] и В[1:15]. 
Разработать алгоритм и написать программу, которая проверяет, 
являются ли эти таблицы похожими. Две таблицы называются похожими, 
если совпадают множества чисел, встречающихся в этих таблицах.

Решение задачи 6.

Мы можем отсортировать оба массива - и A, и B (например, по неубыванию), 
далее, если первые элементы массивов A и B совпадают, то ищем и в A, и в 
B минимальные элементы, большие данного, и повторяем сравнения; 
если же элементы не совпадают, либо один из массивов уже закончился, 
а другой еще нет, то массивы не похожие.
Здесь "левые" функции, которые русский текст выводят.
Код

#include<iostream>
#include <stdio.h>
#include <windows.h>
using namespace std;

char Buf[1000];   // буфер для переведённого слова в Oem
char *ToOem(char*); // переводит строку из Ansi в Oem
void Write(char*); // выводит на консоль строку преобразованную AnsiToOem
template <typename T, int size>
void WrMas( T (&a)[size]);   // выводит на консоль содержимое массива
template <typename T, int size>
void sort( T (&a)[size]); // сортировка массива
bool poisk(int[],int,int&); // поиск в массиве числа

////////////////    MAIN    ///////////////
int main()
{
    int a[]={1,1,2,3,4,14,6,7,7,8};
    int b[]={1,1,3,2,4,5,6,7,8,7,11,12,13,14,15};

    sort( a );   // сортировка массивов
    sort( b );
    WrMas( a );  // вывод содержимого массивов
    WrMas( b );

    int pos1, pos2=pos1=0;
    for ( int i=0; i<15; i++ )
        if(poisk(b,a[pos1], pos2))
        { pos1++; pos2++; }

    if (pos1==10) Write("Массивы похожы");
    else Write("Массивы не похожы !");

    cout << "\n\n\n";
    system("pause");
    return 0;
}
///////////////// END MAIN  //////////////////////////

bool poisk(int b[],int a,int &pos)
{
  for( ; pos<15; pos++ )
    if ( b[pos] == a ) return true;

  return false;
}
//----------------------------------------
char *ToOem(char* ch)
{
  AnsiToOem(ch,Buf);
  return Buf;
}
//----------------------------------------------
void Write(char*c)
{
  cout<<ToOem(c);
}
//-----------------------------------------------
template <typename T, int size>
void WrMas( T (&a)[size])   // выводит на консоль содержимое массива
{
  for ( int i=0; i<size; i++ )
    cout<<a[i]<<ends;
    cout << "\n\n";
}
//-----------------------------------------------------
template <typename T, int size>
void sort( T (&a)[size]) // сортировка массива
{
  for ( int i=0; i<size-1; i++ )
    if (a[i]>a[i+1])
    {
      T x = a[i];
      a[i]=a[i+1];
      a[i+1]=x;
      if ((i-=2)<0) i=-1;
    }
}


PM MAIL   Вверх
ReGeDiT
Дата 31.8.2006, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



по поводу форматирования: программа пишется для себя и никуда здаватся не будет. важна только работа.

спасибо за подсказки с сортировкой и ++i;


а какие есть способы сортировки? я что-то слышал о Quick Sort... Ведь массивы довольно большие... а всякие сортировки дедовским методом пузырька не будут быстрыми...)
PM MAIL WWW ICQ   Вверх
zkv
Дата 31.8.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата

по поводу форматирования: программа пишется для себя и никуда здаватся не будет. важна только работа.


а если через месяц (год, два) захочешь подправить свой код?

Цитата

а какие есть способы сортировки?

простыми включениями, простым выбором, простым обменом (пузырек), сложным выбором (двоичное дерево),  сложными вставками (Шелла),  сложным обменом (Хоора или Quick Sort)

что то из этого есть на этом же форуме в разделе "алгоритмы" если я не ошибаюсь
PM MAIL   Вверх
kondr
Дата 1.9.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Отсортировать оба.


Зачем, если мы ищем элементы первого массива во втором? Остортировать только второй массив, а потом перебитрать элементы первого и бинарным поиском искать их во втором.
PM MAIL   Вверх
maxim1000
Дата 1.9.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



пожалуй, этот вариант ещё лучше, получатся n*log n+m*log n
а в случае двух сортировок - n*log n+m*log m [ну ещё+m+n, но это не так важно]
преимущества 2:
1. если размеры массивов разные, то мы можем, как захотим, выбирать, что m, а что n, тогда при сортировке меньшенго массива m*log n будет меньше m*log m
2. быстрая сортировка не гарантирует n*log n, так что сортируя только один массив мы уменьшаем риск (бинарный поиск даёт log n гарантированно), а сортировка слиянием, которая гарантирует n*log n, требует n памяти, так что сортировать только меньший массив тоже выгодно
впрочем, на небольших массивах эти различия могут быть незаметны...

Это сообщение отредактировал(а) maxim1000 - 1.9.2006, 12:01


--------------------
qqq
PM WWW   Вверх
Oleg_Ci
Дата 1.9.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


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

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



Цитата
а какие есть способы сортировки? я что-то слышал о Quick Sort... Ведь массивы довольно большие... а всякие сортировки дедовским методом пузырька не будут быстрыми...)
Код

#include <algorithm>
...

const int size = 10;
int mas[ size ];
std::sort( mas, mas + size );
...
Помойму там "быстрая"(так называется) сортировка.
PM MAIL   Вверх
ReGeDiT
Дата 4.9.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



гмммммммммммммммммм.......................

ладно. допустим сортировка 1го массива будет эффективней сортировки 2х сразу.

тогда, может лучше отсортировать 2 массива, и вычёркивать из второго проверенные элементы?.. т.е. сокращать массив... я просто незнаю как это реализовать. И может ли кто написать какой-нибудь быстрый алгоритм сортировки на C (НЕ C++!!)

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

З.Ы.: Какие в Microsoft Visual C++ 7.0 есть средства тайминга программ (засекать скорость работы..).
PM MAIL WWW ICQ   Вверх
Greeen
Дата 4.9.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ReGeDiT @  4.9.2006,  22:14 Найти цитируемый пост)
И может ли кто написать какой-нибудь быстрый алгоритм сортировки на C

В разделе "Алгоритмы" поищи...
Цитата(ReGeDiT @  4.9.2006,  22:14 Найти цитируемый пост)
Какие в Microsoft Visual C++ 7.0 есть средства тайминга программ

DWORD GetTickCount(void);


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


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


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

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



Цитата(ReGeDiT @  5.9.2006,  02:14 Найти цитируемый пост)
И может ли кто написать какой-нибудь быстрый алгоритм сортировки на C (НЕ C++!!)

qsort из стандартной библиотеки си (не с++)


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



в алгоритме qsort ничего хорошего. он рекурсивный, поменяешь глубину рекурсии и получишь проблемы со скоростью выполнения. Есть более простые способы сортировки, которые пишутся вручную за две минуты...


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
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.0829 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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