2012-03-29 3 views
0

受信データへの高速応答が必要な低消費電力プロセッサで動作するアプリケーションがあります。データには、関連するキーが付属しています。各キーの範囲は0〜0xFE(最大0xFF)です。データ自体のサイズは1kBから4kBです。システムは次のようなデータを処理します。低消費電力プロセッサ用の高速検索 - 挿入 - 削除アルゴリズム

data in 
key lookup -> insert key & data if not found 
buffer data in existing key 

何らかのイベントが発生した後、キーと関連するデータは破棄されます。

私たちは、ソリューションのカップル試用されています

  1. 事前に割り当てられたstd::vector<std::pair<int,unsigned char *>>、インデックス位置に基づいて、キー値を検索します。バイナリ・ソートとのバイナリ検索と

  2. std::map<int, unsigned char *>

  3. 赤黒木

  4. std::vector<...>キーの

インサートで速い可能性があり、他のアルゴリズムがあります検索 - 削除?

ありがとうございました。

+0

単一のキーに重複があるか、既存のキーを持つ新しいデータが古いデータを置き換えますか? –

+0

低消費電力プロセッサでは非常に小さなデータセット(1バイトのキー)を扱っているので、アルゴリズムの従来のアルゴリズムパフォーマンスと大きなO表記については考慮しないでください。データセットが無限に近づくにつれて、そのすべてが当てはまります。小さなセットの実用的なパフォーマンスは、それらのパターンに従いません。 Do 1)または2)を実行し、パフォーマンスをプロファイルしてください。 – TJD

+0

@マーク - シングルキー、新しいデータがそのキーに対してバッファされます – user626201

答えて

1

キーが範囲[0, 0xFF)である場合は、この使用することができます:私はデータが存在しないことを示すために、空の文字列を使用

std::vector<std::string> lut(0xFF); //lookup table 

//insert 
lut[key] = data; //insert data at position 'key' 

//delete 
lut[key].clear(); //clear - it means data empty 

//search 
if(lut[key].empty())  //empty string means no key, no data! 
{ 
    //key not found 
} 
else 
{ 
    std::string & data = lut[key]; //found 
} 

注意を。

+0

データ要素をキーにどのように関連づけますか? – user626201

+0

@ user626201:最新の回答をご覧ください。もしあなたが疑問があれば教えてください。 – Nawaz

+0

'lut [key] .empty()'を使うのは、空の文字列と比較するよりも直接的です。 –

2

std::mapは、バランスのとれたツリー(赤黒の木のような)自体を使用しているため、再実装する必要はありません。

バイナリ検索でソートされたstd::vectorは、バランスのとれたバイナリツリーと同じパフォーマンスを持ちます。違いは、キーの中央にキーを配置するのはコストがかかることです。

あなたの鍵は非常に限られた範囲を持っているので、あなたの最良の選択は、あなたの最初の提案のようになります。

std::vector<unsigned char *> data(0xFF); // no need to have a pair 

この方法で、data[key] == NULLの簡単なチェックは、このキーのデータが存在するかどうかを示します。それが私の場合は、さらにシンプルにすることもできます:

unsigned char *data[0xFF]; 
+0

アレイを動的に割り当てる必要があるのはなぜですか?私は 'unsigned char * data [0xff]'に行きます。 –

+0

@ MarkRansom、Oops、私はそれを意味しました!動的に割り当てられていないのは、最初にベクトルから配列に変更した理由の1つでした。 – Shahbaz

+0

@Shahbaz - ありがとう - ローテクのCの方法は完全に忘れてしまった:)私はすべてを複雑にしていたと思う... – user626201

関連する問題