我正在尝试在C中开发一个网络资源管理器组件,它通过TCP / UDP套接字跟踪各种网络元素。为此,我使用了三个值:
规则是网络上没有两个元素可能具有这三个数字的相同集合。因此,每个位置的标识在网络上都是唯一的。这些信息需要以某种方式保存在程序中(非持久性),以便给定任何参数(可以只是一个数字,或任何两个或所有三个的组合),程序返回符合条件的候选者执行快速搜索。
添加和删除也应该是有效的,但是如果它们比搜索慢一点,那么在初始瞬态阶段之后几乎没有插入或删除,它应该没问题。使用树木是一种选择,但答案是“使用哪一种?”仍然没有找到我(不是我知道很多,但我很期待学习更新的,如果它们符合我的目的)。
要做到这一点,我可以分别维护三个不同的树,类似的节点指向内存中的相同结构,但我觉得效率低且不紧凑。我正在寻找一个统一的数据集,可以处理这些变化,如多个键。
或者我可以拥有一个包含多个密钥的AVL树(如果允许的话)。
网络中的元素数量是动态的,因此使用3D数组是不可能的。
一位朋友还建议哈希,但我不太确定。
请帮忙。
答案 0 :(得分:1)
哈希似乎是一个愚蠢的选择。也许最重要的原因是您似乎对近似查找感兴趣。散列您的值可能意味着遍历整个集合以查找具有公共前缀或类似前缀的一组节点。
PATRICIA通常用于路由表,并使其自身非常适合搜索具有相似键的项目。请注意,我发现了很多关于PATRICIA尝试的误导性信息,我写过here。我发现this resource特别有帮助。
与AVL树类似,您需要将三个键组合成一个(不带哈希,最好是)。
unsigned int key[3] = { hardware_location_number, service_group_number, node_number };
/* ^------- Use something like this as your key */