Название: Построить ID Отправлено: Igors от Февраль 11, 2017, 16:58 Добрый день
Испытываю затруднения с вроде бы простой задачкой. - Дано N точек (N может быть сколь угодно большим) и M actions (M обычно порядка 200). Каждая action хранит вектор пар индекс точки + вес, т.е. Код Обычно для точки активно 4-5 actions Надо: вычислить и присвоить каждой точке ID которые должны совпадать для точек у которых все actions совпадают и имеют те же веса. Пример точка 1; (action 1, weight = 1) + (action 2, weight = 1) // ID = 1 точка 2; (action 2, weight = 1) + (action 3, weight = 1) // ID = 2 точка 3; (action 1, weight = 1.1) + (action 3, weight = 1) // ID = 3 точка 4; (action 1, weight = 1.1) + (action 3, weight = 1) // ID = 3 Спасибо Название: Re: Построить ID Отправлено: Racheengel от Февраль 11, 2017, 21:22 адрес интанции каждого action можно сконвертировать в интегер,
далее суммируем со сдвигом: ID1 = action 1 << 64 + weight << 128 + action 2 << 256 + weight ... (я принял каждое значение за 64 бита, как наиболее универсальное на сегодня) Название: Re: Построить ID Отправлено: Old от Февраль 11, 2017, 21:33 адрес интанции каждого action можно сконвертировать в интегер, Сдвиг более чем на 63 бита для 64-битного числа это UB.далее суммируем со сдвигом: ID1 = action 1 << 64 + weight << 128 + action 2 << 256 + weight ... (я принял каждое значение за 64 бита, как наиболее универсальное на сегодня) Что вы ждете на выходе (кроме 0)? Название: Re: Построить ID Отправлено: Racheengel от Февраль 12, 2017, 01:21 я псевдокод написал - не понимайте буквально.
по сути на выходе будет ID из четырех 64-битных чисел. можно по другому: каждому экшину присваиваем уникальный айди - далее все чудо это сериализируем в QByteArray: array << action1.id() << weight1 << action2.id() << weight2 и имеем уникальную последовательность байт - чем не ID :) Название: Re: Построить ID Отправлено: Igors от Февраль 12, 2017, 11:21 ID требуется в виде одного числа, напр int. Немного похоже на построение хеш-кода, но требуется уникальность, зато ID вычисляются все 1 раз, пусть и не быстро. Смысл "свернуть" данные actions для операций с точками где они могут дублироваться и удаляться.
Есть очень простой вариант - для каждой точки построить вектор пар индекс action + weight, а потом назначить ID используя ассоциативный контейнер. Примерно: берем первую точку и назначаем ей ID = 0. Берем 2-ю. Если ее вектор пар точно такой же как у первой, то ее ID тоже 0, иначе 1. Но "контейнер контейнеров" - это так ужасно коряво :'( Но ничего более изящного мне придумать не удалось. |