![]() |
|
Модераторы: 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 ничего хорошего. он рекурсивный, поменяешь глубину рекурсии и получишь проблемы со скоростью выполнения. Есть более простые способы сортировки, которые пишутся вручную за две минуты...
-------------------- Меня зовут Себастьян Парейра, торговец чёрным деревом. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |