我们的应用程序运行在需要对传入数据进行快速响应的低功耗处理器上。数据带有相关密钥。每个密钥的范围为0 - 0xFE(最大0xFF)。数据本身的大小从1kB到4kB不等。系统处理如下数据:
data in
key lookup -> insert key & data if not found
buffer data in existing key
在某些事件之后,密钥和相关数据被破坏。
我们正在尝试一些解决方案:
预分配std::vector<std::pair<int,unsigned char *>>
,根据索引位置查找键值。
std::map<int, unsigned char *>
红黑树
std::vector<...>
使用二进制排序和密钥的二进制搜索
还有其他算法可以快速插入 - 搜索 - 删除吗?
感谢。
答案 0 :(得分:2)
std::map
使用平衡树(如红黑树)本身,因此重新实现它没有意义。
具有二分搜索的已排序std::vector
具有与平衡二叉树相同的性能。不同之处在于将钥匙放在矢量中间是很昂贵的。
由于您的按键范围非常有限,因此您的最佳选择与您的第一个建议类似:
std::vector<unsigned char *> data(0xFF); // no need to have a pair
这样,只需检查data[key] == NULL
即可显示此密钥的数据是否存在。如果是我,我甚至会更简单:
unsigned char *data[0xFF];
答案 1 :(得分: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
}
请注意,我使用空字符串表示数据不存在。