【问题标题】:What is the runtime of my algorithm?我的算法的运行时间是多少?
【发布时间】:2017-12-28 17:02:30
【问题描述】:

我正在编写一个算法,它将首先获取各种端点的配置文件及其相关方法,如下所示:

/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节点,如果存在则转到节点guest,如果@987654329 @ 这里的客人会有一个wildcard 节点,所以如果abcguest 的任何节点都不匹配,但存在wildcard 节点,它将转到wildcard。然后它会从wildcard 看它是否有一个friends 节点,如果有就去那里。那么如果friends是一个叶子节点就会返回对应的方法。

这个算法有意义吗?我想知道查找的运行时间是什么。我想这将是 O(n),其中 n 是传入的参数中的令牌数。

这是我将根据上面的输入构建的图表的图像。每个菱形代表一个端点方法。

感谢您的帮助!

【问题讨论】:

  • 所以这里的通配符是指我们在纸牌游戏中使用的小丑?通配符的值可以与任何东西匹配。对吗?
  • @user5250644 正确
  • 好吧,我仍然对你的树感到困惑。可以发一张树的图片供参考吗?
  • 我同意 usersomething 你能添加更多细节到它的外观和其他相关的东西
  • 您在问题的 3 个不同位置提到了 3 种不同的算法,您想要哪个运行时间?是向上看吗?那么请随时提供您的树详细信息。

标签: algorithm tree binary-search-tree trie prefix-tree


【解决方案1】:

最坏的查找时间将是 O(E+N),其中 E 是边数,N 是节点数。因为我们不知道每个级别有多少个节点。因此,通过您的算法,您可以通过执行级别搜索找到所需序列中的第一个节点,因为您没有任何参数来检查通过所需路径。 (我知道每次我下降一级时节点的数量都会减少,但在这种情况下有多少是不确定的) 它甚至不是 n 数组。

通配符无助于降低最坏情况的时间复杂度,并且不确定是否知道树的最佳情况。通配符检查需要恒定的时间,并且不会计入运行时间。

现在算法看起来有点混乱,当你有两个选择时你会做什么

1) 你有自然匹配的节点 2)你有通配符节点。

在同一层,你会去哪里? 假设你我们先去你遇到的方向。但是,如果它不是您在最后一个节点知道的实际路径,那么您回溯它怎么办。为避免这种情况,您将通过 BFS 标记每个级别的可用路径数并进行搜索。 因此,如果您处理了所有情况,最坏情况的时间复杂度将是 O(E+N)。

【讨论】:

  • 嗯,好的,谢谢。我确实需要查找时间取决于输入字符串中传递的令牌#。关于我可以使用哪种算法来实现这一目标的任何想法?也许根本不使用树。我认为这个实现将足够接近尝试以具有相同的运行时间。我知道尝试适用于前缀查找类型的情况,这基本上是我所拥有的,除了不是前缀而是整个单词。
  • @zulusam 寻找一种叫做“n-gram”的东西。它不会完全解决您的问题,但会帮助您解决问题。
猜你喜欢
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多