@RicardoGonsales

Как лучше сделать таблицу соответствия объектов?

Добрый день всем.
Есть один проект в матлабе, который я хочу постепенно перегнать на какой-то другой язык программирования по частям (часть классов переписать и вызывать из матлабовских... когда-нибудь перепишу все целиком).

В проекте предусмотрена многоуровневая база данных.
Мне необходимо сделать операцию ассоциации между двумя объектами (reference type)
Т.е. у меня грубо говоря есть объект А и В, нужно сделать операцию Поставить_В_соответствие(А,В) так, чтобы при запросе
А==В? делалась проверка, соответствуют ли эти объекты между собой.

!! Я не хочу заменять в базе данных А на В или В на А (т.е. делать что-то типа Х.A=В), из-за этого выплывает гора проблем по части логики работы, т.к. А может лежать в разных объектах, и при замене его на В нужно заморачиваться с системой поиска в этой базе данных, а еще нужно сделать так, чтобы при клонировании базы данных вся эта гора объектов в разных местах была заменена на клоны правильно

Проблему эту я решил, сделав велосипедный класс Equivalent_table, который представляет из себя массив примерно такой структуры

{ {A, B, C}; {E}; {X Y} }

Т.е. это cell array, в нем элементы - тоже cell array, в котором лежат проассоциированные handle-объекты (reference type)
Т.е. из примера выше: Соответствуют(А,В)=true, Соответствуют(А,X)=false
true для объектов в одной ячейке и false для объектов в разных.


Когда я хочу узнать, ассоциированы ли объекты А и В между собой, делается такой запрос

%% Функция проверки на эквивалентность
        function bool_result=Equalized(this,a,b)
            bool_result=false; %Исходно делаем допущение, что объекты не ассоциированы
            if eq(a,b) %если это одинаковые объекты, то результат true
                bool_result=true;
            else %если это два разных объекта, ищем в таблице
                [is_used_a, line_index_a, group_index]=this.Search(a); %сначала а
                [is_used_b, line_index_b, group_index]=this.Search(b); %потом b
                if is_used_a&&is_used_b&&line_index_a==line_index_b % и если они лежали в одной ячейке, типа  как выше {A, B, C}
                    bool_result=true;
                end
            end
        end

Сама эта таблица сунута (велосипедным образом) во что-то типа static property класса, к которому принадлежат сравниваемые объекты.
Т.е. как вы догадываетесь, при запросе, эквивалентированы ли a и b
oTable=Equivalent_table()
bool_result=oTable.Equalized(a,b)
идет тупо долгий-долгий цикл перебором по cell array, а затем еще раз циклом по cell array (функция Search), и это все ОЧЕНЬ, ОЧЕНЬ ТОРМОЗНОЕ, когда объектов в oTable становится много (а их порядка сотен или даже тысяч).

И вопрос: есть ли среди "нормальных" языков программирования аналогичные решения, но с БОЛЬШИМ БЫСТРОДЕЙСТВИЕМ?
Я бы предпочел C#, т.к. с ним знаком, но пойдет и что-то другое.
Т.е. я знаю, что можно сделать такой же велосипед и на шарпе один в один, но я боюсь тормозов, меня интересует прежде всего оптимизированный по скорости поиск...
  • Вопрос задан
  • 221 просмотр
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
Любой компилируемый язык будет быстрее матлаба.
Даже C# и Java.
Что за объекты у вас хранятся в этих таблицах?
Если таблицы отсортировать, то можно использовать двоичный поиск. Даже в матлабе будет существенное ускорение.
Ответ написан
@agimgal
А что собственно мешает создать ещё одну таблицу в БД с полями id, id_A, id_B и впихнуть всё сопоставление туда? при наличии индекса на id_A, id_B будет работать очень быстро. Даже переписывать на другой ЯП не обязательно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы