Добрый день всем.
Есть один проект в матлабе, который я хочу постепенно перегнать на какой-то другой язык программирования по частям (часть классов переписать и вызывать из матлабовских... когда-нибудь перепишу все целиком).
В проекте предусмотрена многоуровневая база данных.
Мне необходимо сделать операцию ассоциации между двумя объектами (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#, т.к. с ним знаком, но пойдет и что-то другое.
Т.е. я знаю, что можно сделать такой же велосипед и на шарпе один в один, но я боюсь тормозов, меня интересует прежде всего оптимизированный по скорости поиск...