С O(1)
dequeue()
, что совпадает с ответом pythonquick :
// time: O(n), space: O(n)
enqueue(x):
if stack.isEmpty():
stack.push(x)
return
temp = stack.pop()
enqueue(x)
stack.push(temp)
// time: O(1)
x dequeue():
return stack.pop()
С O(1)
enqueue()
(это не упоминается в этом посте, так что ответ), который также использует возврат, чтобы всплыть и вернуть самый нижний элемент.
// O(1)
enqueue(x):
stack.push(x)
// time: O(n), space: O(n)
x dequeue():
temp = stack.pop()
if stack.isEmpty():
x = temp
else:
x = dequeue()
stack.push(temp)
return x
Очевидно, это хорошее упражнение по кодированию, так как оно неэффективно, но, тем не менее, элегантно.
Используйте оператор INTERSECT
.
Это NULL
-чувствительный и эффективный, если у вас есть составной индекс для всех ваших полей:
IF EXISTS
(
SELECT MY_FIELD1, MY_FIELD2, MY_FIELD3, MY_FIELD4, MY_FIELD5, MY_FIELD6
FROM MY_TABLE
INTERSECT
SELECT @IN_MY_FIELD1, @IN_MY_FIELD2, @IN_MY_FIELD3, @IN_MY_FIELD4, @IN_MY_FIELD5, @IN_MY_FIELD6
)
BEGIN
goto on_duplicate
END
Примечание что если вы создадите индекс UNIQUE
для своих полей, ваша жизнь станет намного проще.
Вы проверяли NULLIF? http://msdn.microsoft.com/en-us/library/ms177562.aspx
Вам нужно будет использовать IS NULL или ISNULL. Вокруг этого действительно нет никого.
Вы создаете первичный ключ для своих полей и позволяете механизму обеспечивать уникальность. Выполнение логики IF EXISTS в любом случае неверно, так как не соответствует условиям гонки.
Вы можете объединить каждое значение, но это немного раздражает:
IF EXISTS(SELECT * FROM MY_TABLE WHERE
coalesce(MY_FIELD1,'MF1') = coalesce(@IN_MY_FIELD1,'MF1') AND
...
BEGIN
goto on_duplicate
END
Вам также необходимо убедиться, что значение объединенное
не является допустимым в противном случае. в рассматриваемом столбце. Например, если бы было возможно, что значение MY_FIELD1 могло быть «MF1», это вызвало бы множество ложных совпадений.
IF EXISTS(SELECT * FROM MY_TABLE WHERE
(MY_FIELD1 = @IN_MY_FIELD1
or (MY_FIELD1 IS NULL and @IN_MY_FIELD1 is NULL)) AND
(MY_FIELD2 = @IN_MY_FIELD2
or (MY_FIELD2 IS NULL and @IN_MY_FIELD2 is NULL)) AND
(MY_FIELD3 = @IN_MY_FIELD3
or (MY_FIELD3 IS NULL and @IN_MY_FIELD3 is NULL)) AND
(MY_FIELD4 = @IN_MY_FIELD4
or (MY_FIELD4 IS NULL and @IN_MY_FIELD4 is NULL)) AND
(MY_FIELD5 = @IN_MY_FIELD5
or (MY_FIELD5 IS NULL and @IN_MY_FIELD5 is NULL)) AND
(MY_FIELD6 = @IN_MY_FIELD6
or (MY_FIELD6 IS NULL and @IN_MY_FIELD6 is NULL)))
BEGIN
goto on_duplicate
END
Многословный По сравнению с решением IFNULL / COALESCE. Но будет работать, не задумываясь о том, какое значение не будет отображаться в данных, которые можно использовать в качестве замены NULL.
Используйте ISNULL
]:
ISNULL(MY_FIELD1, 'NULL') = ISNULL(@IN_MY_FIELD1, 'NULL')
Вы можете изменить 'NULL'
на что-то вроде 'All Values'
, если это имеет больше смысла.
Следует отметить, что с двумя аргументами ISNULL
работает так же, как COALESCE
, который можно использовать, если у вас есть несколько значений для проверки (например, - COALESCE (@ IN_MY_FIELD1, @OtherVal, 'NULL')
). COALESCE
также возвращается после первого ненулевого значения, что означает (незначительно) быстрее, если вы ожидаете, что MY_FIELD1 будет пустым. Однако я считаю ISNULL
гораздо более читаемым, поэтому я и использовал его здесь.