练习 24:URL 快速路由

原文:Exercise 24: Fast URL Search

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

我们将结束数据结构和算法的部分,并将数据结构用于实际问题。我已经写了几个 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和你搜索的内容里面。
    • 在不同情况下只寻找部分路径
    • 完全不存在的路径
  • 存在和不存在的非常长的路径
  • 一旦你让这个子类工作,并测试完毕,推广你的测试,所以你可以在所有打算完成的实现中运行它。
  • 然后,尝试使用DoubleLinkedListBSTreeDictionary和 Python 的dict来实现。确保你的泛用测试适用于所有这些。
  • 一旦完成了,开始分析这些实现的不同操作的性能。

目标是看看与其他数据结构相比,TSTree有多快。它可能会击败大多数东西,但也许 Python dict多数情况会赢,因为它针对 Python 进行了优化。你甚至可以为每个操作猜测,哪个数据结构具有最佳性能。

研究性学习

  • 我省略了SuffixArray,因为它类似于TSTree,但为了使用它,你必须添加相同的操作。实现它,然后看看SuffixArray如何比较。
  • 研究你最喜欢的 Web 服务器或 Web 框架是如何实现的。你会发现很多使用 URL 人不知道什么是三叉搜索树,尽管它对于常见操作非常有用。

深入学习

如果你想深入了解算法和数据结构,我强烈推荐 Steven S. Skiena 的《The Algorithm Design Manual》一书。他的书使用 C,所以你可能需要先阅读《笨办法学 C》,以便能够浏览它。除此之外,它是一本很好的书,因为它涵盖了分析算法和数据结构的性能的理论和实现。

笨办法学 Python · 续 练习 24:URL 快速路由相关推荐

  1. 笨办法学 Python · 续 中文版

    笨办法学 Python · 续 中文版 原书:Learn More Python 3 The Hard Way 译者:飞龙 自豪地采用谷歌翻译 在线阅读 PDF格式 EPUB格式 MOBI格式 代码仓 ...

  2. 笨办法学 Python · 续 练习 33:解析器

    练习 33:解析器 原文:Exercise 33: Parsers 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 想象一下,你将获得一个巨大的数字列表,你必须将其输入到电子表格 ...

  3. 笨办法学 Python · 续 练习 0:起步

    练习 0:起步 原文:Exercise 0: The Setup 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 你需要设置和配置一些工具来学习此书.有可能你已经有了很多这些东西 ...

  4. 笨办法学 Python · 续 第二部分:简单的黑魔法

    第二部分:简单的黑魔法 原文:Part II: Quick Hacks 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 你有最好的想法,你会打动世界!你会成为一个亿万富豪!你的大 ...

  5. 笨办法学 Python · 续 练习 52:`moreweb`

    练习 52:moreweb 原文:Exercise 52: moreweb 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 现在,你已经使用 Python http.server ...

  6. 笨办法学 Python · 续 练习 51:`lessweb`

    练习 51:lessweb 原文:Exercise 51: lessweb 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 我们很接近这本书的末尾了,所以在最后两个练习中我将给你 ...

  7. 笨办法学 Python · 续 练习 32:扫描器

    练习 32:扫描器 原文:Exercise 32: Scanners 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 我的第一本书在练习 48 中非常偶然涉及到了扫描器,但现在我 ...

  8. python描述器 有限状态机_笨办法学 Python · 续 练习 30:有限状态机

    练习 30:有限状态机 每当你阅读一本关于解析的书,都有一个可怕的章节,关于有限状态机(FSM).他们对"边"和"节点"进行了详细的分析,每个可能的" ...

  9. 笨办法学 Python · 续 第三部分:数据结构

    第三部分:数据结构 原文:Part III: Data Structures 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 你正在以你的方式构建个人流程,它让你以有限的阻碍快速 ...

最新文章

  1. 利用CSS定位背景图片
  2. 征战蓝桥 —— 2014年第五届 —— C/C++A组第10题——波动数列
  3. Mac系统下安装PIL
  4. Sql Server函数全解二数学函数
  5. VSS Get Latest Version 没有提示recursive的对话框解决
  6. 怎么在同一页中分页_分库分表业界难题,跨库分页的几种常见方案
  7. ad 卡尔曼_卡尔曼滤波算法C语言实现(转2)
  8. Android ActionBar高级自定义——设置标题居中和添加控件
  9. GDI+中发生一般性错误 以及发布时候需要配置的文件
  10. DICOM标准(2011)
  11. PHPer的水平区分 (转)
  12. cmd windows 命令sleep_最实在的9个黑客命令!确定不学习下?
  13. java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅
  14. grafana的前端技术_Grafana开发环境搭建
  15. python numba_如何用numba加速python?
  16. 【C++笔记】对象模型和this指针
  17. solr集群solrCloud的搭建
  18. Filter Concatenationd的理解
  19. wordpress不登陆后台禁用插件
  20. 杭电Oj刷题(2009)

热门文章

  1. leetcode二叉树 找路径_LeetCode0257: 二叉树的所有路径
  2. endnote x9使用方法_一文掌握 Endnote 核心功能使用方法
  3. 什么是分布式_什么是分布式系统,如何学习分布式系统?
  4. 13. GD32F103C8T6入门教程-定时器-3路pwm输出-刹车死区保护
  5. RTT学习笔记4-线程同步
  6. 计算机内存只认4,为什么电脑的8GB内存只有7.45GB可用?
  7. 【STM32】高级定时器、通用定时器和基本定时器---配置寄存器产生PWM
  8. Linux GPIO
  9. 《消息队列》函数讲解
  10. 简单php web ftp服务器,php 上传文件到ftp服务器的简单示例(单文件)