2016-12-21 6 views
0

リストに追加してカスタムコンパレータで並べ替えるカスタムオブジェクトがあります。次に、これらのオブジェクトのいくつかのサブセットの2番目のリストを持っています。最初のリストのインデックスが必要です(私のコンパレータで定義されたものと同じオブジェクトを見つけることができます)。リストがソートされるとき、これらのオブジェクトはこのオブジェクトの直前または直後のオブジェクトでなければなりませんが、どれくらい同じ(おそらく2〜3)になるかは事前にわかりません。ソートされたリストのインデックスを一定時間で見つけよう

ソートされたオブジェクトのリストがかなり大きいので、一定の時間内にこのルックアップが必要です。私は明らかにlist.index()を使うことができますが、それはO(N)になります。私はもっとうまくいくと思います。私の最初の考えは、二重にリンクされたリストを使用することでしたが、それを自分で実装する必要があるように見えます。

Pythonで二重リンクされたリストの実装はありますか?または、この問題のより良い代替手段がありますか?また、私は現在Python2.5を使用していますので、私のバージョンを更新することはできませんが、私のバージョンが限られていても、私はまだその解決策について聞いています。追加のO(N)のストレージの価格については

+3

私は、( 'range'のような)計算を可能にする別のプロパティがないと、一定の時間はできないと思います。しかし、 'O(log n)'で十分なら '[bisect'](https://docs.python.org/2/library/bisect.html)を使うことができます。 – MSeifert

+0

私は並べ替えの後にO(N)の設定を行うと、一定の時間の参照を得ることが可能でなければならないと思います。少なくとも私はリストを反復してオブジェクトのインデックスを各オブジェクトに追加することができました。オブジェクトのインデックスは、オブジェクトを2番目のリストから取り出すときに参照することができます。 このソリューションは、リストの実装でこれを処理する方法があるはずだと思っているので、ちょっとハックしたようですが、うまくいくと思います。 – Fozefy

+2

追加のO(N)ストレージの代償として、ソートされたリストのリストインデックスをバックアップするための辞書を作成することができます: 'dict((e、i)for(i、e)in enumerateこれにより、2番目のリストの項目の位置をO(1)で検索できます。 – wildwilhelm

答えて

1

、あなたがソートされたリストのリストインデックスをバックアップする辞書を作成することができます:

index_map = dict((e,i) for (i,e) in enumerate(sorted_list)) 

これはあなたの位置のためのO(1)参照を与えるだろうあなたの2番目のリストの項目。

sorted_listの要素がカスタムオブジェクトである場合、@mseifertが指摘するように、このアプローチは、__eq__が正しく定義され、ハッシュ可能であるオブジェクトに依存します。

関連する問題