![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| wallstreet |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
Доброго всем дня.
У меня есть двумерная очередь в которую динамически льются данные. Первым полем в очереди является время в строковом формате, оно же фактически и будет являться ключем выборки по остальным данным. Таким образом, мне необходимо брать определенные данные, которые, грубо говоря, позже указанного времени. Пример: мне нужно взять данные начиная с 13:30:45. Из ряда данных: 0. 13:21:15 1. 13:28:48. 2. 13:31:25. 3. 13:45:05. 4. 13:50:35. 5. 13:51:15. мне нужно найти первую запись которая была позже или равна необходимому, т.е. в моем случае 13:31:25 с индексом в очереди 2. Собственно я бы хотел узнать насколько мой вариант реализации является оптиммальным и правильным. Заранее всех благодарю за участие в теме! и так, приступим. Для наглядности я привел пример с одномерной очередью. Вот очередь:
вот интересующее меня время:
ну и собственно, решение
Сразу сажу, в данном варианте данных правильный индекс начала выборки будет 3. Это сообщение отредактировал(а) wallstreet - 13.2.2013, 15:32 |
||||||
|
|||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Намека даже нет. Что я бы сделал в первую очередь. 1. Бинарный поиск, время же отсортировано. 2. Время хранить не в строковом виде, а в цифре. (превращать в цифру при добавлении в очередь.) ну и соответственно, от вышележащего кода мало что остаёцца... Добавлено через 7 минут и 51 секунду 2-е в принципе опционально, зависит от других факторов, но очень желательно. |
|||
|
||||
| wallstreet |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
сделал так:
Что-то меня смущает эта суета с конвертирование времени, не слишком ли это затратно получится?
Дело в том, что формат импортируемых таблиц строго задан разработчиком внешнего приложения, а конвертировать при добавлении в очередь думаю не очень рационально, т.к. иногда приходит таблица размером 200000х15 и построчно конвертировать ее данные сильно тормознет процесс. Во всяком случае так мне кажется. |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
То есть вы считаете что многократно конвертировать при поиске будет более рационально? NB. Храните данные не в deque, а map (или multimap) - данные будут сразу отсортированные и поиск будет в 1 строку |
|||
|
||||
| wallstreet |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
принято!
если капнуть глубже и учесть что данные льются по DDE, то тут для большей скорости добавления, думаю, лучше подойдет list |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Все же deque. У list'а будут большие накладные расходы на работу с динамической памятью. Но тут надо учесть, что чаще происходит - модификация данных или поиск в них. Если второе, и метки времени могут идти не по порядку, то лучше map. Иначе лучше deque. PS. Для бинарного поиска в deque можно воспользоваться стандартным алгоритмом lower_bound |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
wallstreet, я бы еше хранил не время а дату целиком, потому-что при переходе через полночь программа начнет глючить.
Согласитесь, странно будет, если работоспособность программы будет зависеть от времени суток . |
|||
|
||||
| wallstreet |
|
||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
модификация происходит один раз, при их поступлении. А вот их анализ и вывод результата на форму происходит при получении любых данных, не обязательно только из этой таблицы. Т.е. я делаю вывод что лучше их конвертировать один раз при получении.
честно признаться, не понял как передать туда итератор двумерной очереди. Точнее указатель именно на то поле двумерной deque в которой будет храниться время. я решил сохранять время в формате time_t с предварительной инициализацией текущей даты.
А вот код приема и конвертации данных:
в таком случае выборка делается вот так
|
||||||||||
|
|||||||||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Ну как то так -
|
||||||
|
|||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
wallstreet, очень заграможденный код. много повторов. глубоко вложенные конструкции. это все не есть хорошо.
|
|||
|
||||
| wallstreet |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
суть уловил, но как мне первый аргумент представить в виде time_t? ведь Cell это структура, тип нужен её элемента (Cell.time);
постоянно работаю над этим, но сложно, т.к. не представляю, в силу своего нулевого опыта, как может быть по другому( Для примера, можно разобрать этот участок кода:
как его можно сделать более оптимальным? Это сообщение отредактировал(а) wallstreet - 27.2.2013, 15:36 |
||||||
|
|||||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Первый не надо - функция сравнения сама достанет нужное поле
Судя по сообщению вы подали 3м параметром в lower_bound сам deque вместо time_t (tTimeToFind) |
||||
|
|||||
| wallstreet |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
да вроде нет, не передавал?!?!
|
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
wallstreet, первое что надо сделать, это общую процедуру для включения одной записи, и для включения нескольких. просто при одной размер равен 1. зачем дублировать? Чтоб что-то еще подсказать, мне не понятно: зачем у вас таблица двумерная, на словах можете объяснить? почему время храницца только в blabla[][1].time, а что находицца например в blabla[][0].time, или в blabla[][2].time ? |
|||
|
||||
| wallstreet |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
таблица состоит из 7 полей: Номер записи; Время; Эмитент; Цена; Объем; Операция Тип short time_t std::string double double std::string первая запись в таблице всегда строка. Во всех проме первой записи в поле, к примеру цены, всегда в структуру заполняется только struct.d (т.е. double) все остальные не инициализируются Это сообщение отредактировал(а) wallstreet - 27.2.2013, 16:49 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |