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