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

21 Авг 2019 в 07:01
179 +1
0
Ответы
1

Если вы хотите ускорить поиск в таблице соответствия объектов, то можно воспользоваться стандартными структурами данных, такими как словари (Dictionaries) или хеш-таблицы (Hash tables), которые обеспечивают быстрый доступ к данным.

В C#, вы можете использовать класс Dictionary<TKey, TValue> для хранения соответствия объектов. В качестве ключа (TKey) вы можете использовать объекты, которые нужно сравнивать, а в качестве значения (TValue) - объекты, с которыми они ассоциированы.

Пример кода на C# может выглядеть примерно так:

using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Dictionary<object, object> equivalentTable = new Dictionary<object, object>();
// Добавление соответствия объектов
equivalentTable.Add(a, b);
equivalentTable.Add(c, d);
// Проверка на эквивалентность
bool result = false;
if (equivalentTable.ContainsKey(a) && equivalentTable[a] == b)
{
result = true;
}
Console.WriteLine(result);
}
}

Таким образом, используя стандартные структуры данных, вы сможете значительно ускорить процесс поиска соответствия объектов в вашем проекте.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир