根据值干净地访问结构数组

标签 c arrays data-structures embedded

我正在尝试创建一个结构数组,其中为每个加入网络的设备和运行程序的设备创建一个条目。应使用感兴趣设备的网络地址访问此数组。

示例:网络上有三个(其他)设备,地址分别为 0x1、0x2 和 0x3(我们在 0x0 上运行)。现在我们要访问与设备0x1相关的数据结构,假设是Table[0]。问题是将地址 (0x1) 与索引 (0) 相关联。

注意:网络地址由软件的其他部分动态分配,在我的控制之下。它们也保证是连续的。

最干净的方法是什么?

对我来说最直观的方法是搜索整个表,将每个条目的Address字段与特定地址(在示例中为0x1)进行比较,然后返回索引,但我想知道是否有更合适的方法来执行此常见操作。顺便说一句,它可能有一个专有名称(动态数据结构?)。

最佳答案

1) 快速、简单且肮脏的方法。如果地址是小数字,您可以简单地制作一个查找表,例如:

const struct_ptr* TABLE[n] =
{
  NULL,
  &struct_this,
  &struct_that,
  NULL,
  ...
};

其中索引对应一个地址。如果地址有相应的结构,你得到一个指向该结构的指针,否则为 NULL。

这是最快的方法,它可以直接访问 O(1)。但它会浪费一点数据内存,而且如果您的地址可以是任何类型的数字,则不太可行。

2) 排序查找表和二分查找。如果地址是任何类型的数字,请使用它。在这种情况下,您将不得不制作一个仅包含指向现有结构的指针的查找表,例如:

const struct_ptr* TABLE [NUMBER_OF_EXISTING_STRUCTS] = 
{
  &struct_this,
  &struct_that,
  ...
};

每个结构都需要有一个成员 address 并且它们必须以排序的方式添加到上面的查找表中,最低地址在前。然后您可以对表进行二进制搜索,使用比较每个结构 address 成员的比较函数。这相当快,O(log n)

3) 哈希表。 最先进的替代方法。这最适合具有大量数据的系统,并且还可以处理重复项。访问时间几乎是确定性的,接近于 O(log n),但不完全是。取决于您如何实现“链接”等。

关于根据值干净地访问结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27122376/

相关文章:

C 平衡括号检查器

php 使用数组作为数组的索引

arrays - Codeigniter 将数组插入数据库

java - 根据预定义的规则集将输入集分类为类别

algorithm - 完全正确

c - memcpy 使用本地指针指向全局数据

c - 我动态分配的结构体指针数组有什么问题?

c - 获取 X11 中当前事件修改器的状态

arrays - 在 Swift 3 中扩展类型化数组(基本类型如 Bool)?

c - C 中的 Trie 树上的段错误和 Valgrind 未堆叠地址错误