我想实现双向查找表。 MAC地址 - > MAC地址
表示一个密钥可用于访问上游端的值。在下游,该值可用于访问密钥。
内存是一个约束因此我不能使用两个哈希表,我期待使用哈希表的相同节点进行上游和下游查找。
运行时也是一个约束,因此只有哈希表策略才有效。
语言是一个约束所以我只能使用C语言(所以不能使用C ++ Boost bimap)
请分享您如何实现这一目标的想法。提前谢谢。
答案 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 ...
同时以upstream
和downstream
布局,配对的MAC地址顺序相同。
现在要查找配对的MAC地址,只需使用strcmp()
或类似命令检查单个阵列中的每个MAC地址。找到密钥后,补充数组中的相同索引就是值。
为什么这样?它几乎不需要辅助内存,而且它的缓存效率非常高。
答案 2 :(得分:0)
此外,您可以将两个头指针阵列合并为一个。它只会使链更长,代码更短。 必须从链表中检索节点的代码部分必须检查mac1 []或mac2 []字段之一,(忽略另一个)