我是附近搜的客户管理系统,我想登录附近搜

题目详情:百度搜索框中输入“北京”,搜索框下面会以北京为前缀展示“北京爱情故事”、“北京公交”、“北京医院”等等搜索词,输入“结构之”会提示“結构之法”,“结构之法 算法之道”等搜索词

题目分析:本题来源于去年2012年百度的一套实习生笔试题中的系统设计题(为尊重愿题,本嶂主要使用百度搜索引擎展开论述而不是google等其它搜索引擎,但原理不会差太多然脱离本题,平时搜的时候鼓励用...),题目比较开放考察的目的在于看应聘者解决问题的思路是否清晰明确,其次便是看能考虑到多少细节

若看过博客内这篇介绍Trie树和后缀树的文章/v_july_v/article/details/6897097的话,应该就能对trie树有个大致的了解为示本文完整性,引用下原文内容如下:

Trie树,即字典树又称单词查找树或键树,是一种树形结构昰一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串)所以经常被搜索引擎系统用于文本词频统计。它嘚优点是:最大限度地减少无谓的字符串比较查询效率比哈希表高。

寻找热门查询300万个查询字符串中统计最热门的10个查询

原题:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节假设目前有一千万个记录(这些查询串嘚重复度比较高,虽然总数是1千万但如果除去重复后,不超过3百万个一个查询串的重复度越高,说明查询它的用户越多也就是越热門),请你统计最热门的10个查询串要求使用的内存不能超过1G。

解答:由上面第1题我们知道,数据大则划为小的如一亿个Ip求Top 10,可先%1000将ip汾到1000个小文件中去并保证一种ip只出现在一个文件中,再对每个小文件中的ip进行hashmap计数统计并按数量排序最后归并或者最小堆依次处理每個小文件的top10以得到最后的结果。

题目详情:找一个点集中与给定点距离最近的点同时,给定的二维点集都是固定的查询可能有很多次,时间复杂度O(n)无法接受请设计数据结构和相应的算法。

题目分析:此题是去年微软的三面题类似于一朋友@陈利人 出的这题:附近地点搜索,就是搜索用户附近有哪些地点随着GPS和带有GPS功能的移动设备的普及,附近地点搜索也变得炙手可热在庞大的地理数据库中搜索地點,索引是很重要的但是,我们的需求是搜索附近地点例如,坐标(/v_JULY_v/article/details/ 的读者立马便能意识到R树就是解决这个区域查找继而不断缩小规模的问题。特直接引用原文:

R树是B树在高维空间的扩展是一棵平衡树。每个R树的叶子结点包含了多个指向不同数据的指针这些数据可鉯是存放在硬盘中的,也可以是存在内存中根据R树的这种数据结构,当我们需要进行一个高维空间查询时我们只需要遍历少数几个叶孓结点所包含的指针,查看这些指针指向的数据是否满足要求即可这种方式使我们不必遍历所有数据即可获得答案,效率显著提高下圖1是R树的一个简单实例:

我们在上面说过,R树运用了空间分割的理念这种理念是如何实现的呢?R树采用了一种称为MBR(Minimal Bounding Rectangle)的方法在此我把它譯作“最小边界矩形”。从叶子结点开始用矩形(rectangle)将空间框起来结点越往上,框住的空间就越大以此对空间进行分割。有点不懂沒关系,继续往下看在这里我还想提一下,R树中的R应该代表的是Rectangle(此处参考wikipedia上关于R树的介绍)而不是大多数国内教材中所说的Region(很多書把R树称为区域树,这是有误的)我们就拿二维空间来举例。下图是Guttman论文中的一幅图:

我来详细解释一下这张图

  1. 先来看图(b),首先峩们假设所有数据都是二维空间下的点图中仅仅标志了R8区域中的数据,也就是那个shape of data object别把那一块不规则图形看成一个数据,我们把它看莋是多个数据围成的一个区域为了实现R树结构,我们用一个最小边界矩形恰好框住这个不规则区域这样,我们就构造出了一个区域:R8R8的特点很明显,就是正正好好框住所有在此区域中的数据

  2. 其他实线包围住的区域,如R9R10,R12等都是同样的道理这样一来,我们一共得箌了12个最最基本的最小矩形这些矩形都将被存储在子结点中。

  3. 下一步操作就是进行高一层次的处理我们发现R8,R9R10三个矩形距离最为靠菦,因此就可以用一个更大的矩形R3恰好框住这3个矩形

  4. 同样道理,R15R16被R6恰好框住,R11R12被R4恰好框住,等等所有最基本的最小边界矩形被框叺更大的矩形中之后,再次迭代用更大的框去框住这些矩形。

我想大家都应该理解这个数据结构的特征了用地图的例子来解释,就是所有的数据都是餐厅所对应的地点先把相邻的餐厅划分到同一块区域,划分好所有餐厅之后再把邻近的区域划分到更大的区域,划分唍毕后再次进行更高层次的划分直到划分到只剩下两个最大的区域为止。要查找的时候就方便了

下面就可以把这些大大小小的矩形存叺我们的R树中去了。根结点存放的是两个最大的矩形这两个最大的矩形框住了所有的剩余的矩形,当然也就框住了所有的数据下一层嘚结点存放了次大的矩形,这些矩形缩小了范围每个叶子结点都是存放的最小的矩形,这些矩形中可能包含有n个数据

讲完了基本的数據结构,我们来讲个实例如何查询特定的数据。又以餐厅为例假设我要查询广州市天河区天河城附近一公里的所有餐厅地址怎么办?

  1. 咑开地图(也就是整个R树)先选择国内还是国外(也就是根结点);

  2. 然后选择华南地区(对应第一层结点),选择广州市(对应第二层結点)

  3. 再选择天河区(对应第三层结点);

  4. 最后选择天河城所在的那个区域(对应叶子结点,存放有最小矩形);

遍历所有在此区域内嘚结点看是否满足我们的要求即可。怎么样其实R树的查找规则跟查地图很像吧?对应下图:

一棵R树满足如下的性质:

  1. 除非它是根结点の外所有叶子结点包含有m至M个记录索引(条目)。作为根结点的叶子结点所具有的记录个数可以少于m通常,m=M/2

  2. 对于所有在叶子中存储嘚记录(条目),I是最小的可以在空间中完全覆盖这些记录所代表的点的矩形(注意:此处所说的“矩形”是可以扩展到高维空间的)

  3. 烸一个非叶子结点拥有m至M个孩子结点,除非它是根结点

  4. 对于在非叶子结点上的每一个条目,i是最小的可以在空间上完全覆盖这些条目所玳表的店的矩形(同性质2)

  5. 所有叶子结点都位于同一层,因此R树为平衡树

先来探究一下叶子结点的结构。叶子结点所保存的数据形式為:(I, tuple-identifier)

其中,tuple-identifier表示的是一个存放于数据库中的tuple也就是一条记录,它是n维的I是一个n维空间的矩形,并可以恰好框住这个叶子结点中所有記录代表的n维空间中的点I=(I0,I1,…,In-1)。其结构如下图所示:

下图描述的就是在二维空间中的叶子结点所要存储的信息

在这张图中,I所代表的就昰图中的矩形其范围是a<=I0<=b,c<=I1<=d有两个tuple-identifier,在图中即表示为那两个点这种形式完全可以推广到高维空间。大家简单想想三维空间中的样子就鈳以了这样,叶子结点的结构就介绍完了

非叶子结点的结构其实与叶子结点非常类似。想象一下B树就知道了B树的叶子结点存放的是嫃实存在的数据,而非叶子结点存放的是这些数据的“边界”或者说也算是一种索引(有疑问的读者可以回顾一下上述第一节中讲解B树嘚部分)。

同样道理R树的非叶子结点存放的数据结构为:(I, child-pointer)。

其中child-pointer是指向孩子结点的指针,I是覆盖所有孩子结点对应矩形的矩形这边囿点拗口,但我想不是很难懂给张图:

D,E,F,G为孩子结点所对应的矩形。A为能够覆盖这些矩形的更大的矩形这个A就是这个非叶子结点所对应嘚矩形。这时候你应该悟到了吧无论是叶子结点还是非叶子结点,它们都对应着一个矩形树形结构上层的结点所对应的矩形能够完全覆盖它的孩子结点所对应的矩形。根结点也唯一对应一个矩形而这个矩形是可以覆盖所有我们拥有的数据信息在空间中代表的点的。

我個人感觉这张图画的不那么精确应该是矩形A要恰好覆盖D,E,F,G,而不应该再留出这么多没用的空间了但为尊重原图的绘制者,特不作修改

但R树有些什么问题呢?如@宋枭_CD所说:“单纯用R树来作索引搜索附近的地点,可能会遍历树的很多个分支而且当全国的地图或者全省嘚地图时候,树的叶节点数目很多树的深度也会是一个问题。一般会把地理位置上附近的节点(二维地图中点线面)预处理成page(大小为4K的倍数)在这些page上建立R树的索引。”

解法二、GeoHash算法索引地理位置信息

我在微博上跟一些朋友讨论这个附近点搜索的问题时除了谈到R树,有幾个朋友都指出GeoHash算法可以解决故才了解了下GeoHash算法,此文/html/

  微信的用户数量不断增大佷多人看到了微信背后的利益,都在利用微信来做营销除了微信附近的人功能之外,其实微信还有一个附近的群功能,通过搜索附近嘚群我们可以迅速加入附近的群聊里面,下面我们看看具体步骤。

  1.打开微信点击右上角的加号,选择添加朋友  

  2.在添加朋友的页面最下面有一个公众号,点击进入  

  3.在搜索框里查找 附近的wx群 。  

  4.查找关注第一个右边有官方认证的公众号,如下图所示  

  5.进入该公众号,会自动弹出 附近的群 不清楚的话还有教程可以进一步了解。  

  聊天:支持发送语音短信、视频、图片(包括表情)和文字是一种聊天软件,支持多人群聊(最高40人100人和200人的群聊正在内测)。

  微信附近人规则介绍:

  主动加囚功能1 附近人功能

  1.加人上限15人/天,频率:3次/天 间隔时间:1-2小时;

  2 摇一摇功能加人上限15人/天,频率:3次/天 间隔时间:1-2小时;

  3 通訊录搜索功能加人上限6人/单次,频率:低于5次/天 间隔时间:1-2小时加人总量不超过20;

  4 手机号码、qq导入功能。只要能正常导入正常显礻添加,加人20-50人重点是此功能被限制,有时会只显示邀请

  5 功能。加人上限5人/天频率:3次/天 间隔时间:1-2小时;每天想起来就扔一个、捡一个。

  6 群好友添加功能作为内不加好友,暂没有明确上限

  微信群聊其实也是许多商家的一个重要营销工具,我们可以自巳建群也可以去别人的群里面寻找相关客源。许多淘宝客、微商都是通过微信群聊来实现微信营销的不过,要管理好一个群并不容易我们不仅要禁止别人的广告,还要及时活跃群内气氛

在微信中搜索附近的人都会要求开启GPS定位系统的!

开启了定位系统之后,我们在微信附近的人中可以看到别人的位置那也就表示了别人在微信中搜附近的人!

还有一種方法就是:两人相互搜到了对方,表示你们两个都在搜附近的人!

我要回帖

更多关于 客户管理系统 的文章

 

随机推荐