大きな(50k-100k)文字列のセットmystrings
があります。 mystrings
の文字列の一部は、他の文字列の正確な部分文字列である可能性があります。これらを破棄したい(部分文字列を破棄し、最長の文字列のみを残したい)。今私はO(N^2)
の複雑さを持つ素朴な方法を使用しています。文字列の部分文字列を見つける
unique_strings = set()
for s in sorted(mystrings, key=len, reverse=True):
keep = True
for us in unique_strings:
if s in us:
keep = False
break
if keep:
unique_strings.add(s)
このタスクを容易にし、O(N^2)
操作を必要としないデータ構造またはアルゴリズムはどれですか。ライブラリは大丈夫ですが、私は純粋なPythonを保つ必要があります。
その他のPython、 'keep'ブール値を破棄し、代わりに' for'ループに 'else'節を使用します(時間複雑度はもちろん変わりません)http://python-notes.curiousefficiency.org/ja/最新/ python_concepts/break_else.html –
@Chris_Randsデモンストレーションできますか?一度一致が見つかると、内部forループを繰り返す理由はありません。したがって、中断します。しかし、いったん内部ループから抜けると、一致が見つかったか、ちょうど反復が終了したために私たちが勃発したかどうかはわかりません。たぶん私は何かが欠けているかもしれませんが、これはこの(まったく素朴な)アプローチを実装する最も簡潔で実用的な方法だと思います。 –
あなたは 'break'を保ち、' if keep: 'を' else: '(同じ字下げ)に置き換え、' keep'ですべての行を削除します。 'else'節は' break'が発生しないときにのみ実行されます。あなたがfor-else構造に慣れていないなら、上にリンクした記事を読んでください。 –