大きなサイズの整数のlist
が入力として与えられています。 リスト内の項目がすべて異なるかどうかをチェックする関数を記述したいと思います。リストに重複が含まれているかどうかを調べる最も効率的な方法
アプローチ1:これまでに遭遇したすべてのアイテムをリストに反復し、set
を使用して追跡します。重複が発生するとすぐにTrue
を返します。
def containsDuplicates1(a):
seen = set()
for i in a:
if i in seen:
return True
seen.add(i)
return False
時間複雑度:O(N)
空間複雑:O(N)
アプローチ2:set
にリスト全体を変換し、その長さを比較します。
def containsDuplicates2(a):
return len(a) != len(set(a))
時間複雑度:O(N)(set(a)
動作用)
空間複雑:与えられたリストに含まれている可能性があるときにO(N)
最初のアプローチは、第二のアプローチよりも良好に機能します重複します。
これが最善の方法ですか?あるいは、この問題を解決するために、時間と空間のどちらかに効率的な方法がありますか?
P.S:スタックオーバーフローに関するすべての関連する質問を読みましたが、どれも問題の効率性の側面について議論していません。したがって、私はここにそれを求めました。
この文脈で「パフォーマンスが良い」とは何ですか? –
いいえ、大きなOの点では、最悪の場合にリスト全体をトラバースする必要があります(重複はありません)。 –
@ReblochonMasqueは「パフォーマンスが向上します」とは、最初のアプローチがスピードとスペース。 –