我正在编写一个算法,该算法将首先获取各种端点的配置文件及其相关方法,如下所示:
/guest guestEndpoint
/guest/lists listEndpoint
/guest/friends guestFriendsEndpoint
/guest/X/friends guetFriendsEndpoint
/guest/X/friends/X guestFriendsEndpoint
/X/guest guestEndpoint
/X/lists listEndpoint
/options optionsEndpoint
X
这里代表一个通配符,因此任何字符串都与此匹配。
算法将此作为输入并构建一个树,每个节点代表/
之间的一个标记。每个叶子都是有效的端点。
然后,当用户传入类似guest/abc/friends
的内容时,它将从根开始遍历树,然后查找连接到根的guest
节点,如果存在则转到节点{{1如果guest
此处的访客将拥有guest
个节点,那么如果wildcard
与任何abc
的节点都不匹配,但有{ {1}}节点出现它将转到guest
。然后从wildcard
看它是否有一个wildcard
节点,如果有的话去那里。然后,如果wildcard
是叶节点,它将返回相应的方法。
这种算法有意义吗?我想知道查找的运行时是什么。我认为它是O(n),其中n是传入的参数中的令牌数。
这是我将根据上面的输入构建的图形的图像。每个菱形表示端点方法。
感谢您的帮助!
答案 0 :(得分:2)
最差查找时间为O(E + N),其中E为数字,如果边和N为节点数。因为我们不知道每个级别有多少个节点。因此,通过算法,您可以通过执行级别搜索找到所需序列中的第一个节点,因为您没有任何参数可以检查是否需要通过所需的路径。 (我知道每次下降一级时节点的数量会减少,但在这种情况下有多少节点不确定) 它甚至不是n阵列。
Wild Card无法帮助减少最坏情况下的时间复杂度,并且无法知道树的最佳情况。通配符检查需要一段时间,并且在运行时不会计算。
现在算法看起来有点混乱,当你有两个选项时你会做什么
1)你有自然匹配的节点 2)你有通配卡节点。
在同一水平上,你会去哪里? 假设你先遇到你的方向。但是,如果它不是您在最后一个节点知道的实际路径,那么您可以回溯它。为避免这种情况,您将在BFS上保留每个级别的可用路径数,并进行搜索。 因此,如果处理完所有情况,最坏情况时间复杂度将为O(E + N)。