设计问题:在C中实现双向查找表

时间:2011-08-18 18:40:03

标签: c algorithm

我想实现双向查找表。 MAC地址 - > MAC地址

表示一个密钥可用于访问上游端的值。在下游,该值可用于访问密钥。

内存是一个约束因此我不能使用两个哈希表,我期待使用哈希表的相同节点进行上游和下游查找。

运行时也是一个约束,因此只有哈希表策略才有效。

语言是一个约束所以我只能使用C语言(所以不能使用C ++ Boost bimap)

请分享您如何实现这一目标的想法。提前谢谢。

3 个答案:

答案 0 :(得分:4)

如您所知,您可以为上游和下游存储桶使用相同的节点。它不会为你节省很多钱(肯定不到2倍),但任何事都有帮助。

struct bucket {
  struct bucket *next_upstream;
  struct bucket *next_downstream;
  char upstream_mac[6];
  char downstream_mac[6];
}
struct bucket **upstream_table = malloc(sizeof(struct bucket*) * N);
struct bucket **downstream_table = malloc(sizeof(struct bucket*) * N);
void insert(char *upstream_mac, char *downstream_mac) {
  struct bucket *b = malloc(sizeof(*b));
  memcpy(b->upstream_mac, upstream_mac, 6);
  memcpy(b->downstream_mac, downstream_mac, 6);
  int uh = hash(upstream_mac);
  int dh = hash(downstream_mac);
  b->next_upstream = upstream_table[uh];
  upstream_table[uh] = b;
  b->next_downstream = downstream_table[dh];
  downstream_tbale[dh] = b;
}

答案 1 :(得分:1)

你能使用两个并行数组吗?即,

// assuming no reallocation required
#define BUFFERSIZE some-gigantic-number
char upstream[BUFFERSIZE];
char downstream[BUFFERSIZE];

然后将每个MAC地址列表布局为连续字符。例如:

upstream:

"01:23:45:67:89:ab\000:0d:93:81:d9:7c\0..."
 |_______________|  |_______________|
         |                  |
   first address      second address   ...

downstream:

"00:0a:95:d1:52:30\001:45:c3:2d:65:b5\0..."
 |_______________|  |_______________|
         |                  |
   first address      second address   ...

同时以upstreamdownstream布局,配对的MAC地址顺序相同。

现在要查找配对的MAC地址,只需使用strcmp()或类似命令检查单个阵列中的每个MAC地址。找到密钥后,补充数组中的相同索引就是值。

为什么这样?它几乎不需要辅助内存,而且它的缓存效率非常高。

答案 2 :(得分:0)

此外,您可以将两个头指针阵列合并为一个。它只会使链更长,代码更短。 必须从链表中检索节点的代码部分必须检查mac1 []或mac2 []字段之一,(忽略另一个)