![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ReGeDiT |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 4.7.2006 Где: Пущино на Оке Репутация: нет Всего: нет |
для некоторых целей, мною был создан сложный алгоритм для поиска значений одного массива в другом. Т.е. проверить содержутся ли во 2м массиве элементы первого. До сих пор у меня есть уверенность что сделать всё можно намного проще
Вот мой алгоритм:
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Отсортировать оба.
Если менять нельзя, отсортировать копии, и искать в них. Если порядок зачем-то нужно сохранить, заведи структуру {значение, исходный индекс}, отсортируй ее по значению (можно еще флаг добавить - "встречается\не встречается"), проверь, выведи все скопом. Как искать совпадения в отсортированных массивах надо объяснять? ЗЫ И не пиши так ужасно код: чего строчки экономишь? Читать же невозможно... -------------------- ... |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
Ну во-первых существующий алгоритм неплохо было быупростить для понимания человеком - два вложенных цикла смотрелись бы значительно проще, а работали бы так же
если рассматривать два произвольно заполненных массива, то сомневаюсь, что можно сделать быстрее однако, можно работать с отсортированными массивами - тогда поиск будет значительно быстрее можно также работать с hash-массивами, хотя мне кажется, что по сравнению с отсортированными разницы не будет P.S. о, не успел Это сообщение отредактировал(а) maxim1000 - 31.8.2006, 17:40 -------------------- qqq |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Про форматирование...
К сожалению, ни в школе, ни в институте не учат правильному форматированию программ. И вот каждый пытается изобрести велосипед... В конце концов, он приходит к одному из общепринятых стилей... Но не сразу. ReGeDiTКак ты думаешь, код в таком виде читается лучше, чем тот, что дал ты?
Кстати, обрати внимание на использование оператора ++. Если тебе не нужно получать значение до выполнения инкремента, то лучше использовать ++i, так как гарантированно быстрее работает (а скорость работы i++ сильно зависит от качества и степени оптимизации). |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
у нас препод отказывался проверять прогу, пока она не будет отформатирована как он считал нужным. Можно было возмущаться по-этому поводу, но прогу все равно приходилсь форматировать Простите за оффтоп - не мог не вступиться за преподавателей Это сообщение отредактировал(а) zkv - 31.8.2006, 18:09 |
|||
|
||||
| Oleg_Ci |
|
||||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 3 Всего: 30 |
Я нечто похожее делал:
|
||||
|
|||||
| ReGeDiT |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 4.7.2006 Где: Пущино на Оке Репутация: нет Всего: нет |
по поводу форматирования: программа пишется для себя и никуда здаватся не будет. важна только работа.
спасибо за подсказки с сортировкой и ++i; а какие есть способы сортировки? я что-то слышал о Quick Sort... Ведь массивы довольно большие... а всякие сортировки дедовским методом пузырька не будут быстрыми...) |
|||
|
||||
| zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
а если через месяц (год, два) захочешь подправить свой код?
простыми включениями, простым выбором, простым обменом (пузырек), сложным выбором (двоичное дерево), сложными вставками (Шелла), сложным обменом (Хоора или Quick Sort) что то из этого есть на этом же форуме в разделе "алгоритмы" если я не ошибаюсь |
||||
|
|||||
| kondr |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 24.11.2005 Репутация: нет Всего: 1 |
Зачем, если мы ищем элементы первого массива во втором? Остортировать только второй массив, а потом перебитрать элементы первого и бинарным поиском искать их во втором. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Oleg_Ci |
|
||||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 3 Всего: 30 |
|
||||
|
|||||
| ReGeDiT |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 4.7.2006 Где: Пущино на Оке Репутация: нет Всего: нет |
гмммммммммммммммммм.......................
ладно. допустим сортировка 1го массива будет эффективней сортировки 2х сразу. тогда, может лучше отсортировать 2 массива, и вычёркивать из второго проверенные элементы?.. т.е. сокращать массив... я просто незнаю как это реализовать. И может ли кто написать какой-нибудь быстрый алгоритм сортировки на C (НЕ C++!!) ТАКЖЕ! допустим имеется 1 массив, как проверить его на повторяющиеся элементы, т.е. допустим есть ли в нём одинаковые... они могут быть совершенно в разных местах? в голову ничего не лезет... З.Ы.: Какие в Microsoft Visual C++ 7.0 есть средства тайминга программ (засекать скорость работы..). |
|||
|
||||
| Greeen |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 710 Регистрация: 13.8.2006 Где: Петербург Репутация: 7 Всего: 18 |
В разделе "Алгоритмы" поищи... DWORD GetTickCount(void); -------------------- Подпись больше не нужна |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
qsort из стандартной библиотеки си (не с++) -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| ДобренькийПапаша |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 14.1.2006 Где: г.Москва Репутация: нет Всего: 7 |
в алгоритме qsort ничего хорошего. он рекурсивный, поменяешь глубину рекурсии и получишь проблемы со скоростью выполнения. Есть более простые способы сортировки, которые пишутся вручную за две минуты...
-------------------- Меня зовут Себастьян Парейра, торговец чёрным деревом. |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
То что пишется за две минуты иногда отлаживается за пол часа и даже более. Гораздо более серьезной проблемой qsort а является то, что он вызывает ф-цию каждый раз для сравнения [std::sort может заinlineить компаратор, а вот qsort очень навряд ли]. Однако в любом случае - не стоит что-либо оптимизировать и переписывать, пока profiler показывает что в этом нет особой нужды. Это сообщение отредактировал(а) Mayk - 5.9.2006, 18:00 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Greeen |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 710 Регистрация: 13.8.2006 Где: Петербург Репутация: 7 Всего: 18 |
-------------------- Подпись больше не нужна |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Вообще это англ Comparator. "Сравниватель". В частности
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| ReGeDiT |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 4.7.2006 Где: Пущино на Оке Репутация: нет Всего: нет |
кхм, ладно, с сортировкой покончили... вот ещё пару вопросов на повестке дня
"Тогда, может лучше отсортировать 2 массива, и вычёркивать из второго проверенные элементы?.. т.е. сокращать массив... я просто незнаю как это реализовать. (можете помочь то...) ТАКЖЕ! допустим имеется 1 массив, как проверить его на повторяющиеся элементы, т.е. допустим есть ли в нём одинаковые... они могут быть совершенно в разных местах? в голову ничего не лезет... (помогите тоже.....)" алгоритм мой в самом первом посте... и как всё-таки таймингом пользоватся то?? можно примерчик то Это сообщение отредактировал(а) ReGeDiT - 5.9.2006, 20:58 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Опять отсортировать, тогда одинаковые элементы будут рядом. В STL есть алгоритм unique, который убирает дубликаты. -------------------- ... |
|||
|
||||
| ReGeDiT |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 4.7.2006 Где: Пущино на Оке Репутация: нет Всего: нет |
Earnest, а если элементов 200? =)
Может всё-таки кто-нибудь поможет мне..........................? 1) Помогите усовершенствовать мой код выше! У меня такая идея, может лучше отсортировать 2 массива, и вычёркивать из второго проверенные элементы?.. т.е. сокращать второй массив... я просто незнаю как это реализовать. 2) Имеется 1 массив, как проверить его на повторяющиеся элементы, т.е. допустим есть ли в нём одинаковые... они могут быть совершенно в разных местах, и их может быть много? 3) Как пользоватся таймингом? можно примерчик то -.- |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
А что 200 - это по-твоему много? Много - это 200 000. А на 200 почти нет разницы - что линейный поиск, что бинарный.
Что именно тебе не понятно? В отсортированном массиве одинаковые элементы стоят рядом: бери и проверяй, за один проход. Если речь идет о сравнении 2 отсортированных массивов, то там тоже просто: инкрементируй индекс первого, пока его элементы меньше второго. И наоборот. Если элементы совпадают, инкрементируй оба индекса. По-моему, кто-то такой код тебе уже писал. Что значит "не знаю как реализовать"? Пока не попробуешь, не узнаешь. -------------------- ... |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
| ReGeDiT |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 4.7.2006 Где: Пущино на Оке Репутация: нет Всего: нет |
я имею в виду то что, вдруг будут 200 одинаковых рядом. Массив состоит примерно из 50 000 элементов ;). откуда я знаю сколько раз проверять массив?
|
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
ReGeDiT, если я правильно понял вопрос - уничтожаешь следующее число до тех пор, пока не конец массива, либо пока следующее число не станет отлично от данного. это только как один из многих вариантов
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Voldemar2004 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1650 Регистрация: 25.12.2004 Репутация: нет Всего: 23 |
На работе была такая же задача: нужно было выбрать из БД все номера ИНН и номера, которые попали на выделение, затем сравнить и получить список тех людей, которые не попали. Вкратце так:
-------------------- i_i (';') (V) ![]() |
|||
|
||||
| Voldemar2004 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1650 Регистрация: 25.12.2004 Репутация: нет Всего: 23 |
-------------------- i_i (';') (V) ![]() |
|||
|
||||
| ReGeDiT |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 4.7.2006 Где: Пущино на Оке Репутация: нет Всего: нет |
спасибо!
осталось 2 вопроса --- посмотрел второй код получше... а там ведь сравнивается просто на 2 одинаковых максимум... а если их больше? сделать цикл по длине массива а внутрь его запихнуть это? тока мне кажется будет бред Это сообщение отредактировал(а) ReGeDiT - 9.9.2006, 15:44 |
|||
|
||||
| Voldemar2004 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1650 Регистрация: 25.12.2004 Репутация: нет Всего: 23 |
Каких? -------------------- i_i (';') (V) ![]() |
|||
|
||||
| Voldemar2004 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1650 Регистрация: 25.12.2004 Репутация: нет Всего: 23 |
Нет.
{1, 99, 9, 3, 0, 34, 654, 34, -345, 3456, 34, -1000, 321, 13244, 0, 654, -100, 1000, -1000, 9}; 34 - встречается 3 раза, выводим - два раза 34 - они "лишние". Хотя, можно еще так: если число встречается > 2 раз, то выводим его столько раз сколько оно встречается в массиве:
-------------------- i_i (';') (V) ![]() |
|||
|
||||
| Oleg_Ci |
|
||||||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 3 Всего: 30 |
|
||||||
|
|||||||
| Oleg_Ci |
|
|||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 3 Всего: 30 |
Простите, не туда записал
Всё удалил... Это сообщение отредактировал(а) Олег4 - 12.9.2006, 18:02 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |