0

私がすでに行っているよりも良い方法があるかどうかはわかりません。現在、0に等しい10,000を超える値を持つlist(int [])があり、ゼロ以外のアイテムのみを探しています。

私の現在のアプローチは、 for ループを実行してゼロ以外のすべてをキャプチャすることですが、これを頻繁に実行し、プロファイリングにより、大量の CPU 時間がかかることが示されます (これを頻繁に実行しているため)。高価な cpu プロセスなしで同じ結果を得る方法はありますか (10,000 個のアイテムのうち、100 個未満が非ゼロになるため)。

これが私のデータの例です:

int[] list = {0,0,0,1,0,10 }
int[] list_names = {a,b,c,d,e,f}

最終的に必要なのは、これら 2 つのリストを使用して、ゼロ以外の値とその名前 (D=1 と F=10) のみを含む別の 2 つのリストを作成することだけです。機能する前に結果を並べ替える必要があるいくつかのソリューションを見てきましたが、データリストを並べ替えるとその名前を特定できないため、これは問題です。

これは可能ですか? for ループに比べて高速な方法はありますか?

申し訳ありませんが、この大きなリストは処理のために私のプログラムに残っており、それらのメモリフットプリントを削減するためにこれを実行しようとしています. 本当に必要なのはゼロ以外の値だけである場合、これらのリストの数億のキューが完全に格納されているため、これを実行してメモリを節約します(これは機能しているようです)が、そうしないようにしていますその時点に到達するには、CPUに少しヒットします(処理にCPUが必要なため)。

4

6 に答える 6

3

配列について他に何も知らない場合は、すべての値を調べる必要があります。つまり、配列全体をループすることが、基本的に期待できる最善の方法です。ソートされている場合、またはそれに関する他の情報を知っている場合は、それが役立つかもしれませんが、そうでない場合は、代替手段はありません.

于 2012-04-12T01:28:28.617 に答える
1

非ゼロを簡単に見つけることができるように、リストを事前にソートすることは可能ですか? アイデアは、一度または新しいデータを挿入するときに事前にソートすることです。そのため、取得はすでにソートされており、簡単です。

編集:

次に、テーブルのハッシュ コードを使用します。ハッシュ コードが変更されていない場合は、リスト/テーブルを検索する必要はありません。

于 2012-04-12T01:26:28.160 に答える
1

書くよりも読む頻度が高い場合は、検索結果をキャッシュできます。ゼロ以外の項目のリストを作成し、次の書き込みまで保持します。

値がゼロではない元の配列にすべてのインデックスのセットを保持することもできます。リスト内の値をゼロに変更するたびに、その値のインデックスをセットから削除します。値をゼロ以外に設定するたびに、そのインデックスをセットに追加します。このようにして、ゼロ以外のエントリを検索する代わりに、既知のインデックスのセットから単純に収穫します。

于 2012-04-12T01:28:28.160 に答える
1

得られるのがソートされていない整数の配列だけである場合、すべての要素を調べずにこれを行うことは文字通り不可能です。

また、並べ替え自体は O(n) よりも悪いため、並べ替えは役に立たないことに注意してください。

後でこれらの配列を何らかの方法で操作する場合は、操作できるスパース表現 (インデックスから値へのマップなど) を生成するのが理にかなっています。


詳細を知らずに何ができるかを言うのは難しいですが、複数のスレッドで作業を行うことで速度を上げる機会があるのではないでしょうか?

于 2012-04-12T01:34:33.527 に答える
1

ゼロ以外の値を見つけた位置を覚えておいてください。インデックスと値をそれぞれ別の配列に格納します。

そう0, 2, 0, 1, 0, 7なる

int[] list_index = {1,3,5}
int[] list_value = {2,1,7}

list_index次に、 の値をインデックスとして配列に反復処理しnames、対応する を格納しlist_valueます。

于 2012-04-12T01:36:01.823 に答える
1

List<Integer>ゼロおよびゼロ以外の値を持つ大きな値を持つ代わりにList<Integer>、カウンターの配列を保持します。このリストには、数値が配置された回数のみが含まれます。

public class MyList {

    private final int MAX_SIZE = 1001;
    private int[] myList;
    private int size;

    public MyList() {
        this.size= MAX_SIZE;
        this.myList = new int[size];
    }

    public MyList(int maxSize) {
        this.size = maxSize;
        this.myList = new int[size];
    }

    public boolean add(int e) {
        if (e < 0 || (e > size - 1))
            return false;
        this.myList[e]++;
        return true;
    }

    public void remove(int e) {
        if (e < 0 || (e > size - 1))
            return;
        if (this.myList[e] > 0)
            this.myList[e]--;
    }

    public int getTimes(int number) {
        if (number < 0 || (number > size - 1))
            return 0;
        return this.myList[number];
    }
}
于 2012-04-12T01:42:09.283 に答える