開始時刻と終了時刻の2つの変数を含む「スレッド」のリストがあると、ある時刻tに実行中のすべてのスレッドを返す関数を実装します。それを最適化する。 異なる間隔内の共通点を見つける
マイ溶液がリストを反復することであった(O(N)よりも速い) - (N)Oです。誰もがO(n)より速く達成する方法を知っていますか?
class MyThread{
Thread thread;
long start;
long end;
}//the object in the list
//function to find "threads"
public List<Thread> matchingInterval(List<MyThread> list) {
List<Thread> found = new ArrayList<Thread>();
Set<Thread> runningThreads = Thread.getAllStackTraces().keySet();
long instant = System.currentTimeMillis();
for(MyThread el: list)
if(el.start <= instant && el.end >= instant && runningThreads.contains(el.thread))
found.add(el.thread);
return found;
}
EDIT:
目標は、私のソリューションは、time t
は(プラス/マイナスのエラー)私の関数が呼び出され、それゆえ私のlong instant = System.currentTimeMillis();
は、発信者は、いくつかの任意の指定していること、それは可能です時間であることを前提としていreturn all running threads at some time t.
にあります時間?はいの場合、私はその質問がスレッドそのものとはまったく関係ないことを観察し、実際にはrunningThreads
を取得する必要はありません。
別のポイント:スレッドが生きているという理由だけで、実行中ですか?
さて、スレッドが実行中かどうか、つまりO(n)を確認する必要があります。これが少し速くなる唯一の方法は、リストが開始時刻に従って事前ソートされている場合です。次に、開始時刻がちょうど 't'に等しいスレッドのバイナリサーチを実行できます。 – noMAD
リストがソートされているとは言わなかった。 – kasavbere
リストをあらかじめソートしておいて償却することを考えました:リストがあらかじめソートされているので、関数へのすべてのコールは事前ソートされたリストを見つけ、バイナリ検索を使用してO(2 * lg n) – kasavbere