Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中用于精确和近似查找的多个键_C_Database_Data Structures_Distributed Computing - Fatal编程技术网

C语言中用于精确和近似查找的多个键

C语言中用于精确和近似查找的多个键,c,database,data-structures,distributed-computing,C,Database,Data Structures,Distributed Computing,我正在尝试用C语言开发一个网络资源管理器组件,它通过TCP/UDP套接字跟踪各种网络元素。为此,我使用了三个值: 硬件位置号 服务组号码 节点号 规则是,网络上的任何两个元素都不能具有这三个数字的相同集合。因此,每个位置的标识在网络上都是唯一的。该信息需要以某种方式保存在程序中(非持久性),以便在给定任何参数(可能只是一个数字,或任意两个或所有三个的组合),程序通过执行快速搜索返回合格的候选对象 添加和删除也应该是有效的,但是考虑到在初始瞬态阶段之后,如果插入或删除比搜索慢一点,那么应该可以。使

我正在尝试用C语言开发一个网络资源管理器组件,它通过TCP/UDP套接字跟踪各种网络元素。为此,我使用了三个值:

  • 硬件位置号
  • 服务组号码
  • 节点号
  • 规则是,网络上的任何两个元素都不能具有这三个数字的相同集合。因此,每个位置的标识在网络上都是唯一的。该信息需要以某种方式保存在程序中(非持久性),以便在给定任何参数(可能只是一个数字,或任意两个或所有三个的组合),程序通过执行快速搜索返回合格的候选对象

    添加和删除也应该是有效的,但是考虑到在初始瞬态阶段之后,如果插入或删除比搜索慢一点,那么应该可以。使用树木是一种选择,但“使用哪一种”的答案仍然让我难以回答(我不知道有多少,但我期待着学习新的树木,如果它们符合我的目的的话)

    要做到这一点,我可以分别维护三个不同的树,它们具有指向内存中相同结构的相似节点,但我觉得这样做效率低,而且不紧凑。我正在寻找一个统一的数据集,它可以像处理多个键一样处理这些变化

    或者我可以有一个带有多个键的AVL树(如果允许的话)

    网络中的元素数量是动态的,因此无法选择使用三维阵列

    一位朋友也建议进行哈希运算,但我不太确定


    请帮忙。

    对于这个问题,哈希似乎是一个愚蠢的选择。也许最重要的原因是您似乎对近似查找感兴趣。散列您的值可能意味着遍历整个集合以查找具有公共前缀或类似前缀的一组节点

    PATRICIA通常用于路由表中,它使自己非常易于搜索具有相似密钥的项。注意,我发现了很多关于PATRICIA Trys的误导性信息,这是我写过的。我发现它特别有用

    与AVL树类似,您需要将三个键组合成一个键(最好不使用散列)


    如果我们从分布式系统的角度来看它,比如p2p网络,DHT在那里被广泛使用,那么是什么让哈希在那里更具吸引力,而不是在这种情况下?我对数据库及其设计不太精通,因此我很好奇。:-)@Anshul你如何在PATRICIA trie中查找近似匹配?检索值的方法与检索值的方法相同,只是在向下树的过程中还要测试编辑距离。DHTs仅支持精确匹配查找!这是因为它们是哈希表。如何在DHT中查找近似匹配?您必须遍历表中的每个散列,在整个过程中根据存储的键测试编辑距离,或者构造可能的近似匹配的散列,并在DHT中查找其中一个。这两种方法都相当残忍,并且没有非常好的最坏情况。Patricia树可以在密钥的顺序是分层的情况下处理近似查找。比方说,我将我的层次结构修改为HardwareNumber.ServiceGroup.NodeNumber和Patricia,如果我要求它查找硬件编号(比如4)上的所有服务,它们就可以正常工作。但是,如果我说搜索在硬件4上运行的所有节点,而不管它们属于哪个服务编号,这会起作用吗?我的意思是,它可以工作,但这会有效率吗?
    unsigned int key[3] = { hardware_location_number, service_group_number, node_number };
               /* ^------- Use something like this as your key */