2017-09-17 2 views
1

キーとインデックスの両方のインデックスにアクセスできます。SparseIntArrayから取得したいと考えています。SparseIntArray参照パフォーマンス

これは、get(key)またはvalueAt(index)のいずれかの値を取得できることを意味します。

私は後者がO(1)の複雑さだと思っていますが、わかりません。get(key)の複雑さについてはわかりません。

どちらが速いのですか?ドキュメントから

答えて

3

のは、どちらの実装のソースコードをチェックアウトしてみましょう、あなたの質問に答えるために:

のget(キー)

/** 
* Gets the int mapped from the specified key, or <code>0</code> 
* if no such mapping has been made. 
*/ 
public int get(int key) { 
    return get(key, 0); 
} 

/** 
* Gets the int mapped from the specified key, or the specified value 
* if no such mapping has been made. 
*/ 
public int get(int key, int valueIfKeyNotFound) { 
    int i = ContainerHelpers.binarySearch(mKeys, mSize, key); 

    if (i < 0) { 
     return valueIfKeyNotFound; 
    } else { 
     return mValues[i]; 
    } 
} 

valueAt(インデックス):

/** 
* Given an index in the range <code>0...size()-1</code>, returns 
* the value from the <code>index</code>th key-value mapping that this 
* SparseIntArray stores. 
* 
* <p>The values corresponding to indices in ascending order are guaranteed 
* to be associated with keys in ascending order, e.g., 
* <code>valueAt(0)</code> will return the value associated with the 
* smallest key and <code>valueAt(size()-1)</code> will return the value 
* associated with the largest key.</p> 
*/ 
public int valueAt(int index) { 
    return mValues[index]; 
} 

get()関数は、まずキーを検索し、値を返しますeをキーとして返しますが、valueAt()関数は指定されたインデックスの値を直接返します。

したがって、明らかにvalueAt()get()よりも速いです。

1

valueAt()メソッド:

public int valueAt(int index) { 
     return mValues[index]; 
    } 

get()メソッド:

public int get(int key) { 
     return get(key, 0); 
    } 

    public int get(int key, int valueIfKeyNotFound) { 
     int i = ContainerHelpers.binarySearch(mKeys, mSize, key); 

     if (i < 0) { 
      return valueIfKeyNotFound; 
     } else { 
      return mValues[i]; 
     } 
    } 

あなたは上記の方法をが速くを見ることができるようにメソッドはvalueAt(key)ですが、安全ではありません。それはIndexOutOfBoundExceptionを生成するかもしれません。しかし、get(key)メソッドは、そうしたインデックスが見つからなければ0を返します。