1
0
mirror of https://github.com/apachecn/lmpythw-zh.git synced 2025-05-28 12:02:19 +00:00
lmpythw-zh/ex24.md
wizardforcel 933d9947ba ex24
2017-08-10 11:28:00 +08:00

48 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 练习 24URL 快速路由
> 原文:[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》以便能够浏览它。除此之外它是一本很好的书因为它涵盖了分析算法和数据结构的性能的理论和实现。