Хорошо, внутренний цикл (цикл с k
в качестве итератора) выполняется n-j+1
раз, поскольку он начинается с j
и заканчивается на n
.
Общее количество шагов , которое выполняет средний цикл for
, является суммой шагов на итерацию для j
, так что это означает, что общее количество раз, которое мы выполняем тело внутреннего Цикл for:
n
---
\ n * (n + 1)
/ n - j + 1 = -------------
--- 2
j=1
, поэтому после одной итерации внешнего цикла (с итератором i
) мы имеем n*(n+1)/2
шагов.
Таким образом, в целом наш алгоритм будет выполнять тело внутреннего цикла в общей сложности n * n * (n+1)/2
раз. Поскольку внешний цикл выполняется n
раз, а количество шагов в теле этого цикла не не , зависит от значения самого i
.
Если мы считаем, что часть num <- j + 1
выполняется в постоянное время (строго говоря, суммирование огромных чисел не может быть выполнено в постоянное время), то это, таким образом, O (n 3 sup>) алгоритм.
Мои извинения за то, что не действительно вставили детали здесь, но основной подход OO состояли бы в том, чтобы сделать DTO членом класса ActiveRecord и сделать, чтобы ActiveRecord делегировал средства доступа и мутаторы к DTO. Вы могли использовать инструменты генерации кода или рефакторинга для создания классов DTO довольно быстро из классов AcitveRecord.
Доменные объекты знают и заботятся о БД? Не в этом ли смысл доменных объектов содержать ТОЛЬКО бизнес-логику и полностью не знать о БД и ORM? .... У вас должны быть эти объекты? Вам просто нужно ИСПРАВИТЬ их, если они содержат все эти вещи ... вот почему я немного запутался, как появился DTO
Не могли бы вы предоставить более подробную информацию о том, с какими проблемами вы сталкиваетесь при отложенной загрузке?
Я решил проблему, очень похожую на это, где я скопировал данные из большого количества более старых контрактов веб-сервиса в контракты данных WCF. Я создал много методов, которые имели подписи как это:
public static T ChangeType<S, T>(this S source) where T : class, new()
В первый раз, когда этот метод (или любая из других перегрузок) выполняется для двух типов, он смотрит на свойства каждого типа и решает, которые существуют и в на основе имени и в типа. Это берет это 'членское пересечение' и использует класс DynamicMethod для emil IL для копирования исходного типа в целевой тип, тогда это кэширует получающегося делегата в ориентированном на многопотоковое исполнение статическом словаре.
, Как только делегат создается, это неприлично быстро, и я обеспечил другие перегрузки для передачи в делегате для копирования по свойствам, которые не соответствуют перекрестным критериям:
public static T ChangeType<S, T>(this S source, Action<S, T> additionalOperations) where T : class, new()
..., таким образом, Вы могли сделать это для своей Личности к примеру PersonDTO:
Person p = new Person( /* set whatever */);
PersonDTO = p.ChangeType<Person, PersonDTO>();
И любые свойства и на Человеке и на PersonDTO (снова, которые имеют то же имя и тип) был бы скопирован испускаемым методом времени выполнения, и любые последующие вызовы не должны будут быть испущены, но снова использовали бы тот же испускаемый код для тех типов в том порядке (т.е. копирование PersonDTO Человеку также подвергнется хиту для испускания кода).
Это - слишком много кода для регистрации, но если Вам будет интересно, то я приложу усилие, чтобы загрузить образец на SkyDrive и отправить ссылку здесь.
Richard
Вам следует использовать automapper, о котором я писал здесь:
http://januszstabik.blogspot.com/2010/04/automatically-map- your-heavyweight-orm.html # links
Пока свойства имеют одинаковые имена для обоих ваших объектов, автоматическое преобразование будет обрабатывать это.
используйте ValueInjecter , с его помощью вы можете сопоставить что угодно с чем угодно, например
и у него есть интересные функции, такие как: выравнивание и выравнивание
загрузка содержит множество образцов