💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 练习 24:URL 快速路由 > 原文:[Exercise 24: Fast URL Search](https://learncodethehardway.org/more-python-book/ex24.html) > 译者:[飞龙](https://github.com/wizardforcel) > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) > 自豪地采用[谷歌翻译](https://translate.google.cn/) 我们将结束数据结构和算法的部分,并将数据结构用于实际问题。我已经写了几个 Web 服务器,一个不断出现的问题是,将 URL 路径匹配到“动作”。你会在每个 Web 框架,Web 服务器,和必须基于层次化的键来“路由”信息的任何东西中发现此问题。当你的 Web 服务器收到URL `/do/this/stuff/`时,必须确定每个部分是否可能附加了某种操作或配置。如果你在`/do/`配置了 Web 应用程序,那么你的网络服务器应该使用`/this/stuff/`做什么呢?是否认为它是失败的,或将其传递给 Web 应用程序?如果`/do/this/`中有一个目录怎么办?而且,如何快速检测到错误的 URL,因此你不必处理不存在的巨大请求? 这种层次化的搜索经常出现,这是对你将算法和数据结构应用于问题的能力,以及性能分析能力进行测试的最佳测试。 ## 挑战练习 首先,请确定你了解 URL 是什么以及如何使用。如果没有,那么我建议你花时间去写一个带有一些复杂路由的小型 Flask 应用程序。这是你将要实现的路由。 接下来,你应该执行以下操作: + 创建一个简单的基本的`URLRouter`类,你将为所有实现派生它。你应该可以对此`URLRouter`执行以下操作: + 添加一个带有关联对象的新 URL。 + 获取 URL 的完全匹配。搜索`/DO/THIS/STUFF/`只返回正好是它的东西。 + 获取 URL 的最佳匹配。搜索`/DO/THIS/STUFF/`将匹配`/DO/`,如果这是唯一的匹配。 + 获取以此 URL 开头的所有对象。 + 获取 URL 的最短匹配对象。搜索`/DO/THIS/STUFF/`会返回`/DO/`而不是`/DO/THIS/`。 + 获取 URL 的最长匹配对象。搜索`/DO/THIS/STUFF/`将返回`/DO/THIS/`而不是`/DO/`。 + 使用`TSTree `创建`URLRouter `的子类,因为这样最容易了。确保测试了下面这些事情: + 不同长度的随机 URL 和路径,在`TSTREE`和你搜索的内容里面。 + 在不同情况下只寻找部分路径 + 完全不存在的路径 + 存在和不存在的非常长的路径 + 一旦你让这个子类工作,并测试完毕,推广你的测试,所以你可以在所有打算完成的实现中运行它。 + 然后,尝试使用`DoubleLinkedList`,`BSTree`,`Dictionary`和 Python 的`dict`来实现。确保你的泛用测试适用于所有这些。 + 一旦完成了,开始分析这些实现的不同操作的性能。 目标是看看与其他数据结构相比,`TSTree`有多快。它可能会击败大多数东西,但也许 Python `dict`多数情况会赢,因为它针对 Python 进行了优化。你甚至可以为每个操作猜测,哪个数据结构具有最佳性能。 ## 研究性学习 + 我省略了`SuffixArray`,因为它类似于`TSTree`,但为了使用它,你必须添加相同的操作。实现它,然后看看`SuffixArray`如何比较。 + 研究你最喜欢的 Web 服务器或 Web 框架是如何实现的。你会发现很多使用 URL 人不知道什么是三叉搜索树,尽管它对于常见操作非常有用。 ## 深入学习 如果你想深入了解算法和数据结构,我强烈推荐 Steven S. Skiena 的[《The Algorithm Design Manual》](http://amzn.to/2qIA3ai)一书。他的书使用 C,所以你可能需要先阅读《笨办法学 C》,以便能够浏览它。除此之外,它是一本很好的书,因为它涵盖了分析算法和数据结构的性能的理论和实现。