Чтобы получить временную сложность вложенного цикла, вам нужно понять, как часто каждый цикл выполняет свое тело.
В вашем примере for(i=1;i<=n;i++)
- это цикл, выполняющий свое тело n
раз.
for(j=1;j<=m;j++)
будет запускать свое тело m
раз, а for(k=1;k<=p;k++)
- его тело p
раз.
Поскольку два внутренних цикла будут выполняться каждый на итерацию соответствующего внешнего цикла, вы можете сделать следующие операторы.
n
раз m
раз, таким образом, третий цикл будет выполняться n*m
раз p
раз, таким образом, оператор печати выполняется n*m*p
раз. Таким образом, временная сложность этого кода составляет ϴ(n*m*p)
.
В общем, когда речь идет о вложенных циклах, временная сложность кода всегда будет в терминах условий цикла. Действительно, есть особые случаи, такие как зависимые условия цикла или циклы, содержащие код с операторами break
для безусловно возникающего условия.
Теперь я хотел бы отметить, что здесь мы на самом деле считаем сравнения, сделанные циклами for
, а не то, как часто выполняется оператор print
. Тем не менее, подсчет с оператором print
и телами циклов в качестве основы облегчает задачу, а временная сложность остается той же.
На первый взгляд существует три проблемы с Вашим кодом:
1: необходимо использовать ServiceKnownTypeAttribute для определения известных типов при представлении только базовых типов в контрактах на операцию:
[ServiceContract(Namespace = "yyyWCF")]
public interface IClientBroker
{
[OperationContract]
[ServiceKnownType(typeof(Client))]
[WebInvoke(
Method="GET",
BodyStyle=WebMessageBodyStyle.WrappedRequest,
ResponseFormat=WebMessageFormat.Json)]
IClient GetClientJson(int clientId);
}
2: Необходимо использовать WebMessageBodyStyle.WrappedRequest
вместо WebMessageBodyStyle.Wrapped
потому что последний не совместим с WebScriptServiceHostFactory.
3: По моему скромному мнению, использование Метода = "ДОБИРАЕТСЯ", было бы БОЛЕЕ УСПОКОИТЕЛЬНЫМ для метода под названием GetClientJson, чем Метод = "POST"
Другой совет, который я мог дать Вам, когда работа с сервисами WCF должна использовать SvcTraceViewer.exe, связанный Visual Studio. Это - большой инструмент для отладки целей. Все, в чем Вы нуждаетесь, должно добавить следующий раздел к Вашему app/web.config:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="sdt"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "WcfDetailTrace.e2e" />
</listeners>
</source>
</sources>
</system.diagnostics>
Затем вызовите веб-метод, и файл WcfDetailTrace.e2e будет сгенерирован в Вашем корневом каталоге веб-сайта. Затем откройте этот файл с SvcTraceViewer.exe, и Вы будете видеть большую полезную информацию. Например, это могло сказать:
Не может сериализировать параметр типа 'MyNamespace. Клиент' (для операции 'GetClientJson', сократите 'IClientBroker'), потому что это не точный тип 'MyNamespace. IClient' в сигнатуре метода и не находится в известном наборе типов. Для сериализации параметра добавьте тип к известному набору типов для операционного использования ServiceKnownTypeAttribute.
Конечно, Вы не должны забывать комментировать этот раздел перед входом в производство, или Вы могли бы закончить с некоторыми довольно большими файлами.
Я на 99% уверен, что Вы наклоняетесь, возвращают интерфейс. Я не думаю, что Интерфейсы являются сериализуемыми.
проверьте этот поток