Вот как раз я и хотел сразу предложить вариант с SQL запросом (только пока не делал, а могу предложить подход). Во-первых, сам цикл писать не надо, пишешь только условия (select ... where <условия>). Конечно, в базе данных будет этот цикл перебора, но всё-таки базу данных писали программисты и математики, поэтому они постарались провести оптимизацию. Во-вторых, (напр. у MS SQL Server) есть анализатор. Если он покажет длинный кусок, можно постараться сделать что-то по-другому. Итак, решение - это формирование промежуточных наборов данных (подзапросов). Сначала можно получить набор отрезков, имеющих ровно одну общую вершину (назовём этот набор "галочки"). Затем из набора галочек получить набор двойных галочек, имеющих общее ребро. Мы почти закончили (для треугольников). Осталось выяснить, чтобы у последнего набора вершина из первого набора галочек совпадала с вершиной из другого набора галочек (обе эти вершины не принадлежат общему ребру). Пример. У галочки ABC и галочки XYZ есть общее ребро (BC = XY) и совпадают вершины A и Z.
|