В качестве простой интуиции о том, что такое big-O (big-O) и big-Θ (big-Theta), они рассказывают о том, как изменяется количество операций, которые необходимо выполнить, когда вы значительно увеличите размер проблема (например, в 2 раза).
Линейная сложность по времени означает, что вы увеличиваете размер в 2 раза, количество шагов, которые вам нужно выполнить, также увеличивается примерно в 2 раза. Это то, что называется Θ(n)
и часто взаимозаменяемо, но не точно O(n)
(разница между O
и Θ
заключается в том, что O
обеспечивает только верхнюю границу, но Θ
гарантирует как верхнюю, так и нижнюю границы). [ 1124]
Логарифмическая временная сложность (Θ(log(N))
) означает, что при увеличении размера в 2 раза количество шагов, которые вам нужно выполнить, увеличивается на некоторое фиксированное количество операций. Например, используя бинарный поиск, вы можете найти данный элемент в вдвое длинном списке, используя только одну итерацию цикла руды.
Точно так же экспоненциальная сложность времени (Θ(a^N)
для некоторой константы a > 1
) означает, что если вы увеличите размер задачи всего на 1, вам потребуется a
раз больше операций. (Обратите внимание, что между Θ(2^N)
и 2^Θ(N)
есть небольшая разница, и фактически второй является более общим, оба лежат в экспоненциальном времени, но ни один из двух не покрывает все это, см. wiki для некоторых других детали)
Обратите внимание, что эти определения в значительной степени зависят от того, как вы определяете «размер задачи»
Как правильно указал @DavidEisenstat, есть два возможных контекста, в которых ваш алгоритм может быть виден:
Некоторые числа фиксированной ширины (например, 32-разрядные числа). В таком контексте очевидной мерой сложности алгоритма первичного тестирования является само проверяемое значение. В таком случае ваш алгоритм является линейным.
На практике существует много контекстов, в которых алгоритм простого тестирования должен работать для действительно больших чисел. Например, многие криптоалгоритмы, используемые сегодня (такие как обмен ключами Диффи-Хеллмана или RSA ), используют очень большие простые числа, такие как 512-битные, 1024-битные и так далее. Также в этом контексте безопасность измеряется количеством этих битов, а не конкретным простым значением. Таким образом, в таких условиях естественным способом измерения размера задачи является количество бит. И теперь возникает вопрос: сколько операций нам нужно выполнить, чтобы проверить значение известного размера в битах, используя ваш алгоритм? Очевидно, что если значение N
имеет m
битов, оно составляет около N ≈ 2^m
. Таким образом, ваш алгоритм из линейного Θ(N)
преобразуется в экспоненциальный 2^Θ(m)
. Другими словами, чтобы решить проблему для значения, которое на 1 бит длиннее, вам нужно выполнить примерно в 2 раза больше работы.
Проверьте designer.cs файл. Это - свойство ключа
[Column(Storage="_ParentKey", DbType="Int")]
public System.Nullable<int> ParentKey
{
get
{
return this._ParentKey;
}
set
{
if ((this._ParentKey != value))
{
//This code is added by the association
if (this._Parent.HasLoadedOrAssignedValue)
{
throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
}
//This code is present regardless of association
this.OnParentKeyChanging(value);
this.SendPropertyChanging();
this._ParentKey = value;
this.SendPropertyChanged("ParentKey");
this.OnServiceAddrIDChanged();
}
}
}
И это - свойство ассоциаций.
[Association(Name="Parent_Child", Storage="_Parent", ThisKey="ParentKey", IsForeignKey=true, DeleteRule="CASCADE")]
public Parent Parent
{
get
{
return this._Parent.Entity;
}
set
{
Parent previousValue = this._Parent.Entity;
if (((previousValue != value)
|| (this._Parent.HasLoadedOrAssignedValue == false)))
{
this.SendPropertyChanging();
if ((previousValue != null))
{
this._Parent.Entity = null;
previousValue.Exemptions.Remove(this);
}
this._Parent.Entity = value;
if ((value != null))
{
value.Exemptions.Add(this);
this._ParentKey = value.ParentKey;
}
else
{
this._ParentKey = default(Nullable<int>);
}
this.SendPropertyChanged("Parent");
}
}
}
Лучше присваивать изменения через ассоциацию вместо ключа. Тем путем Вы не должны волноваться о том, загружается ли родитель.
Вы хотите, чтобы связаться с другой записью в table1 или изменить table1.id? если это - опция 1, необходимо удалить ту ассоциацию и установить новую. Если опция 2, проверьте Вас дб и посмотрите, располагает ли обновление каскадом да, включил для этого fk и, чем становятся рекордными и значение изменения идентификатора.
Table1: Table2:
ID ID
Name Description
ForeignID
При этом:
Table2.ForeignID = 2
вы получаете сообщение об ошибке ..........
Пример:
Вы можете изменить ForeignID поле в Таблице 2 с этим:
Table2 table = dataContext.Table2.single(d => d.ID == Id)
table.Table1 = dataContext.Table1.single(d => d.ID == newId);
Где переменная newId
является идентификатором записи в Таблице 2, которую вы хотите связать с записью в Таблице 1