# 练习 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》,以便能够浏览它。除此之外,它是一本很好的书,因为它涵盖了分析算法和数据结构的性能的理论和实现。
- 笨办法学 Python · 续 中文版
- 引言
- 第一部分:预备知识
- 练习 0:起步
- 练习 1:流程
- 练习 2:创造力
- 练习 3:质量
- 第二部分:简单的黑魔法
- 练习 4:处理命令行参数
- 练习 5:cat
- 练习 6:find
- 练习 7:grep
- 练习 8:cut
- 练习 9:sed
- 练习 10:sort
- 练习 11:uniq
- 练习 12:复习
- 第三部分:数据结构
- 练习 13:单链表
- 练习 14:双链表
- 练习 15:栈和队列
- 练习 16:冒泡、快速和归并排序
- 练习 17:字典
- 练习 18:性能测量
- 练习 19:改善性能
- 练习 20:二叉搜索树
- 练习 21:二分搜索
- 练习 22:后缀数组
- 练习 23:三叉搜索树
- 练习 24:URL 快速路由
- 第四部分:进阶项目
- 练习 25:xargs
- 练习 26:hexdump
- 练习 27:tr
- 练习 28:sh
- 练习 29:diff和patch
- 第五部分:文本解析
- 练习 30:有限状态机
- 练习 31:正则表达式
- 练习 32:扫描器
- 练习 33:解析器
- 练习 34:分析器
- 练习 35:解释器
- 练习 36:简单的计算器
- 练习 37:小型 BASIC
- 第六部分:SQL 和对象关系映射
- 练习 38:SQL 简介
- 练习 39:SQL 创建
- 练习 40:SQL 读取
- 练习 41:SQL 更新
- 练习 42:SQL 删除
- 练习 43:SQL 管理
- 练习 44:使用 Python 的数据库 API
- 练习 45:创建 ORM
- 第七部分:大作业
- 练习 46:blog
- 练习 47:bc
- 练习 48:ed
- 练习 49:sed
- 练习 50:vi
- 练习 51:lessweb
- 练习 52:moreweb