![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| MastEdm |
|
|||
![]() Master ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 3.12.2005 Где: Москва, МГИУ Репутация: 1 Всего: 2 |
После некоторых размышлений родился такой вариант (строки заменил на идентификаторы):
При таком раскладе добавление за log(n), построение таблицы константное время занимает (я не учитываю печать), определение позиции по id за log(n). Может что-то можно эффективнее сделать? PS Прошу не пинать за форматирование кода: пришлось применить автоматическое форматирование из kdevelop, поскольку сам пишу в emacs... Это сообщение отредактировал(а) MastEdm - 8.8.2008, 14:59 |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ох, не уверен вот этот цикл:
,как мне кажется, может сделать из логирифма линейное время предположим, что у нас получилось куча слов с одинаковым количеством экземляров (что, в общем-то, для обычного текста не так уж странно), тогда при увеличении одного из таких слов придётся его протащить наверх, срелняя длина будет пропорицональна длине такого отрезка Добавлено через 3 минуты и 17 секунд можно тупо построить мапу <строка, количество экземпляров>, потом перегнать её в вектор пар, отсортировать его по строкам и искать там нужную строку за логарифм (т.к. отсортированный), а индекс - как раз нужная позиция -------------------- qqq |
|||
|
||||
| MastEdm |
|
|||
![]() Master ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 3.12.2005 Где: Москва, МГИУ Репутация: 1 Всего: 2 |
Да, конечно. Но поскольку слово редкое, то и добавляться оно будет не так часто. Вернее сказать оно добавится только один раз и сразу запишется в конец. Хотя над этим местом стоит подумать. Есть идея ввести пороговое минимальное значение, ниже которого все значения считать равными. В моей задаче время критично. Поэтому хотелось бы получить наиболее оптимальное решение.
|
|||
|
||||
| MastEdm |
|
||||
![]() Master ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 3.12.2005 Где: Москва, МГИУ Репутация: 1 Всего: 2 |
Можно, только сортировка в любом случае займет n*log(n). И сортировать нужно не по строкам, а по счетчику. Мы ведь рейтинг строим. А если отсортировано по счетчику, то по строке искать за логарифм не получится. Итого, по двум вариантам алгоритма:
У меня складывается дурное предчувствие, что ничего лучше придумать не получится Есть такая мысля. Заводим два массива указателей на структуру:
Индексация в массиве table по id строки, а в top записи отсортированы по счетчику. Таким образом добавление займет время C*n в худшем случае, определение позиции - константное время. Вроде все хорошо, но теперь встанет вопрос об индексации строк. Благо для этого у меня уже есть отлаженный механизм Это сообщение отредактировал(а) MastEdm - 8.8.2008, 14:04 |
||||
|
|||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
да, это я что-то ступил маленько... можно сначала отсортировать по счётчику, пробежаться, подобавлять в каждую запись позицию (т.е. индекс), а потом - по строкам, чтобы искать легко было но быстрее n*log n вряд ли что-то получится... -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |