![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: нет Всего: 191 |
Здравствуйте! Моим заданием было написать функцию, возвращающую число нулевых битов в символах строки, быстрым методом. Я сделал так:
Но мне сказали, что неоптимально. Как можно улучшить данный код? Это сообщение отредактировал(а) Rrader - 12.5.2008, 12:41 |
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Нагло сппрочитано в книге Г. Уоррен - "Алгоритмические трюки для программистов" |
|||
|
||||
| Alek86 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
можно составить массив байтов(unsigned char), в котором будут 256 элементов
в нем под Х-тым номером будет записано число нудевых бит в числе Х к примеру:
а потом пробегаться по твоей строке и суммировать соответсттвующие ей элементы массива:
если покажется неприятным заполнение массива, то могу тебя успокоить - в C++ есть такая шткука - метапрограммирование. она бы могла избавить от мартышкиного труда в заполнении массива, но слишком трудна для понимания новичкам Добавлено через 54 секунды Lazin, кажется, мое быстрее |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
мое сразу в 4х байтах считает, так что это еще надо посмотреть что быстрее |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
только на каждой итерации превращать 4 символа в 1 (недолго, но все же) + проверять выход за границы строки (если четверками прыгать, то очень легко)
бррр... тогда мой код проще |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
совсем наоборот, что-то вроде
и вперед ну и заранее вычислить адрес последнего элемента массива, а все что не кратно 4 - по одному байту... просто в моем случае обращений к памяти будет почти(почти, потому-что количество байт строки может не быть кратно 4-м) в 8 раз меньше Добавлено через 43 секунды так и да, проще |
||||
|
|||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
усе, я завелся
если подскажешь как в C++ можно замерить время (типа GetTickCount() - GetTickCount() виндозного), то будем ща меряться (для большой строчки сгенеренной тем же рандомом) |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
a = GetTickCount();
вычисляем GetTickCount() - a; |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
я просто не помню, как и что подключать для этой функции надо Добавлено @ 14:31 в общем тут 2 кода можешь покритиковать если знаешь, как подключить - подскажи, ато никак не проверишь...
Это сообщение отредактировал(а) Alek86 - 12.5.2008, 14:32 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Я считаю биты так (считаются единичные биты, но легко переделать на нулевые):
Почему работает метод Уоррена пока не понял. Это сообщение отредактировал(а) math64 - 12.5.2008, 15:01 |
|||
|
||||
| Alek86 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
в общем такой код
дает у меня в релизе такой результат (MSVC 2005)
|
||||
|
|||||
| Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
у мну вот так
результат:
Добавлено @ 15:32 вот с этим кодом результат такой:
Это сообщение отредактировал(а) Lazin - 12.5.2008, 15:34 |
||||||
|
|||||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
ты немного схалявил по условию дана строка, так что чтобы узнать ее конец, надобно или самому еще раз циклом пробежаться по всей строке (до нуля) или на каждой итерации проверять а ты, как вижу, считаешь, что указатель на конец известен |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |