一起做网站女装夏季裙,用手机制作表格的软件,苏州网站建设报价单,wpf入可以做网站吗回顾一下简单查找和二分查找
杂货店商品对应的价格举例#xff1a; 简单查找就是拿出商品价目本#xff0c;这个价目本并不是有序的#xff0c;顾客问苹果多少钱#xff0c;需要一个一个去查找某一个商品的价格#xff0c;需要O(n)时间。 同样是一个价目本#xff0c;但…回顾一下简单查找和二分查找
杂货店商品对应的价格举例 简单查找就是拿出商品价目本这个价目本并不是有序的顾客问苹果多少钱需要一个一个去查找某一个商品的价格需要O(n)时间。 同样是一个价目本但是按商品名称字母排序的这样需要的时候更短为O(logn)。 但这样我还是觉得查找太慢怎么办这时候需要一名能记住所有商品价格的员工这样一问评价价格便知只需要O(1)。
从数据结构的角度来看 你可使用数组来实现记录商品价格的本子的每个元素包含两项内容商品名和价格。 如果将这个数组按商品名排序就可使用二分查找在其中查找商品的价格。这样查找价格的时间将为O(log n)。 然而我希望查找商品价格的时间为O(1)这是散列函数的用武之地。
散列函数
无论你给散列函数什么数据它都还你一个数字专业点说散列函数“将输入映射到数字”
特点
一致的比如输入苹果得到的是4之后的每一次输入苹果最后得到的都是4。不同的输入映射不同的数字。
简单实现商品价目本 准备一个空列表将苹果输入散列函数输出4那么列表的索引4就存苹果价格2.1依次类存。。。行程价目本。 这样我们想知道商品名苹果价格直接把苹果给散列函数输出的就是价目表的索引4位置的价格2.1。
注意 散列函数知道数组有多大只返回有效的索引。如果数组包含5个元素散列函数就不会 返回无效索引100。
散列表
复杂数据结构中散列表可能是最有用的也被称为散列映射、映射、字典和关联数组。散列表的速度很快和数组一样快。 Python提供的散列表实现为字典你可使用函数dict来创建散列表。
散列表的应用
将散列表用于查找 比如电话本 phone_book {}phone_book[小明] 8675309phone_book[火警] 119print phone_book[小明] # 查找jenny的电话比如DNS解析DNS resolution网址映射到ip地址 我想浏览www.baidu.com 需要先进行DNS解析成ip地址192.168.0.0随便写的ip地址然后再进行访问百度服务器。
防止重复 比如投票机制已经投过票的不能再投了
voted {} # 散列表查找元素非常快
def check_voter(name):if voted.get(name):print kick them out!else:voted[name] Trueprint let them vote!如果将已投票者的姓名存储在列表中这个函数的速度终将变得非常慢因为它必须使用简单查找搜索整个列表。
作为缓存 你登录了Facebook你看到的所有内容都是为你定制的。你每次访问facebook.com其服务器都需考虑你感兴趣的是什么内容。但如果你没有登录看到的将是登录页面。每个人看到的登录页面都相同。 Facebook被反复要求做同样的事情“当我注销时请向我显示主页。”有鉴于此它不让服务器去生成主页而是将主页存储起来并在需要时将其直接发送给用户。
用户能够更快地看到网页网站已经记住了用户的访问频次或喜好等行为。Facebook需要做的工作更少。
Facebook不仅缓存主页还缓存About页面、 Contact页面等众多其他的页面。因此它需要将页面URL映射到页面数据。 也就是一个字典中key是urlvalue是网页数据data
cache {}
def get_page(url):if cache.get(url): return cache[url]else:data get_data_from_server(url) # 访问服务器处理并返回数据填充到散列表cache[url] datareturn data仅当URL不在缓存中时你才让服务器做些处理并将处理生成的数据存储到缓存中再返回它。这样当下次有人请求该URL时你就可以直接发送缓存中的数据而不用再让服务器进行处理了。
这里总结一下散列表适合用于
模拟映射关系防止重复缓存/记住数据以免服务器再通过处理来生成它们。
tips本篇文章参考算法图解