![]() |
1
15
大多数树数据结构使用某种排序算法来存储和查找键。许多这样的实现都可以找到一个接近您使用的密钥的密匙(通常是最接近的下面或最接近的上面)。例如Java的
如果你能计算距离(它并不总是容易的),Java的接口只需要你知道任何给定的键是“低于”或“以上”任何其他给定的键,那么你可以要求最上面和最下面的两个,然后计算自己哪一个更近。 |
![]() |
2
6
你的数据的维度是什么?如果它只是一维的,一个排序的数组会做到这一点——二进制搜索会找到精确的匹配和/或揭示你的搜索键位于哪两个键之间——一个简单的测试会告诉你哪个更接近。 如果您不仅需要查找最近的键,还需要查找关联的值,请维护一个排序相同的值数组-键数组中检索到的键的索引是值数组中值的索引。 当然,有 许多的 其他方法-使用哪种方法取决于许多其他因素,例如内存消耗、是否需要插入值、如果控制插入顺序、删除、线程问题等… |
![]() |
3
3
BK-trees 做你想做的。这里有一个 good article 关于实现它们。 下面是一个scala实现:
我承认这件事有些肮脏和丑陋,而且插入算法太聪明了。而且,它只能在很短的距离内工作,否则您将重复搜索树。下面是一个更好的替代实现:
|
![]() |
4
2
用C++和STL容器(
输出:
假设
哪里
和
|
![]() |
5
0
您可以将类似这样的东西实现为树。一种简单的方法是为树中的每个节点分配一个位串。树的每个级别都存储为一个位。所有父信息都编码在节点的位字符串中。然后,您可以轻松地定位任意节点,并查找父节点和子节点。这就是为什么 Morton ordering 例如,工作。它还有一个额外的优点,即您可以通过简单的二进制减法来计算节点之间的距离。 如果数据值之间有多个链接,那么数据结构是一个图而不是树。在这种情况下,您需要一个稍微复杂一点的索引系统。 Distributed hash tables 做这种事。它们通常有一种方法来计算索引空间中任意两个节点之间的距离。例如, Kademlia 算法(由BitTorrent使用)使用应用于位串ID的异或距离。这允许BitTorrent客户机在一个链中查找ID,并在未知的目标位置聚合。可以使用类似的方法查找最接近目标节点的节点。 |
![]() |
6
0
如果您的键是字符串,并且您的相似性函数是 Levenshtein distance ,然后您可以使用 finite-state machines : 你的地图是 trie 构建为有限状态机(通过联合所有键/值对并确定)。然后,用一个简单的有限状态传感器编写输入查询,该传感器对Levenshtein距离进行编码,然后用trie编写输入查询。然后,使用 Viterbi algorithm 提取最短路径。 您可以使用 finite-state toolkit . |
![]() |
7
0
在scala中,这是一种我用来查找与您要查找的键最近的int<=的技术。
|
![]() |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
![]() |
Manny · 如何比较Perl中的字符串? 2 年前 |
![]() |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
![]() |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |