【问题标题】:Fast search-insert-delete algorithm for low power processor低功耗处理器的快速搜索插入删除算法
【发布时间】:2012-03-29 16:16:12
【问题描述】:

我们有一个在低功耗处理器上运行的应用程序,它需要对传入数据进行快速响应。数据带有关联的键。每个键的范围为 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<...> 对键的进行二分排序和二分查找

还有其他算法可以快速插入-搜索-删除吗?

谢谢。

【问题讨论】:

  • 您是要为单个键创建重复项,还是使用现有键的新数据替换旧数据?
  • 由于您谈论的是低功耗处理器上的非常小的数据集(1 字节密钥),因此您绝对应该忽略传统算法性能和算法的大 O 表示法。请记住,所有这些仅适用于数据集向无穷大增长的情况。小型套装的实际性能不遵循这些模式。执行 1) 或 2) 并分析性能
  • @Mark - 单个键,新数据针对该键缓冲
  • @TJD - 感谢大 O 评论。从来没有这么想过。

标签: c++ search sorting vector map


【解决方案1】:

std::map 本身使用平衡树(如红黑树),因此没有必要重新实现它。

带有二叉搜索的已排序std::vector 具有与平衡二叉树相同的性能。不同之处在于,在向量中间放置一个键的成本很高。

由于您的密钥范围非常有限,因此您的最佳选择类似于您的第一个建议:

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

这样,对data[key] == NULL 的简单检查就会显示此键的数据是否存在。如果是我,我什至会更简单:

unsigned char *data[0xFF];

【讨论】:

  • 为什么一定要动态分配数组?我会选择unsigned char *data[0xff]
  • @MarkRansom,哎呀,我是说那个!没有被动态分配是我首先将它从向量更改为数组的原因之一!
  • @Shahbaz - 谢谢 - 低技术的 C 方式完全被遗忘了 :) 我想我已经把这一切复杂化了......
【解决方案2】:

如果密钥在[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
}

请注意,我使用空字符串表示数据不存在。

【讨论】:

  • 如何将数据元素与键关联?
  • @user626201:查看我的更新答案。如果您有任何疑问,请告诉我。
  • 使用lut[key].empty() 比比较空字符串更直接。
  • @Nawaz - 谢谢 - 二进制数据不是字符串,std::string 不会丢弃这些字节吗?
  • 没有足够多的人意识到stringvector&lt;char&gt; 可以很好地替代char*。使用string 的缺点是赋值在第一个空字符处停止,对于二进制数据不是一个好的选择; vector&lt;char&gt; 不接受 char* 分配并强制您正确初始化它。
猜你喜欢
  • 2021-01-24
  • 2011-03-31
  • 1970-01-01
  • 2014-11-05
  • 2021-09-22
  • 2017-07-17
  • 2013-12-16
  • 1970-01-01
  • 2019-03-04
相关资源
最近更新 更多